PERFORCE change 130617 for review

Kip Macy kmacy at FreeBSD.org
Mon Dec 10 23:15:13 PST 2007


http://perforce.freebsd.org/chv.cgi?CH=130617

Change 130617 by kmacy at entropy_kmacy_xen31 on 2007/12/11 07:14:22

	get kernel to build in PAE mode
	 - fix xenpmap interfaces to expect vm_paddr_t rather than uint32_t
	switch to ELFNOTE style interface to the xen loader

Affected files ...

.. //depot/projects/xen31/sys/conf/Makefile.i386#2 edit
.. //depot/projects/xen31/sys/conf/kern.mk#2 edit
.. //depot/projects/xen31/sys/i386/i386/genassym.c#3 edit
.. //depot/projects/xen31/sys/i386/include/asmacros.h#2 edit
.. //depot/projects/xen31/sys/i386/include/pmap.h#6 edit
.. //depot/projects/xen31/sys/i386/include/xen/xen-public/arch-x86_32.h#2 edit
.. //depot/projects/xen31/sys/i386/include/xen/xen-public/elfnote.h#1 add
.. //depot/projects/xen31/sys/i386/include/xen/xenpmap.h#2 edit
.. //depot/projects/xen31/sys/i386/include/xen/xenvar.h#2 edit
.. //depot/projects/xen31/sys/i386/xen/locore.s#3 edit
.. //depot/projects/xen31/sys/i386/xen/pmap.c#5 edit
.. //depot/projects/xen31/sys/i386/xen/xen_machdep.c#3 edit

Differences ...

==== //depot/projects/xen31/sys/conf/Makefile.i386#2 (text+ko) ====

@@ -17,7 +17,7 @@
 #
 
 # Which version of config(8) is required.
-%VERSREQ=	600004
+%VERSREQ=	600003
 
 STD8X16FONT?=	iso
 

==== //depot/projects/xen31/sys/conf/kern.mk#2 (text+ko) ====

@@ -13,9 +13,6 @@
 CWARNFLAGS?=	-Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes \
 		-Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual \
 		${_wundef} ${_Wno_pointer_sign} -fformat-extensions
-.if !defined(WITH_GCC3)
-_Wno_pointer_sign=-Wno-pointer-sign
-.endif
 .if !defined(NO_UNDEF)
 _wundef=	-Wundef
 .endif

==== //depot/projects/xen31/sys/i386/i386/genassym.c#3 (text+ko) ====

@@ -231,3 +231,8 @@
 ASSYM(BUS_SPACE_HANDLE_BASE, offsetof(struct bus_space_handle, bsh_base));
 ASSYM(BUS_SPACE_HANDLE_IAT, offsetof(struct bus_space_handle, bsh_iat));
 #endif
+
+#ifdef XEN
+#include <machine/xen/xen-public/arch-x86_32.h>
+ASSYM(HYPERVISOR_VIRT_START, __HYPERVISOR_VIRT_START);
+#endif

==== //depot/projects/xen31/sys/i386/include/asmacros.h#2 (text+ko) ====

@@ -178,4 +178,30 @@
 
 #endif /* LOCORE */
 
+
+#ifdef __STDC__
+#define ELFNOTE(name, type, desctype, descdata...) \
+.pushsection .note.name                 ;       \
+  .align 4                              ;       \
+  .long 2f - 1f         /* namesz */    ;       \
+  .long 4f - 3f         /* descsz */    ;       \
+  .long type                            ;       \
+1:.asciz #name                          ;       \
+2:.align 4                              ;       \
+3:desctype descdata                     ;       \
+4:.align 4                              ;       \
+.popsection
+#else /* !__STDC__, i.e. -traditional */
+#define ELFNOTE(name, type, desctype, descdata) \
+.pushsection .note.name                 ;       \
+  .align 4                              ;       \
+  .long 2f - 1f         /* namesz */    ;       \
+  .long 4f - 3f         /* descsz */    ;       \
+  .long type                            ;       \
+1:.asciz "name"                         ;       \
+2:.align 4                              ;       \
+3:desctype descdata                     ;       \
+4:.align 4                              ;       \
+.popsection
+#endif /* __STDC__ */
 #endif /* !_MACHINE_ASMACROS_H_ */

==== //depot/projects/xen31/sys/i386/include/pmap.h#6 (text+ko) ====

@@ -251,6 +251,10 @@
 #define	pte_store(ptep, pte)	pte_load_store((ptep), (pt_entry_t)pte)
 #define	pte_clear(ptep)	pte_load_store((ptep), (pt_entry_t)0ULL)
 
+#ifdef PAE
+extern pt_entry_t pg_nx;
+#endif
+
 #else
 /*
  *	Routine:	pmap_kextract

==== //depot/projects/xen31/sys/i386/include/xen/xen-public/arch-x86_32.h#2 (text+ko) ====

@@ -70,7 +70,7 @@
  * Virtual addresses beyond this are not modifiable by guest OSes. The 
  * machine->physical mapping table starts at this address, read-only.
  */
-#ifdef CONFIG_X86_PAE
+#ifdef PAE
 #define __HYPERVISOR_VIRT_START 0xF5800000
 #else
 #define __HYPERVISOR_VIRT_START 0xFC000000

==== //depot/projects/xen31/sys/i386/include/xen/xenpmap.h#2 (text+ko) ====

@@ -36,15 +36,15 @@
 void xen_invlpg(vm_offset_t);
 void xen_load_cr3(vm_paddr_t);
 void xen_queue_pt_update(vm_paddr_t, vm_paddr_t);
-void xen_pt_switch(uint32_t);
-void xen_set_ldt(unsigned long, unsigned long);
+void xen_pt_switch(vm_paddr_t);
+void xen_set_ldt(vm_paddr_t, unsigned long);
 void xen_tlb_flush(void);
-void xen_pgd_pin(unsigned long);
-void xen_pgd_unpin(unsigned long);
-void xen_pt_pin(unsigned long);
-void xen_pt_unpin(unsigned long);
+void xen_pgd_pin(vm_paddr_t);
+void xen_pgd_unpin(vm_paddr_t);
+void xen_pt_pin(vm_paddr_t);
+void xen_pt_unpin(vm_paddr_t);
 void xen_flush_queue(void);
-void pmap_ref(pt_entry_t *pte, unsigned long ma);
+void pmap_ref(pt_entry_t *pte, vm_paddr_t ma);
 
 
 #ifdef PMAP_DEBUG
@@ -169,14 +169,14 @@
         xen_flush_queue();                                      \
 } while (/*CONSTCOND*/0)
 
-static __inline uint32_t
-xpmap_mtop(uint32_t mpa)
+static __inline vm_paddr_t
+xpmap_mtop(vm_paddr_t mpa)
 {
     return machtophys(mpa) | (mpa & ~PG_FRAME);
 }
 
 static __inline vm_paddr_t
-xpmap_ptom(uint32_t ppa)
+xpmap_ptom(vm_paddr_t ppa)
 {
     return phystomach(ppa) | (ppa & ~PG_FRAME);
 }

==== //depot/projects/xen31/sys/i386/include/xen/xenvar.h#2 (text+ko) ====

@@ -8,7 +8,7 @@
 #else
 #define XENPRINTF printf
 #endif 
-extern unsigned long *xen_phys_machine;
+extern vm_paddr_t *xen_phys_machine;
 
 #if 0
 #define TRACE_ENTER XENPRINTF("(file=%s, line=%d) entered %s\n", __FILE__, __LINE__, __FUNCTION__)
@@ -21,7 +21,7 @@
 #define TRACE_DEBUG(argflags, _f, _a...)
 #endif
 
-extern unsigned long *xen_machine_phys;
+extern vm_paddr_t *xen_machine_phys;
 /* Xen starts physical pages after the 4MB ISA hole -
  * FreeBSD doesn't
  */
@@ -38,14 +38,14 @@
 #endif
 
 
-#define PFNTOMFN(i) (((unsigned long *)xen_phys_machine)[(i)])
+#define PFNTOMFN(i) (((vm_paddr_t *)xen_phys_machine)[(i)])
 #define MFNTOPFN(i) (xen_machine_phys[i])
 
-#define VTOP(x) ((unsigned long)(x) - KERNBASE)
-#define PTOV(x) ((unsigned long)(x) + KERNBASE)
+#define VTOP(x) ((vm_paddr_t)((uintptr_t)x) - KERNBASE)
+#define PTOV(x) ((vm_paddr_t)(x) + KERNBASE)
 
 #define VTOPFN(x) (VTOP(x) >> PAGE_SHIFT)
-#define PFNTOV(x) PTOV((unsigned long)(x)  << PAGE_SHIFT)
+#define PFNTOV(x) PTOV((vm_paddr_t)(x)  << PAGE_SHIFT)
 
 #define VTOMFN(va) (vtomach(va) >> PAGE_SHIFT)
 #define PFN_UP(x)    (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)

==== //depot/projects/xen31/sys/i386/xen/locore.s#3 (text+ko) ====

@@ -54,6 +54,9 @@
 #include <machine/pmap.h>
 #include <machine/specialreg.h>
 
+#define __ASSEMBLY__	
+#include <machine/xen/xen-public/elfnote.h>
+	
 /* The defines below have been lifted out of <machine/xen-public/arch-x86_32.h> */
 #define FLAT_RING1_CS 0xe019    /* GDT index 259 */
 #define FLAT_RING1_DS 0xe021    /* GDT index 260 */
@@ -63,8 +66,37 @@
 #include "assym.s"
 
 .section __xen_guest
+#if 0	
 	.ascii "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB,VIRT_BASE=0xc0000000"
 	.byte 0
+#endif
+	ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,       .asciz, "FreeBSD")	
+	ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz, "HEAD")
+	ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,    .asciz, "xen-3.0")
+	ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,      .long,  KERNBASE)
+	ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .long,  0)
+	ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          .long,  btext)
+#ifdef notyet	
+	ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long,  hypercall_page)
+#endif	
+	ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW,   .long,  HYPERVISOR_VIRT_START)
+#ifdef notyet	
+	ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
+#else 
+	ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz, "pae_pgdir_above_4gb|supervisor_mode_kernel")
+#endif
+		
+#ifdef PAE
+	ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "yes")
+	ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .long,  PG_V, PG_V)
+#else
+	ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "no")
+	ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .long,  PG_V, PG_V)
+#endif
+	ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
+	ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  1)		
+
+	
 	
 /*
  *	XXX
@@ -263,7 +295,7 @@
 	pushl	%eax
 	testl	$PSL_VM,UC_EFLAGS(%eax)
 	jne	1f
-	movl	UC_GS(%eax),%gs		/* restore %gs */
+	mov	UC_GS(%eax), %gs	/* restore %gs */
 1:
 	movl	$SYS_sigreturn,%eax
 	pushl	%eax			/* junk to fake return addr. */
@@ -280,7 +312,7 @@
 	pushl	%eax
 	testl	$PSL_VM,UC4_EFLAGS(%eax)
 	jne	1f
-	movl	UC4_GS(%eax),%gs	/* restore %gs */
+	mov	UC4_GS(%eax),%gs	/* restore %gs */
 1:
 	movl	$344,%eax		/* 4.x SYS_sigreturn */
 	pushl	%eax			/* junk to fake return addr. */

==== //depot/projects/xen31/sys/i386/xen/pmap.c#5 (text+ko) ====

@@ -254,8 +254,8 @@
 #endif
 static pt_entry_t *PMAP1 = 0, *PMAP2;
 static pt_entry_t *PADDR1 = 0, *PADDR2;
+static int PMAP1_inuse = 0, PMAP2_inuse = 0;
 #ifdef SMP
-static int PMAP1_inuse = 0, PMAP2_inuse = 0;
 static int PMAP1cpu;
 static int PMAP1changedcpu;
 SYSCTL_INT(_debug, OID_AUTO, PMAP1changedcpu, CTLFLAG_RD, 
@@ -1439,6 +1439,8 @@
 		/* re-map page directory read-only and pin */
 		PT_SET_MA(pmap->pm_pdir + i*PAGE_SIZE, 
 		    (ma | PG_V | PG_A));
+		PT_SET_MA(pmap->pm_pdpt + i*PAGE_SIZE, 
+		    (ma | PG_V | PG_A));
 		xen_pgd_pin(ma);
 		/* add L1 shadow of L2 */
 		xen_queue_pt_update(vtomach(&pmap->pm_pdir[PTDPTDI + i]), 
@@ -1447,8 +1449,8 @@
 				    vtomach(pmap->pm_pdir) | PG_V | PG_A);
 
 #ifdef PAE
-		#error "unsupported currently"
-		pmap->pm_pdpt[i] = ma | PG_V;
+		xen_queue_pt_update(vtomach(&pmap->pm_pdpt[i]), 
+				    ma_shadow | PG_V | PG_A); 
 #endif
 	}
 	xen_flush_queue();

==== //depot/projects/xen31/sys/i386/xen/xen_machdep.c#3 (text+ko) ====

@@ -75,8 +75,8 @@
 int xendebug_flags; 
 start_info_t *xen_start_info;
 shared_info_t *HYPERVISOR_shared_info;
-unsigned long *xen_machine_phys = ((unsigned long *)VADDR(1008, 0));
-unsigned long *xen_phys_machine;
+vm_paddr_t *xen_machine_phys = ((vm_paddr_t *)VADDR(1008, 0));
+vm_paddr_t *xen_phys_machine;
 int preemptable, init_first;
 extern unsigned int avail_space;
 
@@ -261,7 +261,7 @@
 }
 
 void
-xen_load_cr3(uint32_t val)
+xen_load_cr3(vm_paddr_t val)
 {
 	struct mmuext_op op;
 	op.cmd = MMUEXT_NEW_BASEPTR;
@@ -293,7 +293,7 @@
 }
 
 void 
-xen_pgd_pin(unsigned long ma)
+xen_pgd_pin(vm_paddr_t ma)
 {
 	struct mmuext_op op;
 	op.cmd = MMUEXT_PIN_L2_TABLE;
@@ -303,7 +303,7 @@
 }
 
 void 
-xen_pgd_unpin(unsigned long ma)
+xen_pgd_unpin(vm_paddr_t ma)
 {
 	struct mmuext_op op;
 	op.cmd = MMUEXT_UNPIN_TABLE;
@@ -313,7 +313,7 @@
 }
 
 void 
-xen_pt_pin(unsigned long ma)
+xen_pt_pin(vm_paddr_t ma)
 {
 	struct mmuext_op op;
 	op.cmd = MMUEXT_PIN_L1_TABLE;
@@ -324,7 +324,7 @@
 }
 
 void 
-xen_pt_unpin(unsigned long ma)
+xen_pt_unpin(vm_paddr_t ma)
 {
 	struct mmuext_op op;
 	op.cmd = MMUEXT_UNPIN_TABLE;
@@ -334,7 +334,7 @@
 }
 
 void 
-xen_set_ldt(unsigned long ptr, unsigned long len)
+xen_set_ldt(vm_paddr_t ptr, unsigned long len)
 {
 	struct mmuext_op op;
 	op.cmd = MMUEXT_SET_LDT;
@@ -588,6 +588,7 @@
 	bootmem_current -= size;
 }
 
+#if 0
 static vm_paddr_t
 xpmap_mtop2(vm_paddr_t mpa)
 {
@@ -595,7 +596,7 @@
             ) | (mpa & ~PG_FRAME);
 }
 
-static pd_entry_t
+static pd_entry_t 
 xpmap_get_bootpde(vm_paddr_t va)
 {
 
@@ -614,7 +615,7 @@
                 (xpmap_mtop2(pde & PG_FRAME) + KERNBASE);
 }
 
-static pt_entry_t *
+static pt_entry_t 8*
 xpmap_get_bootptep(vm_paddr_t va)
 {
         pd_entry_t pde;
@@ -632,7 +633,7 @@
 
         return xpmap_get_bootptep(va)[0];
 }
-
+#endif
 
 static vm_offset_t *pdir_shadow;
 
@@ -675,7 +676,7 @@
 { 
 	int i;
 	unsigned int cur_space = avail_space;
-	vm_paddr_t pdir_shadow_ma, KPTphys, *IdlePTDma;
+	vm_paddr_t pdir_shadow_ma, KPTphys, IdlePTDma;
 	physdev_op_t op;
 
 	printk("initvalues(): wooh - availmem=%x,%x\n",avail_space, cur_space);
@@ -686,7 +687,7 @@
 #endif
 
 	xen_start_info = startinfo;
-	xen_phys_machine = (unsigned long *)startinfo->mfn_list;
+	xen_phys_machine = (vm_paddr_t *)startinfo->mfn_list;
 
 	/* number of pages allocated after the pts + 1*/;
 	printk("KERNBASE=%x,pt_base=%x, VTOPFN(base)=%x, nr_pt_frames=%x\n", KERNBASE,xen_start_info->pt_base, VTOPFN(xen_start_info->pt_base), xen_start_info->nr_pt_frames);
@@ -707,8 +708,8 @@
 	bzero((char *)cur_space, (cur_space + 0x3fffff) % 0x400000);
  */
 
-	IdlePTD = (pd_entry_t *)VTOP(startinfo->pt_base);
-	IdlePTDma = (pd_entry_t *)xpmap_ptom(VTOP(startinfo->pt_base));
+	IdlePTD = (pd_entry_t *)startinfo->pt_base;
+	IdlePTDma = 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 "
@@ -716,10 +717,10 @@
 		  xen_start_info->nr_pages, xen_start_info->shared_info, 
 		  xen_start_info->flags, xen_start_info->pt_base, 
 		  xen_start_info->mod_start, xen_start_info->mod_len);
-
+#if 0
        XENPRINTF("c0100000: %08x\n",
             xpmap_get_bootpte(0xc0100000));
-
+#endif
 	/* Map proc0's KSTACK */
 	proc0kstack = cur_space; cur_space += (KSTACK_PAGES * PAGE_SIZE);
 	printk("proc0kstack=%u\n", proc0kstack);


More information about the p4-projects mailing list