Date: Tue, 3 Jan 2006 08:08:49 GMT From: Scott Long <scottl@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 89079 for review Message-ID: <200601030808.k0388nx2050655@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=89079 Change 89079 by scottl@scottl-junior on 2006/01/03 08:08:13 Import the Xen3 code as of Jan 2, 2006 Affected files ... .. //depot/projects/xen3/src/sys/conf/Makefile.i386-xen#1 add .. //depot/projects/xen3/src/sys/conf/files#2 edit .. //depot/projects/xen3/src/sys/conf/files.i386-xen#1 add .. //depot/projects/xen3/src/sys/conf/ldscript.i386-xen#1 add .. //depot/projects/xen3/src/sys/conf/options.i386-xen#1 add .. //depot/projects/xen3/src/sys/dev/xen/blkfront/blkfront.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/blkfront/block.h#1 add .. //depot/projects/xen3/src/sys/dev/xen/console/console.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/console/xencons_ring.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/console/xencons_ring.h#1 add .. //depot/projects/xen3/src/sys/dev/xen/evtchn/evtchn_dev.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/netfront/netfront.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/xenbus/init.txt#1 add .. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_client.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_comms.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_comms.h#1 add .. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_dev.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_probe.c#1 add .. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_xs.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/conf/XENCONF#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/clock.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/evtchn.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/gnttab.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/hypervisor.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/machdep.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/pmap.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_bus.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/_bus.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/_inttypes.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/_limits.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/_stdint.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/_types.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/acpica_machdep.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/apicreg.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/apicvar.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/apm_bios.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/apm_segments.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/asm.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/asmacros.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/atomic.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/bootinfo.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/bus.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/bus_dma.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/clock.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/cpu.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/cpufunc.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/cputypes.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/cserial.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/db_machdep.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/elan_mmcr.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/elf.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/endian.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/evtchn.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/exec.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/float.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/floatingpoint.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/frame.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/gdb_machdep.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/gnttab.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/hypercall.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/hypervisor-ifs.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/hypervisor.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/i4b_cause.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/i4b_debug.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/i4b_ioctl.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/i4b_rbch_ioctl.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/i4b_tel_ioctl.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/i4b_trace.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/ieeefp.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/if_wl_wavelan.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/in_cksum.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/intr_machdep.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/ioctl_bt848.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/ioctl_meteor.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/iodev.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/kdb.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/legacyvar.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/limits.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/macros.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/md_var.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/memdev.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/metadata.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/mp_watchdog.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/mptable.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/multicall.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/mutex.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/npx.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/param.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pcaudioio.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pcb.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pcb_ext.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pci_cfgreg.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pcpu.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pcvt_ioctl.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pecoff_machdep.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/perfmon.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pmap.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/pmc_mdep.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/ppireg.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/privatespace.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/proc.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/profile.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/psl.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/ptrace.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/reg.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/reloc.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/resource.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/runq.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/segments.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/setjmp.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/sf_buf.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/sigframe.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/signal.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/smapi.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/smp.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/smptests.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/speaker.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/specialreg.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/stdarg.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/synch_bitops.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/sysarch.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/timerreg.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/trap.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/tss.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/ucontext.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/varargs.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/vm86.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/vmparam.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xbox.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-os.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/COPYING#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/acm.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/acm_ops.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/arch-ia64.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/arch-x86_32.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/arch-x86_64.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/dom0_ops.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/event_channel.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/grant_table.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/blkif.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/console.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/ioreq.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/netif.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/ring.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/tpmif.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/xenbus.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/xs_wire.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/memory.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/physdev.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/sched.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/sched_ctl.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/trace.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/vcpu.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/version.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/vmx_assist.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/xen.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xen_intr.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xenbus.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xenfunc.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xenpmap.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xenstored.h#1 add .. //depot/projects/xen3/src/sys/i386-xen/include/xenvar.h#1 add .. //depot/projects/xen3/src/sys/i386/i386/genassym.c#2 edit .. //depot/projects/xen3/src/sys/i386/i386/i686_mem.c#2 edit .. //depot/projects/xen3/src/sys/i386/i386/initcpu.c#2 edit .. //depot/projects/xen3/src/sys/i386/i386/locore.s#2 edit .. //depot/projects/xen3/src/sys/i386/i386/support.s#2 edit .. //depot/projects/xen3/src/sys/i386/i386/swtch.s#2 edit .. //depot/projects/xen3/src/sys/i386/i386/sys_machdep.c#2 edit .. //depot/projects/xen3/src/sys/i386/i386/trap.c#2 edit .. //depot/projects/xen3/src/sys/i386/i386/vm_machdep.c#2 edit .. //depot/projects/xen3/src/sys/i386/include/asmacros.h#2 edit .. //depot/projects/xen3/src/sys/i386/include/pcpu.h#2 edit .. //depot/projects/xen3/src/sys/i386/include/pmap.h#2 edit .. //depot/projects/xen3/src/sys/i386/include/segments.h#2 edit .. //depot/projects/xen3/src/sys/i386/include/trap.h#2 edit .. //depot/projects/xen3/src/sys/i386/isa/npx.c#2 edit Differences ... ==== //depot/projects/xen3/src/sys/conf/files#2 (text+ko) ==== @@ -1399,6 +1399,7 @@ libkern/strncpy.c standard libkern/strsep.c standard libkern/strspn.c standard +libkern/strcspn.c standard libkern/strtol.c standard libkern/strtoq.c standard libkern/strtoul.c standard ==== //depot/projects/xen3/src/sys/i386/i386/genassym.c#2 (text+ko) ==== @@ -199,6 +199,7 @@ ASSYM(PC_CURPMAP, offsetof(struct pcpu, pc_curpmap)); ASSYM(PC_PRIVATE_TSS, offsetof(struct pcpu, pc_private_tss)); + #ifdef DEV_APIC ASSYM(LA_VER, offsetof(struct LAPIC, version)); ASSYM(LA_TPR, offsetof(struct LAPIC, tpr)); @@ -226,3 +227,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 +ASSYM(PC_CR3, offsetof(struct pcpu, pc_cr3)); +ASSYM(HYPERVISOR_STACK_SWITCH, __HYPERVISOR_stack_switch); +#endif ==== //depot/projects/xen3/src/sys/i386/i386/i686_mem.c#2 (text+ko) ==== @@ -609,12 +609,16 @@ i686_mem_drvinit(void *unused) { /* Try for i686 MTRRs */ +#ifndef XEN if (!mtrrs_disabled && (cpu_feature & CPUID_MTRR) && ((cpu_id & 0xf00) == 0x600 || (cpu_id & 0xf00) == 0xf00) && ((strcmp(cpu_vendor, "GenuineIntel") == 0) || (strcmp(cpu_vendor, "AuthenticAMD") == 0))) { mem_range_softc.mr_op = &i686_mrops; } +#else + i686_mrops.init = NULL; /* XXX make "defined but not used" warning go away */ +#endif } SYSINIT(i686memdev,SI_SUB_DRIVERS,SI_ORDER_FIRST,i686_mem_drvinit,NULL) ==== //depot/projects/xen3/src/sys/i386/i386/initcpu.c#2 (text+ko) ==== @@ -545,6 +545,9 @@ initializecpu(void) { +#ifdef XEN + return; +#endif switch (cpu) { #ifdef I486_CPU case CPU_BLUE: ==== //depot/projects/xen3/src/sys/i386/i386/locore.s#2 (text+ko) ==== @@ -42,6 +42,7 @@ #include "opt_bootp.h" #include "opt_compat.h" #include "opt_nfsroot.h" +#include "opt_global.h" #include "opt_pmap.h" #include <sys/syscall.h> @@ -55,6 +56,11 @@ #include "assym.s" +#ifdef XEN +.section __xen_guest + .asciz "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB" +#endif + /* * XXX * @@ -152,9 +158,15 @@ * Some handy macros * */ - +#ifdef XEN +/* + * We're already in protected mode + */ +#define R(foo) (foo) +#else #define R(foo) ((foo)-KERNBASE) - +#endif + #define ALLOCPAGES(foo) \ movl R(physfree), %esi ; \ movl $((foo)*PAGE_SIZE), %eax ; \ @@ -202,8 +214,7 @@ * This is where the bootblocks start us, set the ball rolling... * */ -NON_GPROF_ENTRY(btext) - +NON_GPROF_ENTRY(btext) #ifdef PC98 /* save SYSTEM PARAMETER for resume (NS/T or other) */ movl $0xa1400,%esi @@ -212,6 +223,19 @@ cld rep movsb +#elif defined(XEN) + pushl %esi + call initvalues + popl %esi + call identify_cpu + movl proc0kstack,%eax + leal (KSTACK_PAGES*PAGE_SIZE-PCB_SIZE)(%eax),%esp + xorl %ebp,%ebp /* mark end of frames */ + movl IdlePTD,%esi + movl %esi,(KSTACK_PAGES*PAGE_SIZE-PCB_SIZE+PCB_CR3)(%eax) + call init386 + call mi_startup + int $3 #else /* IBM-PC */ /* Tell the bios to warmboot next time */ movw $0x1234,0x472 ==== //depot/projects/xen3/src/sys/i386/i386/support.s#2 (text+ko) ==== @@ -1426,10 +1426,11 @@ */ /* void lgdt(struct region_descriptor *rdp); */ ENTRY(lgdt) +#ifndef XEN /* reload the descriptor table */ movl 4(%esp),%eax lgdt (%eax) - +#endif /* flush the prefetch q */ jmp 1f nop ==== //depot/projects/xen3/src/sys/i386/i386/swtch.s#2 (text+ko) ==== @@ -33,11 +33,11 @@ */ #include "opt_npx.h" - +#include "opt_global.h" #include <machine/asmacros.h> #include "assym.s" - + /*****************************************************************************/ /* Scheduling */ /*****************************************************************************/ @@ -71,7 +71,7 @@ movl 8(%esp),%ecx /* New thread */ movl TD_PCB(%ecx),%edx movl PCB_CR3(%edx),%eax - movl %eax,%cr3 /* new address space */ + LOAD_CR3(%eax) /* set bit in new pm_active */ movl TD_PROC(%ecx),%eax movl P_VMSPACE(%eax), %ebx @@ -112,7 +112,7 @@ movl %esi,PCB_ESI(%edx) movl %edi,PCB_EDI(%edx) movl %gs,PCB_GS(%edx) - pushfl /* PSL */ + pushfl /* XXX */ /* PSL */ popl PCB_PSL(%edx) /* Test if debug registers should be saved. */ testl $PCB_DBREGS,PCB_FLAGS(%edx) @@ -162,10 +162,10 @@ cmpl %eax,IdlePTD /* Kernel address space? */ #endif je sw1 - movl %cr3,%ebx /* The same address space? */ + READ_CR3(%ebx) cmpl %ebx,%eax je sw1 - movl %eax,%cr3 /* new address space */ + LOAD_CR3(%eax) /* new address space */ /* Release bit from old pmap->pm_active */ movl PCPU(CURPMAP), %ebx @@ -185,6 +185,8 @@ btsl %esi, PM_ACTIVE(%ebx) /* set new */ sw1: + /* only one task selector under Xen */ +#ifndef XEN /* * At this point, we've switched address spaces and are ready * to load up the rest of the next context. @@ -220,8 +222,23 @@ movl %esi, 4(%ebx) movl $GPROC0_SEL*8, %esi /* GSEL(GPROC0_SEL, SEL_KPL) */ ltr %si +#else + /* notify Xen of task switch */ + pushl %edx /* &pcb is the new stack base */ + pushl $KDSEL + pushl $HYPERVISOR_STACK_SWITCH + call ni_queue_multicall2 + addl $12,%esp + /* XXX handle DOM0 IOPL case here (KMM) */ + /* we currently don't support running FreeBSD */ + /* in DOM0 so we can skip for now */ + + call ni_execute_multicall_list + +#endif /* XEN */ 3: +#ifndef XEN /* XXX skip updating selectors for the moment */ /* Copy the %fs and %gs selectors into this pcpu gdt */ leal PCB_FSD(%edx), %esi movl PCPU(FSGS_GDT), %edi @@ -233,7 +250,7 @@ movl 12(%esi), %ebx movl %eax, 8(%edi) movl %ebx, 12(%edi) - +#endif /* Restore context. */ movl PCB_EBX(%edx),%ebx movl PCB_ESP(%edx),%esp @@ -243,11 +260,9 @@ movl PCB_EIP(%edx),%eax movl %eax,(%esp) pushl PCB_PSL(%edx) - popfl - + popfl /* XXX */ movl %edx, PCPU(CURPCB) movl %ecx, PCPU(CURTHREAD) /* into next thread */ - /* * Determine the LDT to use and load it if is the default one and * that is not the current one. @@ -258,7 +273,7 @@ movl _default_ldt,%eax cmpl PCPU(CURRENTLDT),%eax je 2f - lldt _default_ldt + LLDT(_default_ldt) movl %eax,PCPU(CURRENTLDT) jmp 2f 1: @@ -335,7 +350,7 @@ movl (%esp),%eax movl %eax,PCB_EIP(%ecx) - movl %cr3,%eax + READ_CR3(%eax) movl %eax,PCB_CR3(%ecx) movl %ebx,PCB_EBX(%ecx) @@ -344,7 +359,7 @@ movl %esi,PCB_ESI(%ecx) movl %edi,PCB_EDI(%ecx) movl %gs,PCB_GS(%ecx) - pushfl + pushfl /* XXX */ popl PCB_PSL(%ecx) #ifdef DEV_NPX @@ -360,8 +375,8 @@ * have to handle h/w bugs for reloading. We used to lose the * parent's npx state for forks by forgetting to reload. */ - pushfl - cli + pushfl /* XXX */ + CLI movl PCPU(FPCURTHREAD),%eax testl %eax,%eax je 1f @@ -383,7 +398,7 @@ call bcopy addl $12,%esp 1: - popfl + popfl /* XXX */ #endif /* DEV_NPX */ ret ==== //depot/projects/xen3/src/sys/i386/i386/sys_machdep.c#2 (text+ko) ==== @@ -55,6 +55,13 @@ #include <machine/pcb_ext.h> #include <machine/proc.h> #include <machine/sysarch.h> +#ifdef XEN +#include <machine/xenfunc.h> +void i386_reset_ldt(struct proc_ldt *pldt); +#else +#define i386_reset_ldt(x) + +#endif #include <vm/vm_kern.h> /* for kernel_map */ @@ -163,7 +170,11 @@ */ sd.sd_lobase = base & 0xffffff; sd.sd_hibase = (base >> 24) & 0xff; +#ifndef XEN sd.sd_lolimit = 0xffff; /* 4GB limit, wraps around */ +#else + sd.sd_lolimit = 0x0; /* 4GB limit, wraps around */ +#endif sd.sd_hilimit = 0xf; sd.sd_type = SDT_MEMRWA; sd.sd_dpl = SEL_UPL; @@ -173,7 +184,11 @@ sd.sd_gran = 1; critical_enter(); td->td_pcb->pcb_fsd = sd; +#ifndef XEN PCPU_GET(fsgs_gdt)[0] = sd; +#else + HYPERVISOR_update_descriptor(vtomach(&PCPU_GET(fsgs_gdt)[1]), *(uint64_t *)&sd); +#endif critical_exit(); td->td_frame->tf_fs = GSEL(GUFS_SEL, SEL_UPL); } @@ -193,7 +208,11 @@ */ sd.sd_lobase = base & 0xffffff; sd.sd_hibase = (base >> 24) & 0xff; +#ifndef XEN sd.sd_lolimit = 0xffff; /* 4GB limit, wraps around */ +#else + sd.sd_lolimit = 0x0; /* 4GB limit, wraps around */ +#endif sd.sd_hilimit = 0xf; sd.sd_type = SDT_MEMRWA; sd.sd_dpl = SEL_UPL; @@ -203,7 +222,11 @@ sd.sd_gran = 1; critical_enter(); td->td_pcb->pcb_gsd = sd; +#ifndef XEN PCPU_GET(fsgs_gdt)[1] = sd; +#else + HYPERVISOR_update_descriptor(vtomach(&PCPU_GET(fsgs_gdt)[1]), *(uint64_t *)&sd); +#endif critical_exit(); load_gs(GSEL(GUGS_SEL, SEL_UPL)); } @@ -364,6 +387,7 @@ struct proc_ldt *pldt; pldt = mdp->md_ldt; +#ifndef XEN #ifdef SMP gdt[PCPU_GET(cpuid) * NGDT + GUSERLDT_SEL].sd = pldt->ldt_sd; #else @@ -371,6 +395,11 @@ #endif lldt(GSEL(GUSERLDT_SEL, SEL_KPL)); PCPU_SET(currentldt, GSEL(GUSERLDT_SEL, SEL_KPL)); + +#else + i386_reset_ldt(pldt); + PCPU_SET(currentldt, (int)pldt); +#endif } #ifdef SMP @@ -385,6 +414,7 @@ } #endif +#ifdef XEN /* * Must be called with either sched_lock free or held but not recursed. * If it does not return NULL, it will return with it owned. @@ -402,6 +432,48 @@ new_ldt->ldt_len = len = NEW_MAX_LD(len); new_ldt->ldt_base = (caddr_t)kmem_alloc(kernel_map, + round_page(len * sizeof(union descriptor))); + if (new_ldt->ldt_base == NULL) { + FREE(new_ldt, M_SUBPROC); + return NULL; + } + new_ldt->ldt_refcnt = 1; + new_ldt->ldt_active = 0; + + mtx_lock_spin(&sched_lock); + + if ((pldt = mdp->md_ldt)) { + if (len > pldt->ldt_len) + len = pldt->ldt_len; + bcopy(pldt->ldt_base, new_ldt->ldt_base, + len * sizeof(union descriptor)); + } else { + bcopy(ldt, new_ldt->ldt_base, PAGE_SIZE); + } + pmap_map_readonly(kernel_pmap, (vm_offset_t)new_ldt->ldt_base, + new_ldt->ldt_len*sizeof(union descriptor)); + return new_ldt; +} +void +i386_reset_ldt(struct proc_ldt *pldt) +{ + xen_set_ldt((vm_offset_t)pldt->ldt_base, pldt->ldt_len); +} + +#else +struct proc_ldt * +user_ldt_alloc(struct mdproc *mdp, int len) +{ + struct proc_ldt *pldt, *new_ldt; + + if (mtx_owned(&sched_lock)) + mtx_unlock_spin(&sched_lock); + mtx_assert(&sched_lock, MA_NOTOWNED); + MALLOC(new_ldt, struct proc_ldt *, sizeof(struct proc_ldt), + M_SUBPROC, M_WAITOK); + + new_ldt->ldt_len = len = NEW_MAX_LD(len); + new_ldt->ldt_base = (caddr_t)kmem_alloc(kernel_map, len * sizeof(union descriptor)); if (new_ldt->ldt_base == NULL) { FREE(new_ldt, M_SUBPROC); @@ -426,6 +498,8 @@ return new_ldt; } +#endif + /* * Must be called either with sched_lock free or held but not recursed. * If md_ldt is not NULL, it will return with sched_lock released. @@ -443,13 +517,18 @@ mtx_lock_spin(&sched_lock); mtx_assert(&sched_lock, MA_OWNED | MA_NOTRECURSED); if (td == PCPU_GET(curthread)) { +#ifndef XEN lldt(_default_ldt); +#endif PCPU_SET(currentldt, _default_ldt); + i386_reset_ldt((struct proc_ldt *)_default_ldt); } mdp->md_ldt = NULL; if (--pldt->ldt_refcnt == 0) { mtx_unlock_spin(&sched_lock); + pmap_map_readwrite(kernel_pmap, (vm_offset_t)pldt->ldt_base, + pldt->ldt_len*sizeof(union descriptor)); kmem_free(kernel_map, (vm_offset_t)pldt->ldt_base, pldt->ldt_len * sizeof(union descriptor)); FREE(pldt, M_SUBPROC); @@ -629,6 +708,9 @@ /* Allocate a free slot */ pldt = mdp->md_ldt; if (pldt == NULL) { +#ifdef XEN + load_gs(0); /* XXX check if we really still need this */ +#endif error = i386_ldt_grow(td, NLDT + 1); if (error) return (error); @@ -677,13 +759,23 @@ { struct mdproc *mdp = &td->td_proc->p_md; struct proc_ldt *pldt = mdp->md_ldt; - +#ifdef XEN + int i, error; +#endif mtx_assert(&sched_lock, MA_OWNED); - +#ifndef XEN /* Fill in range */ bcopy(descs, &((union descriptor *)(pldt->ldt_base))[start], num * sizeof(union descriptor)); +#else + for (i = 0; i < num; i++) { + error = HYPERVISOR_update_descriptor(vtomach(&((union descriptor *)(pldt->ldt_base))[start + i]), + *(uint64_t *)(descs + i)); + if (error) + panic("failed to update ldt: %d", error); + } +#endif return (0); } @@ -719,6 +811,9 @@ pldt->ldt_base = new_ldt->ldt_base; pldt->ldt_len = new_ldt->ldt_len; mtx_unlock_spin(&sched_lock); + pmap_map_readwrite(kernel_pmap, + (vm_offset_t)old_ldt_base, + old_ldt_len*sizeof(union descriptor)); kmem_free(kernel_map, (vm_offset_t)old_ldt_base, old_ldt_len * sizeof(union descriptor)); FREE(new_ldt, M_SUBPROC); @@ -729,6 +824,9 @@ * do nothing. */ mtx_unlock_spin(&sched_lock); + pmap_map_readwrite(kernel_pmap, + (vm_offset_t)new_ldt->ldt_base, + new_ldt->ldt_len*sizeof(union descriptor)); kmem_free(kernel_map, (vm_offset_t)new_ldt->ldt_base, new_ldt->ldt_len * sizeof(union descriptor)); ==== //depot/projects/xen3/src/sys/i386/i386/trap.c#2 (text+ko) ==== @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/i386/i386/trap.c,v 1.285 2005/11/18 19:26:46 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/i386/trap.c,v 1.284 2005/11/05 10:42:40 phk Exp $"); /* * 386 Trap and System call handling @@ -101,6 +101,13 @@ #include <machine/clock.h> #endif +#ifdef XEN +#include <machine/xenfunc.h> +#include <machine/hypervisor.h> +#include <machine/xenvar.h> +#include <machine/hypervisor-ifs.h> +#endif + extern void trap(struct trapframe frame); extern void syscall(struct trapframe frame); @@ -129,7 +136,7 @@ "alignment fault", /* 14 T_ALIGNFLT */ "", /* 15 unused */ "", /* 16 unused */ - "", /* 17 unused */ + "hypervisor callback", /* 17 T_HYPCALLBACK */ "integer divide fault", /* 18 T_DIVIDE */ "non-maskable interrupt trap", /* 19 T_NMI */ "overflow trap", /* 20 T_OFLOW */ @@ -217,7 +224,7 @@ TRAPF_USERMODE(&frame))) goto out; #endif - +#ifndef XEN if ((frame.tf_eflags & PSL_I) == 0) { /* * Buggy application or kernel code has disabled @@ -248,9 +255,18 @@ enable_intr(); } } - +#endif eva = 0; code = frame.tf_err; +#ifdef XEN + if (type == T_HYPCALLBACK) { + evtchn_do_upcall(&frame); + if (ISPL(frame.tf_cs) == SEL_KPL) + goto out; + goto userout; + } else if (type == 0) + panic("invalid trap type/code %d/%d\n",type, code); +#endif if (type == T_PAGEFLT) { /* * For some Cyrix CPUs, %cr2 is clobbered by @@ -788,8 +804,9 @@ code = frame->tf_err; type = frame->tf_trapno; +#ifndef XEN sdtossd(&gdt[IDXSEL(frame->tf_cs & 0xffff)].sd, &softseg); - +#endif if (type <= MAX_TRAP_MSG) msg = trap_msg[type]; else ==== //depot/projects/xen3/src/sys/i386/i386/vm_machdep.c#2 (text+ko) ==== @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.267 2005/11/14 00:43:44 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.266 2005/11/09 12:22:26 nyan Exp $"); #include "opt_isa.h" #include "opt_npx.h" @@ -102,7 +102,9 @@ #ifndef NSFBUFS #define NSFBUFS (512 + maxusers * 16) #endif - +#ifdef XEN +#include <machine/xenfunc.h> +#endif static void cpu_reset_real(void); #ifdef SMP static void cpu_reset_proxy(void); @@ -728,8 +730,11 @@ */ ptep = vtopte(sf->kva); opte = *ptep; +#ifndef XEN *ptep = VM_PAGE_TO_PHYS(m) | pgeflag | PG_RW | PG_V; - +#else + PT_SET_VA(ptep, VM_PAGE_TO_PHYS(m) | pgeflag | PG_RW | PG_V, TRUE); +#endif /* * Avoid unnecessary TLB invalidations: If the sf_buf's old * virtual-to-physical mapping was not used, then any processor @@ -780,6 +785,11 @@ if (sf->ref_count == 0) { TAILQ_INSERT_TAIL(&sf_buf_freelist, sf, free_entry); nsfbufsused--; +#ifdef XEN + pmap_qremove(sf->kva, 1); + sf->m = NULL; + LIST_REMOVE(sf, list_entry); +#endif if (sf_buf_alloc_want > 0) wakeup_one(&sf_buf_freelist); } ==== //depot/projects/xen3/src/sys/i386/include/asmacros.h#2 (text+ko) ==== @@ -172,6 +172,36 @@ movl $KPSEL, %eax ; /* reload with per-CPU data segment */ \ movl %eax, %fs +#ifdef XEN +#define LOAD_CR3(reg) \ + movl reg,PCPU(CR3); \ + pushl %ecx ; \ + pushl %edx ; \ + pushl %esi ; \ + pushl reg ; \ + call xen_load_cr3 ; \ + addl $4,%esp ; \ + popl %esi ; \ + popl %edx ; \ + popl %ecx ; \ + +#define READ_CR3(reg) movl PCPU(CR3),reg; +#define LLDT(arg) \ + pushl %edx ; \ + pushl %eax ; \ + xorl %eax,%eax ; \ + movl %eax,%gs ; \ + call i386_reset_ldt ; \ + popl %eax ; \ + popl %edx +#define CLI call ni_cli +#else +#define LOAD_CR3(reg) movl reg,%cr3; +#define READ_CR3(reg) movl %cr3,reg; +#define LLDT(arg) lldt arg; +#define CLI cli +#endif + #endif /* LOCORE */ #endif /* !_MACHINE_ASMACROS_H_ */ ==== //depot/projects/xen3/src/sys/i386/include/pcpu.h#2 (text+ko) ==== @@ -45,6 +45,7 @@ * to each CPU's data can be set up for things like "check curproc on all * other processors" */ +#ifndef XEN #define PCPU_MD_FIELDS \ struct pcpu *pc_prvspace; /* Self-reference */ \ struct pmap *pc_curpmap; \ @@ -57,6 +58,25 @@ u_int pc_apic_id; \ int pc_private_tss /* flag indicating private tss */ + +#else +#define PCPU_MD_FIELDS \ + struct pcpu *pc_prvspace; /* Self-reference */ \ + struct pmap *pc_curpmap; \ + struct i386tss pc_common_tss; \ + struct segment_descriptor pc_common_tssd; \ + struct segment_descriptor *pc_tss_gdt; \ + struct segment_descriptor *pc_fsgs_gdt; \ + int pc_currentldt; \ + u_int pc_acpi_id; \ + u_int pc_apic_id; \ + int pc_private_tss; /* flag indicating private tss */ \ + u_int pc_cr3; \ + u_int pc_pdir; \ + u_int pc_lazypmap; \ + u_int pc_rendezvous; \ + u_int pc_cpuast; +#endif #if defined(lint) extern struct pcpu *pcpup; ==== //depot/projects/xen3/src/sys/i386/include/pmap.h#2 (text+ko) ==== @@ -368,6 +368,8 @@ #endif /* _KERNEL */ +static __inline void pmap_map_readonly(pmap_t pmap, vm_offset_t va, int len) {} +static __inline void pmap_map_readwrite(pmap_t pmap, vm_offset_t va, int len) {} #endif /* !LOCORE */ #endif /* !_MACHINE_PMAP_H_ */ ==== //depot/projects/xen3/src/sys/i386/include/segments.h#2 (text+ko) ==== @@ -47,7 +47,11 @@ */ #define ISPL(s) ((s)&3) /* what is the priority level of a selector */ +#ifdef XEN +#define SEL_KPL 1 /* kernel priority level */ +#else #define SEL_KPL 0 /* kernel priority level */ +#endif #define SEL_UPL 3 /* user priority level */ #define ISLDT(s) ((s)&SEL_LDT) /* is it local or global */ #define SEL_LDT 4 /* local descriptor table */ @@ -206,8 +210,13 @@ #define GPRIV_SEL 1 /* SMP Per-Processor Private Data */ #define GUFS_SEL 2 /* User %fs Descriptor (order critical: 1) */ #define GUGS_SEL 3 /* User %gs Descriptor (order critical: 2) */ +#ifdef XEN +#define GCODE_SEL (__KERNEL_CS >> 3) /* Kernel Code Descriptor (order critical: 1) */ +#define GDATA_SEL (__KERNEL_DS >> 3) /* Kernel Data Descriptor (order critical: 2) */ +#else #define GCODE_SEL 4 /* Kernel Code Descriptor (order critical: 1) */ #define GDATA_SEL 5 /* Kernel Data Descriptor (order critical: 2) */ +#endif #define GUCODE_SEL 6 /* User Code Descriptor (order critical: 3) */ #define GUDATA_SEL 7 /* User Data Descriptor (order critical: 4) */ #define GBIOSLOWMEM_SEL 8 /* BIOS low memory access (must be entry 8) */ @@ -222,8 +231,11 @@ #define GBIOSARGS_SEL 17 /* BIOS interface (Arguments) */ #define GNDIS_SEL 18 /* For the NDIS layer */ +#ifdef XEN +#define NGDT 8 +#else #define NGDT 19 - +#endif /* * Entries in the Local Descriptor Table (LDT) */ @@ -240,10 +252,15 @@ #ifdef _KERNEL extern int _default_ldt; +#ifdef XEN +extern union descriptor *gdt; +extern union descriptor *ldt; +#else extern union descriptor gdt[]; +extern union descriptor ldt[NLDT]; +#endif extern struct soft_segment_descriptor gdt_segs[]; extern struct gate_descriptor *idt; -extern union descriptor ldt[NLDT]; extern struct region_descriptor r_gdt, r_idt; void lgdt(struct region_descriptor *rdp); ==== //depot/projects/xen3/src/sys/i386/include/trap.h#2 (text+ko) ==== @@ -49,6 +49,7 @@ #define T_PAGEFLT 12 /* page fault */ #define T_ALIGNFLT 14 /* alignment fault */ +#define T_HYPCALLBACK 17 /* hypervisor callback */ #define T_DIVIDE 18 /* integer divide fault */ #define T_NMI 19 /* non-maskable trap */ #define T_OFLOW 20 /* overflow trap */ ==== //depot/projects/xen3/src/sys/i386/isa/npx.c#2 (text+ko) ==== @@ -101,9 +101,14 @@ #define fxsave(addr) __asm __volatile("fxsave %0" : "=m" (*(addr))) >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601030808.k0388nx2050655>