Skip site navigation (1)Skip section navigation (2)
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>