Changeset View
Changeset View
Standalone View
Standalone View
sys/riscv/riscv/pmap.c
Show First 20 Lines • Show All 154 Lines • ▼ Show 20 Lines | |||||
#include <vm/vm_dumpset.h> | #include <vm/vm_dumpset.h> | ||||
#include <vm/uma.h> | #include <vm/uma.h> | ||||
#include <machine/machdep.h> | #include <machine/machdep.h> | ||||
#include <machine/md_var.h> | #include <machine/md_var.h> | ||||
#include <machine/pcb.h> | #include <machine/pcb.h> | ||||
#include <machine/sbi.h> | #include <machine/sbi.h> | ||||
#define NUL1E (Ln_ENTRIES * Ln_ENTRIES) | /* | ||||
* Boundary values for the page table page index space: | |||||
* | |||||
* L3 pages: [0, NUL2E) | |||||
* L2 pages: [NUL2E, NUL2E + NUL1E) | |||||
* L1 pages: [NUL2E + NUL1E, NUL2E + NUL1E + NUL0E) | |||||
* | |||||
* Note that these ranges are used in both SV39 and SV48 mode. In SV39 mode the | |||||
* ranges are not fully populated since there are at most Ln_ENTRIES^2 L3 pages | |||||
* in a set of page tables. | |||||
*/ | |||||
#define NUL0E Ln_ENTRIES | |||||
#define NUL1E (Ln_ENTRIES * NUL0E) | |||||
#define NUL2E (Ln_ENTRIES * NUL1E) | #define NUL2E (Ln_ENTRIES * NUL1E) | ||||
#if !defined(DIAGNOSTIC) | #if !defined(DIAGNOSTIC) | ||||
#ifdef __GNUC_GNU_INLINE__ | #ifdef __GNUC_GNU_INLINE__ | ||||
#define PMAP_INLINE __attribute__((__gnu_inline__)) inline | #define PMAP_INLINE __attribute__((__gnu_inline__)) inline | ||||
#else | #else | ||||
#define PMAP_INLINE extern inline | #define PMAP_INLINE extern inline | ||||
#endif | #endif | ||||
#else | #else | ||||
#define PMAP_INLINE | #define PMAP_INLINE | ||||
#endif | #endif | ||||
#ifdef PV_STATS | #ifdef PV_STATS | ||||
#define PV_STAT(x) do { x ; } while (0) | #define PV_STAT(x) do { x ; } while (0) | ||||
#else | #else | ||||
#define PV_STAT(x) do { } while (0) | #define PV_STAT(x) do { } while (0) | ||||
#endif | #endif | ||||
#define pmap_l1_pindex(v) (NUL2E + ((v) >> L1_SHIFT)) | |||||
#define pmap_l2_pindex(v) ((v) >> L2_SHIFT) | #define pmap_l2_pindex(v) ((v) >> L2_SHIFT) | ||||
#define pa_to_pvh(pa) (&pv_table[pa_index(pa)]) | #define pa_to_pvh(pa) (&pv_table[pa_index(pa)]) | ||||
#define NPV_LIST_LOCKS MAXCPU | #define NPV_LIST_LOCKS MAXCPU | ||||
#define PHYS_TO_PV_LIST_LOCK(pa) \ | #define PHYS_TO_PV_LIST_LOCK(pa) \ | ||||
(&pv_list_locks[pmap_l2_pindex(pa) % NPV_LIST_LOCKS]) | (&pv_list_locks[pmap_l2_pindex(pa) % NPV_LIST_LOCKS]) | ||||
Show All 24 Lines | |||||
#define VM_PAGE_TO_PV_LIST_LOCK(m) \ | #define VM_PAGE_TO_PV_LIST_LOCK(m) \ | ||||
PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m)) | PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m)) | ||||
/* The list of all the user pmaps */ | /* The list of all the user pmaps */ | ||||
LIST_HEAD(pmaplist, pmap); | LIST_HEAD(pmaplist, pmap); | ||||
static struct pmaplist allpmaps = LIST_HEAD_INITIALIZER(); | static struct pmaplist allpmaps = LIST_HEAD_INITIALIZER(); | ||||
enum pmap_mode __read_frequently pmap_mode = PMAP_MODE_SV39; | |||||
struct pmap kernel_pmap_store; | struct pmap kernel_pmap_store; | ||||
vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */ | vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */ | ||||
vm_offset_t virtual_end; /* VA of last avail page (end of kernel AS) */ | vm_offset_t virtual_end; /* VA of last avail page (end of kernel AS) */ | ||||
vm_offset_t kernel_vm_end = 0; | vm_offset_t kernel_vm_end = 0; | ||||
vm_paddr_t dmap_phys_base; /* The start of the dmap region */ | vm_paddr_t dmap_phys_base; /* The start of the dmap region */ | ||||
vm_paddr_t dmap_phys_max; /* The limit of the dmap region */ | vm_paddr_t dmap_phys_max; /* The limit of the dmap region */ | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | |||||
static __inline void | static __inline void | ||||
pagezero(void *p) | pagezero(void *p) | ||||
{ | { | ||||
bzero(p, PAGE_SIZE); | bzero(p, PAGE_SIZE); | ||||
} | } | ||||
#define pmap_l0_index(va) (((va) >> L0_SHIFT) & Ln_ADDR_MASK) | |||||
#define pmap_l1_index(va) (((va) >> L1_SHIFT) & Ln_ADDR_MASK) | #define pmap_l1_index(va) (((va) >> L1_SHIFT) & Ln_ADDR_MASK) | ||||
#define pmap_l2_index(va) (((va) >> L2_SHIFT) & Ln_ADDR_MASK) | #define pmap_l2_index(va) (((va) >> L2_SHIFT) & Ln_ADDR_MASK) | ||||
#define pmap_l3_index(va) (((va) >> L3_SHIFT) & Ln_ADDR_MASK) | #define pmap_l3_index(va) (((va) >> L3_SHIFT) & Ln_ADDR_MASK) | ||||
#define PTE_TO_PHYS(pte) \ | #define PTE_TO_PHYS(pte) \ | ||||
((((pte) & ~PTE_HI_MASK) >> PTE_PPN0_S) * PAGE_SIZE) | ((((pte) & ~PTE_HI_MASK) >> PTE_PPN0_S) * PAGE_SIZE) | ||||
#define L2PTE_TO_PHYS(l2) \ | #define L2PTE_TO_PHYS(l2) \ | ||||
((((l2) & ~PTE_HI_MASK) >> PTE_PPN1_S) << L2_SHIFT) | ((((l2) & ~PTE_HI_MASK) >> PTE_PPN1_S) << L2_SHIFT) | ||||
▲ Show 20 Lines • Show All 4,435 Lines • Show Last 20 Lines |