Date: Tue, 11 Dec 2007 07:15:12 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 130617 for review Message-ID: <200712110715.lBB7FCkB046922@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=130617 Change 130617 by kmacy@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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200712110715.lBB7FCkB046922>