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