#define PDMASK MASK(PDSHIFT, PDBITS)
/* Offset within a page. */
-static inline unsigned pg_ofs (void *va) { return (uintptr_t) va & PGMASK; }
+static inline unsigned pg_ofs (const void *va) {
+ return (uintptr_t) va & PGMASK;
+}
/* Virtual page number. */
-static inline uintptr_t pg_no (void *va) { return (uintptr_t) va >> PTSHIFT; }
+static inline uintptr_t pg_no (const void *va) {
+ return (uintptr_t) va >> PTSHIFT;
+}
/* Round up to nearest page boundary. */
-static inline void *pg_round_up (void *va) {
+static inline void *pg_round_up (const void *va) {
return (void *) (((uintptr_t) va + PGSIZE - 1) & ~PGMASK);
}
/* Round down to nearest page boundary. */
-static inline void *pg_round_down (void *va) {
+static inline void *pg_round_down (const void *va) {
return (void *) ((uintptr_t) va & ~PGMASK);
}
+/* Base address of the 1:1 physical-to-virtual mapping. Physical
+ memory is mapped starting at this virtual address. Thus,
+ physical address 0 is accessible at PHYS_BASE, physical
+ address address 0x1234 at (uint8_t *) PHYS_BASE + 0x1234, and
+ so on.
+
+ This address also marks the end of user programs' address
+ space. Up to this point in memory, user programs are allowed
+ to map whatever they like. At this point and above, the
+ virtual address space belongs to the kernel. */
#define PHYS_BASE ((void *) LOADER_PHYS_BASE)
/* Returns kernel virtual address at which physical address PADDR
/* Returns physical address at which kernel virtual address VADDR
is mapped. */
static inline uintptr_t
-vtop (void *vaddr)
+vtop (const void *vaddr)
{
ASSERT (vaddr >= PHYS_BASE);
#define PG_D 0x40 /* 1=dirty, 0=not dirty (PTEs only). */
/* Obtains page directory index from a virtual address. */
-static inline uintptr_t pd_no (void *va) { return (uintptr_t) va >> PDSHIFT; }
+static inline uintptr_t pd_no (const void *va) {
+ return (uintptr_t) va >> PDSHIFT;
+}
/* Returns a PDE that points to page table PT. */
static inline uint32_t pde_create (uint32_t *pt) {