Changeset View
Changeset View
Standalone View
Standalone View
sys/powerpc/include/pte.h
Show First 20 Lines • Show All 289 Lines • ▼ Show 20 Lines | |||||
#ifdef __powerpc64__ | #ifdef __powerpc64__ | ||||
#include <machine/tlb.h> | #include <machine/tlb.h> | ||||
/* | /* | ||||
* The virtual address is: | * The virtual address is: | ||||
* | * | ||||
* 4K page size | * 4K page size | ||||
* +-----+-----+-----+-------+-------------+-------------+----------------+ | * +-----+-----------+-------+-------------+-------------+----------------+ | ||||
* | - |p2d#h| - | p2d#l | dir# | pte# | off in 4K page | | * | - | pg_root |pdir_l1| dir# | pte# | off in 4K page | | ||||
* +-----+-----+-----+-------+-------------+-------------+----------------+ | * +-----+-----------+-------+-------------+-------------+----------------+ | ||||
* 63 62 61 60 59 40 39 30 29 ^ 21 20 ^ 12 11 0 | * 63 52 51 39 38 30 29 ^ 21 20 ^ 12 11 0 | ||||
* | | | * | | | ||||
* index in 1 page of pointers | * index in 1 page of pointers | ||||
* | * | ||||
* 1st level - pointers to page table directory (pp2d) | * 1st level - Root page table | ||||
* | * | ||||
* pp2d consists of PP2D_NENTRIES entries, each being a pointer to | * pp2d consists of PG_ROOT_NENTRIES entries, each being a pointer to | ||||
* second level entity, i.e. the page table directory (pdir). | * second level entity, i.e. the page table directory (pdir). | ||||
*/ | */ | ||||
#define PP2D_H_H 61 | #define PG_ROOT_H 51 | ||||
#define PP2D_H_L 60 | #define PG_ROOT_L 39 | ||||
#define PP2D_L_H 39 | #define PG_ROOT_SIZE (1UL << PG_ROOT_L) /* va range mapped by pp2d */ | ||||
#define PP2D_L_L 30 /* >30 would work with no page table pool */ | #define PG_ROOT_SHIFT PG_ROOT_L | ||||
#define PP2D_SIZE (1 << PP2D_L_L) /* va range mapped by pp2d */ | #define PG_ROOT_NUM (PG_ROOT_H - PG_ROOT_L + 1) | ||||
#define PP2D_L_SHIFT PP2D_L_L | #define PG_ROOT_MASK ((1 << PG_ROOT_NUM) - 1) | ||||
#define PP2D_L_NUM (PP2D_L_H-PP2D_L_L+1) | #define PG_ROOT_IDX(va) ((va >> PG_ROOT_SHIFT) & PG_ROOT_MASK) | ||||
#define PP2D_L_MASK ((1<<PP2D_L_NUM)-1) | #define PG_ROOT_NENTRIES (1 << PG_ROOT_NUM) | ||||
#define PP2D_H_SHIFT (PP2D_H_L-PP2D_L_NUM) | #define PG_ROOT_ENTRY_SHIFT 3 /* log2 (sizeof(struct pte_entry **)) */ | ||||
#define PP2D_H_NUM (PP2D_H_H-PP2D_H_L+1) | |||||
#define PP2D_H_MASK (((1<<PP2D_H_NUM)-1)<<PP2D_L_NUM) | |||||
#define PP2D_IDX(va) (((va >> PP2D_H_SHIFT) & PP2D_H_MASK) | ((va >> PP2D_L_SHIFT) & PP2D_L_MASK)) | |||||
#define PP2D_NENTRIES (1<<(PP2D_L_NUM+PP2D_H_NUM)) | |||||
#define PP2D_ENTRY_SHIFT 3 /* log2 (sizeof(struct pte_entry **)) */ | |||||
/* | /* | ||||
* 2nd level - page table directory (pdir) | * 2nd level - page directory directory (pdir l1) | ||||
* | * | ||||
* pdir consists of PDIR_NENTRIES entries, each being a pointer to | * pdir consists of PDIR_NENTRIES entries, each being a pointer to | ||||
* second level entity, i.e. the actual page table (ptbl). | * second level entity, i.e. the actual page table (ptbl). | ||||
*/ | */ | ||||
#define PDIR_H (PP2D_L_L-1) | #define PDIR_L1_H (PG_ROOT_L-1) | ||||
#define PDIR_L1_L 30 | |||||
#define PDIR_L1_NUM (PDIR_L1_H-PDIR_L1_L+1) | |||||
#define PDIR_L1_SIZE (1 << PDIR_L1_L) /* va range mapped by pdir */ | |||||
#define PDIR_L1_MASK ((1<<PDIR_L1_NUM)-1) | |||||
#define PDIR_L1_SHIFT PDIR_L1_L | |||||
#define PDIR_L1_NENTRIES (1<<PDIR_L1_NUM) | |||||
#define PDIR_L1_IDX(va) (((va) >> PDIR_L1_SHIFT) & PDIR_L1_MASK) | |||||
#define PDIR_L1_ENTRY_SHIFT 3 /* log2 (sizeof(struct pte_entry *)) */ | |||||
#define PDIR_L1_PAGES ((PDIR_L1_NENTRIES * (1<<PDIR_L1_ENTRY_SHIFT)) / PAGE_SIZE) | |||||
/* | |||||
* 3rd level - page table directory (pdir) | |||||
* | |||||
* pdir consists of PDIR_NENTRIES entries, each being a pointer to | |||||
* second level entity, i.e. the actual page table (ptbl). | |||||
*/ | |||||
#define PDIR_H (PDIR_L1_L-1) | |||||
#define PDIR_L 21 | #define PDIR_L 21 | ||||
#define PDIR_NUM (PDIR_H-PDIR_L+1) | #define PDIR_NUM (PDIR_H-PDIR_L+1) | ||||
#define PDIR_SIZE (1 << PDIR_L) /* va range mapped by pdir */ | #define PDIR_SIZE (1 << PDIR_L) /* va range mapped by pdir */ | ||||
#define PDIR_MASK ((1<<PDIR_NUM)-1) | #define PDIR_MASK ((1<<PDIR_NUM)-1) | ||||
#define PDIR_SHIFT PDIR_L | #define PDIR_SHIFT PDIR_L | ||||
#define PDIR_NENTRIES (1<<PDIR_NUM) | #define PDIR_NENTRIES (1<<PDIR_NUM) | ||||
#define PDIR_IDX(va) (((va) >> PDIR_SHIFT) & PDIR_MASK) | #define PDIR_IDX(va) (((va) >> PDIR_SHIFT) & PDIR_MASK) | ||||
#define PDIR_ENTRY_SHIFT 3 /* log2 (sizeof(struct pte_entry *)) */ | #define PDIR_ENTRY_SHIFT 3 /* log2 (sizeof(struct pte_entry *)) */ | ||||
#define PDIR_PAGES ((PDIR_NENTRIES * (1<<PDIR_ENTRY_SHIFT)) / PAGE_SIZE) | #define PDIR_PAGES ((PDIR_NENTRIES * (1<<PDIR_ENTRY_SHIFT)) / PAGE_SIZE) | ||||
/* | /* | ||||
* 3rd level - page table (ptbl) | * 4th level - page table (ptbl) | ||||
* | * | ||||
* Page table covers PTBL_NENTRIES page table entries. Page | * Page table covers PTBL_NENTRIES page table entries. Page | ||||
* table entry (pte) is 64 bit wide and defines mapping | * table entry (pte) is 64 bit wide and defines mapping | ||||
* for a single page. | * for a single page. | ||||
*/ | */ | ||||
#define PTBL_H (PDIR_L-1) | #define PTBL_H (PDIR_L-1) | ||||
#define PTBL_L PAGE_SHIFT | #define PTBL_L PAGE_SHIFT | ||||
#define PTBL_NUM (PTBL_H-PTBL_L+1) | #define PTBL_NUM (PTBL_H-PTBL_L+1) | ||||
#define PTBL_MASK ((1<<PTBL_NUM)-1) | #define PTBL_MASK ((1<<PTBL_NUM)-1) | ||||
#define PTBL_SHIFT PTBL_L | #define PTBL_SHIFT PTBL_L | ||||
#define PTBL_SIZE PAGE_SIZE /* va range mapped by ptbl entry */ | #define PTBL_SIZE PAGE_SIZE /* va range mapped by ptbl entry */ | ||||
#define PTBL_NENTRIES (1<<PTBL_NUM) | #define PTBL_NENTRIES (1<<PTBL_NUM) | ||||
#define PTBL_IDX(va) ((va >> PTBL_SHIFT) & PTBL_MASK) | #define PTBL_IDX(va) ((va >> PTBL_SHIFT) & PTBL_MASK) | ||||
#define PTBL_ENTRY_SHIFT 3 /* log2 (sizeof (struct pte_entry)) */ | #define PTBL_ENTRY_SHIFT 3 /* log2 (sizeof (struct pte_entry)) */ | ||||
#define PTBL_PAGES ((PTBL_NENTRIES * (1<<PTBL_ENTRY_SHIFT)) / PAGE_SIZE) | #define PTBL_PAGES ((PTBL_NENTRIES * (1<<PTBL_ENTRY_SHIFT)) / PAGE_SIZE) | ||||
#define KERNEL_LINEAR_MAX 0xc000000040000000 | |||||
#else | #else | ||||
/* | /* | ||||
* 1st level - page table directory (pdir) | * 1st level - page table directory (pdir) | ||||
* | * | ||||
* pdir consists of 1024 entries, each being a pointer to | * pdir consists of 1024 entries, each being a pointer to | ||||
* second level entity, i.e. the actual page table (ptbl). | * second level entity, i.e. the actual page table (ptbl). | ||||
*/ | */ | ||||
#define PDIR_SHIFT 22 | #define PDIR_SHIFT 22 | ||||
Show All 30 Lines |