--- Gnu-Mach/i386/intel/pmap.h 2020/09/02 04:46:55 1.1.1.3 +++ Gnu-Mach/i386/intel/pmap.h 2020/09/02 04:55:41 1.1.1.5 @@ -64,11 +64,7 @@ * i386/i486 Page Table Entry */ -#if PAE -typedef unsigned long long pt_entry_t; -#else /* PAE */ -typedef unsigned int pt_entry_t; -#endif /* PAE */ +typedef phys_addr_t pt_entry_t; #define PT_ENTRY_NULL ((pt_entry_t *) 0) #endif /* __ASSEMBLER__ */ @@ -93,11 +89,14 @@ typedef unsigned int pt_entry_t; /* * Convert linear offset to page descriptor index */ +#define lin2pdenum(a) (((a) >> PDESHIFT) & PDEMASK) + #if PAE -/* Making it include the page directory pointer table index too */ -#define lin2pdenum(a) (((a) >> PDESHIFT) & 0x7ff) +/* Special version assuming contiguous page directories. Making it + include the page directory pointer table index too. */ +#define lin2pdenum_cont(a) (((a) >> PDESHIFT) & 0x7ff) #else -#define lin2pdenum(a) (((a) >> PDESHIFT) & PDEMASK) +#define lin2pdenum_cont(a) lin2pdenum(a) #endif /* @@ -163,10 +162,11 @@ typedef volatile long cpu_set; /* set of /* changed by other processors */ struct pmap { +#if ! PAE pt_entry_t *dirbase; /* page directory table */ -#if PAE +#else pt_entry_t *pdpbase; /* page directory pointer table */ -#endif /* PAE */ +#endif /* ! PAE */ int ref_count; /* reference count */ decl_simple_lock_data(,lock) /* lock on map */ @@ -192,6 +192,16 @@ extern void pmap_clear_bootstrap_pagetab #define set_pmap(pmap) set_cr3(kvtophys((vm_offset_t)(pmap)->dirbase)) #endif /* PAE */ +typedef struct { + pt_entry_t *entry; + vm_offset_t vaddr; +} pmap_mapwindow_t; + +extern pmap_mapwindow_t *pmap_get_mapwindow(pt_entry_t entry); +extern void pmap_put_mapwindow(pmap_mapwindow_t *map); + +#define PMAP_NMAPWINDOWS 2 + #if NCPUS > 1 /* * List of cpus that are actively using mapped memory. Any @@ -227,7 +237,7 @@ extern pmap_t kernel_pmap; * Machine dependent routines that are used only for i386/i486. */ -pt_entry_t *pmap_pte(pmap_t pmap, vm_offset_t addr); +pt_entry_t *pmap_pte(const pmap_t pmap, vm_offset_t addr); /* * Macros for speed. @@ -282,7 +292,7 @@ pt_entry_t *pmap_pte(pmap_t pmap, vm_off } #define PMAP_ACTIVATE_USER(pmap, th, my_cpu) { \ - register pmap_t tpmap = (pmap); \ + pmap_t tpmap = (pmap); \ \ if (tpmap == kernel_pmap) { \ /* \ @@ -324,7 +334,7 @@ pt_entry_t *pmap_pte(pmap_t pmap, vm_off } #define PMAP_DEACTIVATE_USER(pmap, thread, my_cpu) { \ - register pmap_t tpmap = (pmap); \ + pmap_t tpmap = (pmap); \ \ /* \ * Do nothing if this is the kernel pmap. \ @@ -395,7 +405,7 @@ pt_entry_t *pmap_pte(pmap_t pmap, vm_off } #define PMAP_ACTIVATE_USER(pmap, th, my_cpu) { \ - register pmap_t tpmap = (pmap); \ + pmap_t tpmap = (pmap); \ (void) (th); \ (void) (my_cpu); \ \ @@ -437,19 +447,33 @@ extern void pmap_unmap_page_zero (void); /* * pmap_zero_page zeros the specified (machine independent) page. */ -extern void pmap_zero_page (vm_offset_t); +extern void pmap_zero_page (phys_addr_t); /* * pmap_copy_page copies the specified (machine independent) pages. */ -extern void pmap_copy_page (vm_offset_t, vm_offset_t); +extern void pmap_copy_page (phys_addr_t, phys_addr_t); /* * kvtophys(addr) * * Convert a kernel virtual address to a physical address */ -extern vm_offset_t kvtophys (vm_offset_t); +extern phys_addr_t kvtophys (vm_offset_t); + +void pmap_remove_range( + pmap_t pmap, + vm_offset_t va, + pt_entry_t *spte, + pt_entry_t *epte); + +#if NCPUS > 1 +void signal_cpus( + cpu_set use_list, + pmap_t pmap, + vm_offset_t start, + vm_offset_t end); +#endif /* NCPUS > 1 */ #endif /* __ASSEMBLER__ */