diff options
Diffstat (limited to 'i386/intel/pmap.h')
-rw-r--r-- | i386/intel/pmap.h | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/i386/intel/pmap.h b/i386/intel/pmap.h index 5fa2a0c4..45a88ea1 100644 --- a/i386/intel/pmap.h +++ b/i386/intel/pmap.h @@ -86,6 +86,16 @@ typedef phys_addr_t pt_entry_t; #define PTEMASK 0x3ff /* mask for page table index */ #endif /* PAE */ +#ifndef MACH_HYP +#define KPTI 1 +#endif + +extern char _sharedtext_start[], _sharedtext_end[]; +extern char _shareddata_start[], _shareddata_end[]; + +/* These are used by user/kernel switch assembler code to switch page table. */ +extern vm_offset_t kernel_pt, user_pt; + /* * Convert linear offset to page descriptor index */ @@ -164,8 +174,14 @@ typedef volatile long cpu_set; /* set of CPUs - must be <= 32 */ struct pmap { #if ! PAE pt_entry_t *dirbase; /* page directory table */ +#ifdef KPTI + pt_entry_t *dirbase_user; /* page directory table for user */ +#endif #else pt_entry_t *pdpbase; /* page directory pointer table */ +#ifdef KPTI + pt_entry_t *pdpbase_user; /* page directory pointer table for user */ +#endif #endif /* ! PAE */ int ref_count; /* reference count */ decl_simple_lock_data(,lock) @@ -186,12 +202,6 @@ extern void pmap_map_mfn(void *addr, unsigned long mfn); extern void pmap_clear_bootstrap_pagetable(pt_entry_t *addr); #endif /* MACH_PV_PAGETABLES */ -#if PAE -#define set_pmap(pmap) set_cr3(kvtophys((vm_offset_t)(pmap)->pdpbase)) -#else /* PAE */ -#define set_pmap(pmap) set_cr3(kvtophys((vm_offset_t)(pmap)->dirbase)) -#endif /* PAE */ - typedef struct { pt_entry_t *entry; vm_offset_t vaddr; @@ -455,12 +465,33 @@ extern void pmap_zero_page (phys_addr_t); extern void pmap_copy_page (phys_addr_t, phys_addr_t); /* + * pmap_share_kernel_page marks + */ +#ifdef KPTI +extern void pmap_share_kernel_page(pmap_t pmap, vm_offset_t va, int pteflags); +#else +#define pmap_share_kernel_page(pmap, va, pteflags) ((void)0) +#endif + +/* * kvtophys(addr) * * Convert a kernel virtual address to a physical address */ extern phys_addr_t kvtophys (vm_offset_t); +static inline void set_pmap(pmap_t pmap) { +#if PAE + kernel_pt = kvtophys((vm_offset_t)(pmap)->pdpbase); + user_pt = kvtophys((vm_offset_t)(pmap)->pdpbase_user); +#else /* PAE */ + kernel_pt = kvtophys((vm_offset_t)(pmap)->dirbase); + user_pt = kvtophys((vm_offset_t)(pmap)->dirbase_user); +#endif /* PAE */ + /* We are using the kernel page table for now. */ + set_cr3(kernel_pt); +} + #if NCPUS > 1 void signal_cpus( cpu_set use_list, |