Changeset View
Changeset View
Standalone View
Standalone View
sys/mips/include/pmap.h
Show First 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | |||||
* $FreeBSD$ | * $FreeBSD$ | ||||
*/ | */ | ||||
#ifndef _MACHINE_PMAP_H_ | #ifndef _MACHINE_PMAP_H_ | ||||
#define _MACHINE_PMAP_H_ | #define _MACHINE_PMAP_H_ | ||||
#include <machine/vmparam.h> | #include <machine/vmparam.h> | ||||
#include <machine/pte.h> | #include <machine/pte.h> | ||||
#include <sys/types.h> | |||||
#if defined(__mips_n32) || defined(__mips_n64) /* PHYSADDR_64BIT */ | #if defined(__mips_n32) || defined(__mips_n64) /* PHYSADDR_64BIT */ | ||||
#define NKPT 256 /* mem > 4G, vm_page_startup needs more KPTs */ | #define NKPT 256 /* mem > 4G, vm_page_startup needs more KPTs */ | ||||
#else | #else | ||||
#define NKPT 120 /* actual number of kernel page tables */ | #define NKPT 120 /* actual number of kernel page tables */ | ||||
#endif | #endif | ||||
#ifndef LOCORE | #ifndef LOCORE | ||||
#include <sys/queue.h> | #include <sys/queue.h> | ||||
#include <sys/_cpuset.h> | #include <sys/_cpuset.h> | ||||
#include <sys/_lock.h> | #include <sys/_lock.h> | ||||
#include <sys/_mutex.h> | #include <sys/_mutex.h> | ||||
#ifdef MIPS64_NEW_PMAP | |||||
#include <vm/_vm_radix.h> | |||||
#endif /* MIPS64_NEW_PMAP */ | |||||
/* | /* | ||||
* Pmap stuff | * Pmap stuff | ||||
*/ | */ | ||||
struct pv_entry; | struct pv_entry; | ||||
struct pv_chunk; | struct pv_chunk; | ||||
struct md_page { | struct md_page { | ||||
int pv_flags; | |||||
TAILQ_HEAD(, pv_entry) pv_list; | TAILQ_HEAD(, pv_entry) pv_list; | ||||
vm_memattr_t pv_memattr; | |||||
#ifdef MIPS64_NEW_PMAP | |||||
int pv_gen; | |||||
#else /* ! MIPS64_NEW_PMAP */ | |||||
int pv_flags; | |||||
#endif /* ! MIPS64_NEW_PMAP */ | |||||
}; | }; | ||||
#define PV_TABLE_REF 0x02 /* referenced */ | #define PV_TABLE_REF 0x02 /* referenced */ | ||||
#define PV_MEMATTR_UNCACHEABLE 0x04 | #define PV_MEMATTR_UNCACHEABLE 0x04 | ||||
#define ASID_BITS 8 | #define ASID_BITS 8 | ||||
#define ASIDGEN_BITS (32 - ASID_BITS) | #define ASIDGEN_BITS (32 - ASID_BITS) | ||||
#define ASIDGEN_MASK ((1 << ASIDGEN_BITS) - 1) | #define ASIDGEN_MASK ((1 << ASIDGEN_BITS) - 1) | ||||
struct pmap { | struct pmap { | ||||
struct mtx pm_mtx; | |||||
pd_entry_t *pm_segtab; /* KVA of segment table */ | pd_entry_t *pm_segtab; /* KVA of segment table */ | ||||
TAILQ_HEAD(, pv_chunk) pm_pvchunk; /* list of mappings in pmap */ | TAILQ_HEAD(, pv_chunk) pm_pvchunk; /* list of mappings in pmap */ | ||||
cpuset_t pm_active; /* active on cpus */ | cpuset_t pm_active; /* active on cpus */ | ||||
struct { | struct { | ||||
u_int32_t asid:ASID_BITS; /* TLB address space tag */ | u_int32_t asid:ASID_BITS; /* TLB address space tag */ | ||||
u_int32_t gen:ASIDGEN_BITS; /* its generation number */ | u_int32_t gen:ASIDGEN_BITS; /* its generation number */ | ||||
} pm_asid[MAXSMPCPU]; | } pm_asid[MAXSMPCPU]; | ||||
struct pmap_statistics pm_stats; /* pmap statistics */ | struct pmap_statistics pm_stats; /* pmap statistics */ | ||||
struct mtx pm_mtx; | #ifdef MIPS64_NEW_PMAP | ||||
struct vm_radix pm_root; /* spare page table pages */ | |||||
#endif /* MIPS64_NEW_PMAP */ | |||||
}; | }; | ||||
typedef struct pmap *pmap_t; | typedef struct pmap *pmap_t; | ||||
#ifdef _KERNEL | #ifdef _KERNEL | ||||
pt_entry_t *pmap_pte(pmap_t, vm_offset_t); | pt_entry_t *pmap_pte(pmap_t, vm_offset_t); | ||||
vm_paddr_t pmap_kextract(vm_offset_t va); | vm_paddr_t pmap_kextract(vm_offset_t va); | ||||
Show All 15 Lines | |||||
#define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) | #define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) | ||||
/* | /* | ||||
* For each vm_page_t, there is a list of all currently valid virtual | * For each vm_page_t, there is a list of all currently valid virtual | ||||
* mappings of that page. An entry is a pv_entry_t, the list is pv_table. | * mappings of that page. An entry is a pv_entry_t, the list is pv_table. | ||||
*/ | */ | ||||
typedef struct pv_entry { | typedef struct pv_entry { | ||||
vm_offset_t pv_va; /* virtual address for mapping */ | vm_offset_t pv_va; /* virtual address for mapping */ | ||||
TAILQ_ENTRY(pv_entry) pv_list; | TAILQ_ENTRY(pv_entry) pv_next; | ||||
} *pv_entry_t; | } *pv_entry_t; | ||||
/* | /* | ||||
* pv_entries are allocated in chunks per-process. This avoids the | * pv_entries are allocated in chunks per-process. This avoids the | ||||
* need to track per-pmap assignments. | * need to track per-pmap assignments. | ||||
*/ | */ | ||||
#ifdef __mips_n64 | #ifdef __mips_n64 | ||||
#define _NPCM 3 | #define _NPCM 3 | ||||
Show All 26 Lines | |||||
extern vm_paddr_t physmem_desc[PHYS_AVAIL_ENTRIES + 2]; | extern vm_paddr_t physmem_desc[PHYS_AVAIL_ENTRIES + 2]; | ||||
extern vm_offset_t virtual_avail; | extern vm_offset_t virtual_avail; | ||||
extern vm_offset_t virtual_end; | extern vm_offset_t virtual_end; | ||||
extern vm_paddr_t dump_avail[PHYS_AVAIL_ENTRIES + 2]; | extern vm_paddr_t dump_avail[PHYS_AVAIL_ENTRIES + 2]; | ||||
#define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT | #define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT | ||||
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list)) | |||||
#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) | #define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) | ||||
void pmap_bootstrap(void); | void pmap_bootstrap(void); | ||||
void *pmap_mapdev(vm_paddr_t, vm_size_t); | void *pmap_mapdev(vm_paddr_t, vm_size_t); | ||||
#ifdef MIPS64_NEW_PMAP | |||||
jmallett: Are these ifdefs correct? I am having a hard time making sense of what changed here and why. | |||||
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list)) | |||||
#else | |||||
boolean_t pmap_page_is_mapped(vm_page_t m); | |||||
#endif | |||||
void pmap_unmapdev(vm_offset_t, vm_size_t); | void pmap_unmapdev(vm_offset_t, vm_size_t); | ||||
vm_offset_t pmap_steal_memory(vm_size_t size); | vm_offset_t pmap_steal_memory(vm_size_t size); | ||||
void pmap_kenter(vm_offset_t va, vm_paddr_t pa); | void pmap_kenter(vm_offset_t va, vm_paddr_t pa); | ||||
void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int attr); | void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int attr); | ||||
void pmap_kremove(vm_offset_t va); | void pmap_kremove(vm_offset_t va); | ||||
void *pmap_kenter_temporary(vm_paddr_t pa, int i); | void *pmap_kenter_temporary(vm_paddr_t pa, int i); | ||||
void pmap_kenter_temporary_free(vm_paddr_t pa); | void pmap_kenter_temporary_free(vm_paddr_t pa); | ||||
void pmap_flush_pvcache(vm_page_t m); | void pmap_flush_pvcache(vm_page_t m); | ||||
int pmap_emulate_modified(pmap_t pmap, vm_offset_t va); | int pmap_emulate_modified(pmap_t pmap, vm_offset_t va); | ||||
int pmap_emulate_referenced(pmap_t pmap, vm_offset_t va); | |||||
void pmap_page_set_memattr(vm_page_t, vm_memattr_t); | void pmap_page_set_memattr(vm_page_t, vm_memattr_t); | ||||
#endif /* _KERNEL */ | #endif /* _KERNEL */ | ||||
#endif /* !LOCORE */ | #endif /* !LOCORE */ | ||||
#endif /* !_MACHINE_PMAP_H_ */ | #endif /* !_MACHINE_PMAP_H_ */ |
Are these ifdefs correct? I am having a hard time making sense of what changed here and why.