Date: Wed, 1 Feb 2006 08:39:26 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 90861 for review Message-ID: <200602010839.k118dQUJ031043@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=90861 Change 90861 by kmacy@kmacy:freebsd7_xen3 on 2006/02/01 08:38:24 cleanups related to adding back isa hole don't run bios checks unless privileged use IdlePTD where it was used previously have IdlePTD be physical address instead of machine address Affected files ... .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/machdep.c#8 edit .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/pmap.c#2 edit .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#8 edit .. //depot/projects/xen3/src/sys/i386-xen/include/xenpmap.h#3 edit .. //depot/projects/xen3/src/sys/i386-xen/include/xenvar.h#5 edit .. //depot/projects/xen3/src/sys/i386/i386/bios.c#2 edit Differences ... ==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/machdep.c#8 (text+ko) ==== @@ -2449,7 +2449,7 @@ dblfault_tss.tss_ldt = GSEL(GLDT_SEL, SEL_KPL); #ifndef XEN - /* can be made to work */ + /* XXX - this can be made to work */ vm86_initialize(); #endif getmemsize(first); @@ -2489,9 +2489,9 @@ /* setup proc 0's pcb */ thread0.td_pcb->pcb_flags = 0; /* XXXKSE */ #ifdef PAE - thread0.td_pcb->pcb_cr3 = xpmap_mtop((int)IdlePDPT); + thread0.td_pcb->pcb_cr3 = (int)IdlePDPT; #else - thread0.td_pcb->pcb_cr3 = xpmap_mtop((int)IdlePTD); + thread0.td_pcb->pcb_cr3 = (int)IdlePTD; #endif thread0.td_pcb->pcb_ext = 0; thread0.td_frame = &proc0_tf; ==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/pmap.c#2 (text+ko) ==== @@ -378,11 +378,7 @@ * Initialize the kernel pmap (which is statically allocated). */ PMAP_LOCK_INIT(kernel_pmap); -#ifdef XEN - kernel_pmap->pm_pdir = (pd_entry_t *) xen_start_info->pt_base; -#else kernel_pmap->pm_pdir = (pd_entry_t *) (KERNBASE + (u_int)IdlePTD); -#endif #ifdef PAE kernel_pmap->pm_pdpt = (pdpt_entry_t *) (KERNBASE + (u_int)IdlePDPT); #endif @@ -1132,11 +1128,7 @@ { PMAP_LOCK_INIT(pmap); -#ifdef XEN - pmap->pm_pdir = (pd_entry_t *)(xen_start_info->pt_base); -#else pmap->pm_pdir = (pd_entry_t *)(KERNBASE + (vm_offset_t)IdlePTD); -#endif #ifdef PAE pmap->pm_pdpt = (pdpt_entry_t *)(KERNBASE + (vm_offset_t)IdlePDPT); #endif ==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#8 (text+ko) ==== @@ -552,14 +552,14 @@ bootmem_current -= size; } - +static vm_offset_t *pdir_shadow; void initvalues(start_info_t *startinfo) { int i, round_tmpindex; - vm_paddr_t pdir_shadow_ma, KPTphys; - vm_offset_t *pdir_shadow; + vm_paddr_t pdir_shadow_ma, KPTphys, *IdlePTDma; + #ifdef SMP int j; #endif @@ -583,7 +583,8 @@ #endif bzero((char *)PFNTOV(tmpindex), (round_tmpindex - tmpindex)*PAGE_SIZE); - IdlePTD = (pd_entry_t *)xpmap_ptom(VTOP(startinfo->pt_base)); + IdlePTD = (pd_entry_t *)VTOP(startinfo->pt_base); + IdlePTDma = (pd_entry_t *)xpmap_ptom(VTOP(startinfo->pt_base)); KPTphys = xpmap_ptom(VTOP(startinfo->pt_base + PAGE_SIZE)); XENPRINTF("IdlePTD %p\n", IdlePTD); XENPRINTF("nr_pages: %ld shared_info: 0x%lx flags: 0x%lx pt_base: 0x%lx " @@ -619,11 +620,11 @@ /* setup shadow mapping first so vtomach will work */ xen_pt_pin((vm_paddr_t)pdir_shadow_ma); - xen_queue_pt_update((vm_paddr_t)(IdlePTD + PTDPTDI), + xen_queue_pt_update((vm_paddr_t)(IdlePTDma + PTDPTDI), pdir_shadow_ma | PG_KERNEL); xen_queue_pt_update(pdir_shadow_ma + PTDPTDI*sizeof(vm_paddr_t), - ((vm_paddr_t)IdlePTD) | PG_V | PG_A); - xen_queue_pt_update(pdir_shadow_ma + KPTDI*sizeof(vm_paddr_t), + ((vm_paddr_t)IdlePTDma) | PG_V | PG_A); + xen_queue_pt_update(pdir_shadow_ma + (KPTDI + ISA_PDR_OFFSET)*sizeof(vm_paddr_t), KPTphys | PG_V | PG_A); xen_flush_queue(); @@ -645,7 +646,7 @@ PT_SET_MA(SMPpt, *vtopte((vm_offset_t)SMPpt) & ~PG_RW); /* put the page table into the page directory */ - xen_queue_pt_update((vm_paddr_t)(IdlePTD + MPPTDI), + xen_queue_pt_update((vm_paddr_t)(IdlePTDma + MPPTDI), xpmap_ptom((tmpindex << PAGE_SHIFT))| PG_KERNEL); xen_queue_pt_update(pdir_shadow_ma + MPPTDI*sizeof(vm_paddr_t), xpmap_ptom((tmpindex << PAGE_SHIFT))| PG_V | PG_A); @@ -659,16 +660,18 @@ if (tmpindex > 980) __asm__("int3"); #endif - /* unmap remaining pages from initial 4MB chunk */ - for (i = tmpindex; i%1024 != 0; i++) + /* unmap remaining pages from initial 4MB chunk + */ + for (i = (tmpindex - ISA_INDEX_OFFSET); i%1024 != 0; i++) xen_queue_pt_update(KPTphys + i*sizeof(vm_paddr_t), 0); xen_flush_queue(); /* allocate remainder of NKPT pages */ for (i = 0; i < NKPT-1; i++, tmpindex++) { - xen_queue_pt_update((vm_paddr_t)(IdlePTD + KPTDI + i + 1), + /* KERNBASE left unmapped (+ 1) KERNLOAD already mapped (+1) == + 2 */ + xen_queue_pt_update((vm_paddr_t)(IdlePTDma + KPTDI + i + 1 + ISA_PDR_OFFSET), xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_KERNEL)); - xen_queue_pt_update(pdir_shadow_ma + (KPTDI + i + 1)*sizeof(vm_paddr_t), + xen_queue_pt_update(pdir_shadow_ma + (KPTDI + i + 1 + ISA_PDR_OFFSET)*sizeof(vm_paddr_t), xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_V | PG_A)); } tmpindex += NKPT-1; ==== //depot/projects/xen3/src/sys/i386-xen/include/xenpmap.h#3 (text+ko) ==== @@ -33,7 +33,6 @@ #ifndef _XEN_XENPMAP_H_ #define _XEN_XENPMAP_H_ -#include <machine/xenvar.h> void xen_invlpg(vm_offset_t); void xen_load_cr3(vm_paddr_t); void xen_queue_pt_update(vm_paddr_t, vm_paddr_t); @@ -170,12 +169,10 @@ xen_flush_queue(); \ } while (/*CONSTCOND*/0) - static __inline uint32_t xpmap_mtop(uint32_t mpa) { - return (((xen_machine_phys[(mpa >> PAGE_SHIFT)]) << PAGE_SHIFT) - | (mpa & ~PG_FRAME)); + return machtophys(mpa) | (mpa & ~PG_FRAME); } static __inline vm_paddr_t ==== //depot/projects/xen3/src/sys/i386-xen/include/xenvar.h#5 (text+ko) ==== @@ -1,6 +1,5 @@ #ifndef XENVAR_H_ #define XENVAR_H_ - #define XBOOTUP 0x1 #define XPMAP 0x2 extern int xendebug_flags; @@ -16,15 +15,35 @@ if (xendebug_flags & argflags) XENPRINTF("(file=%s, line=%d) " _f "\n", __FILE__, __LINE__, ## _a); extern unsigned long *xen_machine_phys; -#define PFNTOMFN(i) (((unsigned long *)xen_phys_machine)[i]) -#define MFNTOPFN(i) (xen_machine_phys[i]) +/* Xen starts physical pages after the 4MB ISA hole - + * FreeBSD doesn't + */ + +#ifdef ADD_ISA_HOLE +#define ISA_INDEX_OFFSET 1024 +#define ISA_PDR_OFFSET 1 +#else +#define ISA_INDEX_OFFSET 0 +#define ISA_PDR_OFFSET 0 +#endif + + +#define PFNTOMFN(i) (((unsigned long *)xen_phys_machine)[(i) - ISA_INDEX_OFFSET]) +#define MFNTOPFN(i) (xen_machine_phys[i] + ISA_INDEX_OFFSET) + +#define VTOP(x) ((unsigned long)(x) - KERNBASE) +#define PTOV(x) ((unsigned long)(x) + KERNBASE) + +#define VTOPFN(x) (VTOP(x) >> PAGE_SHIFT) +#define PFNTOV(x) PTOV((unsigned long)(x) << PAGE_SHIFT) + #define VTOMFN(va) (vtomach(va) >> PAGE_SHIFT) #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) -#define VTOP(x) ((unsigned long)(x) - KERNBASE) -#define VTOPFN(x) (((unsigned long)(x) - KERNBASE) >> PAGE_SHIFT) -#define PFNTOV(x) (((unsigned long)(x) << PAGE_SHIFT) + KERNBASE) + +#define phystomach(pa) (PFNTOMFN((pa) >> PAGE_SHIFT) << PAGE_SHIFT) +#define machtophys(ma) (MFNTOPFN((ma) >> PAGE_SHIFT) << PAGE_SHIFT) + -#define phystomach(pa) ((((unsigned long *)xen_phys_machine)[(pa >> PAGE_SHIFT)]) << PAGE_SHIFT) void xpq_init(void); #define BITS_PER_LONG 32 ==== //depot/projects/xen3/src/sys/i386/i386/bios.c#2 (text+ko) ==== @@ -83,6 +83,9 @@ int i; char *p; +#if defined(XEN) && !defined(XEN_PRIVILEGED_GUEST) + return; +#endif /* * BIOS32 Service Directory, PCI BIOS */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200602010839.k118dQUJ031043>