[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] linux/x86: use sysenter/syscall for 32-bit apps on 64-bit Xen
# HG changeset patch # User Keir Fraser <keir@xxxxxxxxxxxxx> # Date 1193242629 -3600 # Node ID 26962454b508b60bb4472e004d3dd6b498ccf32f # Parent 32df30e24087e1d8dd0b5de78f8b5c2713dfdf42 linux/x86: use sysenter/syscall for 32-bit apps on 64-bit Xen for both 32-bit apps on 64-bit kernels and 32bit kernels. Also removing the needless re-enabling of events on x86-64's 64-bit syscall path as well as it's 32-bit int80 path (the latter accompanied by telling Xen not to disable them in the first place). Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- arch/i386/kernel/entry-xen.S | 23 ++++ arch/i386/kernel/sysenter.c | 46 +++++--- arch/x86_64/ia32/Makefile | 17 +-- arch/x86_64/ia32/ia32entry-xen.S | 166 ++++++++----------------------- arch/x86_64/ia32/syscall32-xen.c | 49 +++++---- arch/x86_64/ia32/syscall32_syscall-xen.S | 2 arch/x86_64/kernel/entry-xen.S | 7 - arch/x86_64/kernel/traps-xen.c | 2 buildconfigs/linux-defconfig_xen0_ia64 | 1 buildconfigs/linux-defconfig_xen0_x86_32 | 1 buildconfigs/linux-defconfig_xen0_x86_64 | 1 buildconfigs/linux-defconfig_xenU_ia64 | 1 buildconfigs/linux-defconfig_xenU_x86_32 | 1 buildconfigs/linux-defconfig_xenU_x86_64 | 1 buildconfigs/linux-defconfig_xen_ia64 | 1 buildconfigs/linux-defconfig_xen_x86_32 | 1 buildconfigs/linux-defconfig_xen_x86_64 | 1 drivers/xen/Kconfig | 6 - drivers/xen/core/smpboot.c | 1 include/xen/interface/callback.h | 37 ++++++ include/xen/interface/xen-compat.h | 2 21 files changed, 188 insertions(+), 179 deletions(-) diff -r 32df30e24087 -r 26962454b508 arch/i386/kernel/entry-xen.S --- a/arch/i386/kernel/entry-xen.S Tue Oct 23 10:23:00 2007 -0600 +++ b/arch/i386/kernel/entry-xen.S Wed Oct 24 17:17:09 2007 +0100 @@ -381,6 +381,29 @@ sysexit_ecrit: /**** END OF SYSEXIT CRIT #endif /* !CONFIG_XEN */ CFI_ENDPROC + # pv sysenter call handler stub +ENTRY(sysenter_entry_pv) + RING0_INT_FRAME + movl $__USER_DS,16(%esp) + movl %ebp,12(%esp) + movl $__USER_CS,4(%esp) + addl $4,%esp + /* +5*4 is SS:ESP,EFLAGS,CS:EIP. +8 is esp0 setting. */ + pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp) +/* + * Load the potential sixth argument from user stack. + * Careful about security. + */ + cmpl $__PAGE_OFFSET-3,%ebp + jae syscall_fault +1: movl (%ebp),%ebp +.section __ex_table,"a" + .align 4 + .long 1b,syscall_fault +.previous + /* fall through */ + CFI_ENDPROC +ENDPROC(sysenter_entry_pv) # system call handler stub ENTRY(system_call) diff -r 32df30e24087 -r 26962454b508 arch/i386/kernel/sysenter.c --- a/arch/i386/kernel/sysenter.c Tue Oct 23 10:23:00 2007 -0600 +++ b/arch/i386/kernel/sysenter.c Wed Oct 24 17:17:09 2007 +0100 @@ -48,7 +48,7 @@ extern asmlinkage void sysenter_entry(vo void enable_sep_cpu(void) { -#ifndef CONFIG_X86_NO_TSS +#ifndef CONFIG_XEN int cpu = get_cpu(); struct tss_struct *tss = &per_cpu(init_tss, cpu); @@ -62,8 +62,36 @@ void enable_sep_cpu(void) wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0); wrmsr(MSR_IA32_SYSENTER_ESP, tss->esp1, 0); wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) sysenter_entry, 0); - put_cpu(); -#endif +#else + extern asmlinkage void sysenter_entry_pv(void); + static struct callback_register sysenter = { + .type = CALLBACKTYPE_sysenter, + .address = { __KERNEL_CS, (unsigned long)sysenter_entry_pv }, + }; + + if (!boot_cpu_has(X86_FEATURE_SEP)) + return; + + get_cpu(); + + if (xen_feature(XENFEAT_supervisor_mode_kernel)) + sysenter.address.eip = (unsigned long)sysenter_entry; + + switch (HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter)) { + case 0: + break; +#if CONFIG_XEN_COMPAT < 0x030200 + case -ENOSYS: + sysenter.type = CALLBACKTYPE_sysenter_deprecated; + if (HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter) == 0) + break; +#endif + default: + clear_bit(X86_FEATURE_SEP, boot_cpu_data.x86_capability); + break; + } +#endif + put_cpu(); } /* @@ -77,18 +105,6 @@ int __init sysenter_setup(void) int __init sysenter_setup(void) { syscall_page = (void *)get_zeroed_page(GFP_ATOMIC); - -#ifdef CONFIG_XEN - if (boot_cpu_has(X86_FEATURE_SEP)) { - static struct callback_register __initdata sysenter = { - .type = CALLBACKTYPE_sysenter, - .address = { __KERNEL_CS, (unsigned long)sysenter_entry }, - }; - - if (HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter) < 0) - clear_bit(X86_FEATURE_SEP, boot_cpu_data.x86_capability); - } -#endif #ifdef CONFIG_COMPAT_VDSO __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY); diff -r 32df30e24087 -r 26962454b508 arch/x86_64/ia32/Makefile --- a/arch/x86_64/ia32/Makefile Tue Oct 23 10:23:00 2007 -0600 +++ b/arch/x86_64/ia32/Makefile Wed Oct 24 17:17:09 2007 +0100 @@ -14,11 +14,14 @@ audit-class-$(CONFIG_AUDIT) := audit.o audit-class-$(CONFIG_AUDIT) := audit.o obj-$(CONFIG_IA32_EMULATION) += $(audit-class-y) +syscall32-types-y := sysenter syscall +syscall32-types-$(subst 1,$(CONFIG_XEN),$(shell expr $(CONFIG_XEN_COMPAT)0 '<' 0x0302000)) += int80 + $(obj)/syscall32_syscall.o: \ - $(foreach F,sysenter syscall,$(obj)/vsyscall-$F.so) + $(foreach F,$(syscall32-types-y),$(obj)/vsyscall-$F.so) # Teach kbuild about targets -targets := $(foreach F,sysenter syscall,vsyscall-$F.o vsyscall-$F.so) +targets := $(foreach F,$(syscall32-types-y),vsyscall-$F.o vsyscall-$F.so) # The DSO images are built using a special linker script quiet_cmd_syscall = SYSCALL $@ @@ -27,18 +30,10 @@ quiet_cmd_syscall = SYSCALL $@ -Wl,-soname=linux-gate.so.1 -o $@ \ -Wl,-T,$(filter-out FORCE,$^) -$(obj)/vsyscall-int80.so \ -$(obj)/vsyscall-sysenter.so $(obj)/vsyscall-syscall.so: \ +$(foreach F,$(syscall32-types-y),$(obj)/vsyscall-$F.so): \ $(obj)/vsyscall-%.so: $(src)/vsyscall.lds $(obj)/vsyscall-%.o FORCE $(call if_changed,syscall) AFLAGS_vsyscall-sysenter.o = -m32 -Wa,-32 -Iarch/i386/kernel AFLAGS_vsyscall-syscall.o = -m32 -Wa,-32 -Iarch/i386/kernel - -ifdef CONFIG_XEN AFLAGS_vsyscall-int80.o = -m32 -Wa,-32 -Iarch/i386/kernel -CFLAGS_syscall32.o += -DUSE_INT80 -AFLAGS_syscall32_syscall.o += -DUSE_INT80 - -$(obj)/syscall32_syscall.o: $(obj)/vsyscall-int80.so -endif diff -r 32df30e24087 -r 26962454b508 arch/x86_64/ia32/ia32entry-xen.S --- a/arch/x86_64/ia32/ia32entry-xen.S Tue Oct 23 10:23:00 2007 -0600 +++ b/arch/x86_64/ia32/ia32entry-xen.S Wed Oct 24 17:17:09 2007 +0100 @@ -92,7 +92,7 @@ * %ebp user stack * 0(%ebp) Arg6 * - * Interrupts off. + * Interrupts on. * * This is purely a fast path. For anything complicated we use the int 0x80 * path below. Set up a complete hardware stack frame to share code @@ -100,38 +100,26 @@ */ ENTRY(ia32_sysenter_target) CFI_STARTPROC32 simple - CFI_DEF_CFA rsp,0 - CFI_REGISTER rsp,rbp - __swapgs - movq %gs:pda_kernelstack, %rsp - addq $(PDA_STACKOFFSET),%rsp - /* - * No need to follow this irqs on/off section: the syscall - * disabled irqs, here we enable it straight after entry: - */ - XEN_UNBLOCK_EVENTS(%r11) - __sti + CFI_DEF_CFA rsp,SS+8-RIP+16 + /*CFI_REL_OFFSET ss,SS-RIP+16*/ + CFI_REL_OFFSET rsp,RSP-RIP+16 + /*CFI_REL_OFFSET rflags,EFLAGS-RIP+16*/ + /*CFI_REL_OFFSET cs,CS-RIP+16*/ + CFI_REL_OFFSET rip,RIP-RIP+16 + CFI_REL_OFFSET r11,8 + CFI_REL_OFFSET rcx,0 + movq 8(%rsp),%r11 + CFI_RESTORE r11 + popq %rcx + CFI_ADJUST_CFA_OFFSET -8 + CFI_RESTORE rcx movl %ebp,%ebp /* zero extension */ - pushq $__USER32_DS - CFI_ADJUST_CFA_OFFSET 8 - /*CFI_REL_OFFSET ss,0*/ - pushq %rbp - CFI_ADJUST_CFA_OFFSET 8 - CFI_REL_OFFSET rsp,0 - pushfq - CFI_ADJUST_CFA_OFFSET 8 - /*CFI_REL_OFFSET rflags,0*/ - movl $VSYSCALL32_SYSEXIT, %r10d - CFI_REGISTER rip,r10 - pushq $__USER32_CS - CFI_ADJUST_CFA_OFFSET 8 - /*CFI_REL_OFFSET cs,0*/ - movl %eax, %eax - pushq %r10 - CFI_ADJUST_CFA_OFFSET 8 - CFI_REL_OFFSET rip,0 - pushq %rax - CFI_ADJUST_CFA_OFFSET 8 + movl %eax,%eax + movl $__USER32_DS,40(%rsp) + movq %rbp,32(%rsp) + movl $__USER32_CS,16(%rsp) + movl $VSYSCALL32_SYSEXIT,8(%rsp) + movq %rax,(%rsp) cld SAVE_ARGS 0,0,0 /* no need to do an access_ok check here because rbp has been @@ -143,7 +131,6 @@ 1: movl (%rbp),%r9d GET_THREAD_INFO(%r10) orl $TS_COMPAT,threadinfo_status(%r10) testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10) - CFI_REMEMBER_STATE jnz sysenter_tracesys sysenter_do_call: cmpl $(IA32_NR_syscalls-1),%eax @@ -151,33 +138,9 @@ sysenter_do_call: IA32_ARG_FIXUP 1 call *ia32_sys_call_table(,%rax,8) movq %rax,RAX-ARGOFFSET(%rsp) - GET_THREAD_INFO(%r10) - XEN_BLOCK_EVENTS(%r11) - __cli - TRACE_IRQS_OFF - testl $_TIF_ALLWORK_MASK,threadinfo_flags(%r10) - jnz int_ret_from_sys_call - andl $~TS_COMPAT,threadinfo_status(%r10) - /* clear IF, that popfq doesn't enable interrupts early */ - andl $~0x200,EFLAGS-R11(%rsp) - RESTORE_ARGS 1,24,1,1,1,1 - popfq - CFI_ADJUST_CFA_OFFSET -8 - /*CFI_RESTORE rflags*/ - popq %rcx /* User %esp */ - CFI_ADJUST_CFA_OFFSET -8 - CFI_REGISTER rsp,rcx - movl $VSYSCALL32_SYSEXIT,%edx /* User %eip */ - CFI_REGISTER rip,rdx - TRACE_IRQS_ON - __swapgs - XEN_UNBLOCK_EVENTS(%r11) - __sti /* sti only takes effect after the next instruction */ - /* sysexit */ - .byte 0xf, 0x35 /* TBD */ + jmp int_ret_from_sys_call sysenter_tracesys: - CFI_RESTORE_STATE SAVE_REST CLEAR_RREGS movq $-ENOSYS,RAX(%rsp) /* really needed? */ @@ -210,7 +173,7 @@ ENDPROC(ia32_sysenter_target) * %esp user stack * 0(%esp) Arg6 * - * Interrupts off. + * Interrupts on. * * This is purely a fast path. For anything complicated we use the int 0x80 * path below. Set up a complete hardware stack frame to share code @@ -218,32 +181,20 @@ ENDPROC(ia32_sysenter_target) */ ENTRY(ia32_cstar_target) CFI_STARTPROC32 simple - CFI_DEF_CFA rsp,PDA_STACKOFFSET - CFI_REGISTER rip,rcx - /*CFI_REGISTER rflags,r11*/ - __swapgs - movl %esp,%r8d - CFI_REGISTER rsp,r8 - movq %gs:pda_kernelstack,%rsp - /* - * No need to follow this irqs on/off section: the syscall - * disabled irqs and here we enable it straight after entry: - */ - XEN_UNBLOCK_EVENTS(%r11) - __sti - SAVE_ARGS 8,1,1 + CFI_DEF_CFA rsp,SS+8-RIP+16 + /*CFI_REL_OFFSET ss,SS-RIP+16*/ + CFI_REL_OFFSET rsp,RSP-RIP+16 + /*CFI_REL_OFFSET rflags,EFLAGS-RIP+16*/ + /*CFI_REL_OFFSET cs,CS-RIP+16*/ + CFI_REL_OFFSET rip,RIP-RIP+16 movl %eax,%eax /* zero extension */ + movl RSP-RIP+16(%rsp),%r8d + SAVE_ARGS -8,1,1 movq %rax,ORIG_RAX-ARGOFFSET(%rsp) - movq %rcx,RIP-ARGOFFSET(%rsp) - CFI_REL_OFFSET rip,RIP-ARGOFFSET movq %rbp,RCX-ARGOFFSET(%rsp) /* this lies slightly to ptrace */ movl %ebp,%ecx - movq $__USER32_CS,CS-ARGOFFSET(%rsp) - movq $__USER32_DS,SS-ARGOFFSET(%rsp) - movq %r11,EFLAGS-ARGOFFSET(%rsp) - /*CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/ - movq %r8,RSP-ARGOFFSET(%rsp) - CFI_REL_OFFSET rsp,RSP-ARGOFFSET + movl $__USER32_CS,CS-ARGOFFSET(%rsp) + movl $__USER32_DS,SS-ARGOFFSET(%rsp) /* no need to do an access_ok check here because r8 has been 32bit zero extended */ /* hardware stack frame is complete now */ @@ -254,7 +205,6 @@ 1: movl (%r8),%r9d GET_THREAD_INFO(%r10) orl $TS_COMPAT,threadinfo_status(%r10) testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10) - CFI_REMEMBER_STATE jnz cstar_tracesys cstar_do_call: cmpl $IA32_NR_syscalls-1,%eax @@ -262,26 +212,9 @@ cstar_do_call: IA32_ARG_FIXUP 1 call *ia32_sys_call_table(,%rax,8) movq %rax,RAX-ARGOFFSET(%rsp) - GET_THREAD_INFO(%r10) - XEN_BLOCK_EVENTS(%r11) - __cli - TRACE_IRQS_OFF - testl $_TIF_ALLWORK_MASK,threadinfo_flags(%r10) - jnz int_ret_from_sys_call - andl $~TS_COMPAT,threadinfo_status(%r10) - RESTORE_ARGS 1,-ARG_SKIP,1,1,1 - movl RIP-ARGOFFSET(%rsp),%ecx - CFI_REGISTER rip,rcx - movl EFLAGS-ARGOFFSET(%rsp),%r11d - /*CFI_REGISTER rflags,r11*/ - TRACE_IRQS_ON - movl RSP-ARGOFFSET(%rsp),%esp - CFI_RESTORE rsp - __swapgs - sysretl /* TBD */ + jmp int_ret_from_sys_call cstar_tracesys: - CFI_RESTORE_STATE SAVE_REST CLEAR_RREGS movq $-ENOSYS,RAX(%rsp) /* really needed? */ @@ -322,32 +255,27 @@ ia32_badarg: * Arguments are zero extended. For system calls that want sign extension and * take long arguments a wrapper is needed. Most calls can just be called * directly. - * Assumes it is only called from user space and entered with interrupts off. + * Assumes it is only called from user space and entered with interrupts on. */ ENTRY(ia32_syscall) CFI_STARTPROC simple - CFI_DEF_CFA rsp,SS+8-RIP - /*CFI_REL_OFFSET ss,SS-RIP*/ - CFI_REL_OFFSET rsp,RSP-RIP - /*CFI_REL_OFFSET rflags,EFLAGS-RIP*/ - /*CFI_REL_OFFSET cs,CS-RIP*/ - CFI_REL_OFFSET rip,RIP-RIP - __swapgs - /* - * No need to follow this irqs on/off section: the syscall - * disabled irqs and here we enable it straight after entry: - */ - XEN_UNBLOCK_EVENTS(%r11) - __sti - movq (%rsp),%rcx + CFI_DEF_CFA rsp,SS+8-RIP+16 + /*CFI_REL_OFFSET ss,SS-RIP+16*/ + CFI_REL_OFFSET rsp,RSP-RIP+16 + /*CFI_REL_OFFSET rflags,EFLAGS-RIP+16*/ + /*CFI_REL_OFFSET cs,CS-RIP+16*/ + CFI_REL_OFFSET rip,RIP-RIP+16 + CFI_REL_OFFSET r11,8 + CFI_REL_OFFSET rcx,0 movq 8(%rsp),%r11 - addq $0x10,%rsp /* skip rcx and r11 */ + CFI_RESTORE r11 + popq %rcx + CFI_ADJUST_CFA_OFFSET -8 + CFI_RESTORE rcx movl %eax,%eax - pushq %rax - CFI_ADJUST_CFA_OFFSET 8 + movq %rax,(%rsp) cld -/* 1: jmp 1b */ /* note the registers are not zero extended to the sf. this could be a problem. */ SAVE_ARGS 0,0,1 diff -r 32df30e24087 -r 26962454b508 arch/x86_64/ia32/syscall32-xen.c --- a/arch/x86_64/ia32/syscall32-xen.c Tue Oct 23 10:23:00 2007 -0600 +++ b/arch/x86_64/ia32/syscall32-xen.c Wed Oct 24 17:17:09 2007 +0100 @@ -13,17 +13,18 @@ #include <asm/proto.h> #include <asm/tlbflush.h> #include <asm/ia32_unistd.h> +#include <xen/interface/callback.h> -#ifdef USE_INT80 -extern unsigned char syscall32_int80[], syscall32_int80_end[]; -#endif extern unsigned char syscall32_syscall[], syscall32_syscall_end[]; extern unsigned char syscall32_sysenter[], syscall32_sysenter_end[]; extern int sysctl_vsyscall32; char *syscall32_page; -#ifndef USE_INT80 static int use_sysenter = -1; + +#if CONFIG_XEN_COMPAT < 0x030200 +extern unsigned char syscall32_int80[], syscall32_int80_end[]; +static int use_int80 = 1; #endif static struct page * @@ -86,13 +87,12 @@ static int __init init_syscall32(void) if (!syscall32_page) panic("Cannot allocate syscall32 page"); -#ifdef USE_INT80 - /* - * At this point we use int 0x80. - */ - memcpy(syscall32_page, syscall32_int80, - syscall32_int80_end - syscall32_int80); -#else +#if CONFIG_XEN_COMPAT < 0x030200 + if (use_int80) { + memcpy(syscall32_page, syscall32_int80, + syscall32_int80_end - syscall32_int80); + } else +#endif if (use_sysenter > 0) { memcpy(syscall32_page, syscall32_sysenter, syscall32_sysenter_end - syscall32_sysenter); @@ -100,7 +100,6 @@ static int __init init_syscall32(void) memcpy(syscall32_page, syscall32_syscall, syscall32_syscall_end - syscall32_syscall); } -#endif return 0; } @@ -113,16 +112,26 @@ core_initcall(init_syscall32); /* May not be __init: called during resume */ void syscall32_cpu_init(void) { -#ifndef USE_INT80 - if (use_sysenter < 0) - use_sysenter = (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL); + static struct callback_register cstar = { + .type = CALLBACKTYPE_syscall32, + .address = (unsigned long)ia32_cstar_target + }; + static struct callback_register sysenter = { + .type = CALLBACKTYPE_sysenter, + .address = (unsigned long)ia32_sysenter_target + }; /* Load these always in case some future AMD CPU supports SYSENTER from compat mode too. */ - checking_wrmsrl(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS); - checking_wrmsrl(MSR_IA32_SYSENTER_ESP, 0ULL); - checking_wrmsrl(MSR_IA32_SYSENTER_EIP, (u64)ia32_sysenter_target); + if ((HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter) < 0) || + (HYPERVISOR_callback_op(CALLBACKOP_register, &cstar) < 0)) +#if CONFIG_XEN_COMPAT < 0x030200 + return; + use_int80 = 0; +#else + BUG(); +#endif - wrmsrl(MSR_CSTAR, ia32_cstar_target); -#endif + if (use_sysenter < 0) + use_sysenter = (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL); } diff -r 32df30e24087 -r 26962454b508 arch/x86_64/ia32/syscall32_syscall-xen.S --- a/arch/x86_64/ia32/syscall32_syscall-xen.S Tue Oct 23 10:23:00 2007 -0600 +++ b/arch/x86_64/ia32/syscall32_syscall-xen.S Wed Oct 24 17:17:09 2007 +0100 @@ -2,7 +2,7 @@ .section ".init.data","aw" -#ifdef USE_INT80 +#if CONFIG_XEN_COMPAT < 0x030200 .globl syscall32_int80 .globl syscall32_int80_end diff -r 32df30e24087 -r 26962454b508 arch/x86_64/kernel/entry-xen.S --- a/arch/x86_64/kernel/entry-xen.S Tue Oct 23 10:23:00 2007 -0600 +++ b/arch/x86_64/kernel/entry-xen.S Wed Oct 24 17:17:09 2007 +0100 @@ -237,7 +237,7 @@ END(ret_from_fork) * r11 eflags for syscall/sysret, temporary for C * r12-r15,rbp,rbx saved by C code, not touched. * - * Interrupts are off on entry. + * Interrupts are enabled on entry. * Only called from user space. * * XXX if we had a free scratch register we could save the RSP into the stack frame @@ -252,11 +252,6 @@ ENTRY(system_call) _frame (RIP-0x10) SAVE_ARGS -8,0 movq %rax,ORIG_RAX-ARGOFFSET(%rsp) - /* - * No need to follow this irqs off/on section - it's straight - * and short: - */ - XEN_UNBLOCK_EVENTS(%r11) GET_THREAD_INFO(%rcx) testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%rcx) CFI_REMEMBER_STATE diff -r 32df30e24087 -r 26962454b508 arch/x86_64/kernel/traps-xen.c --- a/arch/x86_64/kernel/traps-xen.c Tue Oct 23 10:23:00 2007 -0600 +++ b/arch/x86_64/kernel/traps-xen.c Wed Oct 24 17:17:09 2007 +0100 @@ -1110,7 +1110,7 @@ static trap_info_t trap_table[] = { #endif { 19, 0|4, __KERNEL_CS, (unsigned long)simd_coprocessor_error }, #ifdef CONFIG_IA32_EMULATION - { IA32_SYSCALL_VECTOR, 3|4, __KERNEL_CS, (unsigned long)ia32_syscall}, + { IA32_SYSCALL_VECTOR, 3, __KERNEL_CS, (unsigned long)ia32_syscall}, #endif { 0, 0, 0, 0 } }; diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xen0_ia64 --- a/buildconfigs/linux-defconfig_xen0_ia64 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xen0_ia64 Wed Oct 24 17:17:09 2007 +0100 @@ -1683,6 +1683,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xen0_x86_32 --- a/buildconfigs/linux-defconfig_xen0_x86_32 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xen0_x86_32 Wed Oct 24 17:17:09 2007 +0100 @@ -1421,6 +1421,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xen0_x86_64 --- a/buildconfigs/linux-defconfig_xen0_x86_64 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xen0_x86_64 Wed Oct 24 17:17:09 2007 +0100 @@ -1369,6 +1369,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xenU_ia64 --- a/buildconfigs/linux-defconfig_xenU_ia64 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xenU_ia64 Wed Oct 24 17:17:09 2007 +0100 @@ -1493,6 +1493,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xenU_x86_32 --- a/buildconfigs/linux-defconfig_xenU_x86_32 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xenU_x86_32 Wed Oct 24 17:17:09 2007 +0100 @@ -920,6 +920,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xenU_x86_64 --- a/buildconfigs/linux-defconfig_xenU_x86_64 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xenU_x86_64 Wed Oct 24 17:17:09 2007 +0100 @@ -1217,6 +1217,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xen_ia64 --- a/buildconfigs/linux-defconfig_xen_ia64 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xen_ia64 Wed Oct 24 17:17:09 2007 +0100 @@ -1683,6 +1683,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xen_x86_32 --- a/buildconfigs/linux-defconfig_xen_x86_32 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xen_x86_32 Wed Oct 24 17:17:09 2007 +0100 @@ -3280,6 +3280,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 buildconfigs/linux-defconfig_xen_x86_64 --- a/buildconfigs/linux-defconfig_xen_x86_64 Tue Oct 23 10:23:00 2007 -0600 +++ b/buildconfigs/linux-defconfig_xen_x86_64 Wed Oct 24 17:17:09 2007 +0100 @@ -3111,6 +3111,7 @@ CONFIG_XEN_SYSFS=y CONFIG_XEN_SYSFS=y CONFIG_XEN_COMPAT_030002_AND_LATER=y # CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set # CONFIG_XEN_COMPAT_LATEST_ONLY is not set CONFIG_XEN_COMPAT=0x030002 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y diff -r 32df30e24087 -r 26962454b508 drivers/xen/Kconfig --- a/drivers/xen/Kconfig Tue Oct 23 10:23:00 2007 -0600 +++ b/drivers/xen/Kconfig Wed Oct 24 17:17:09 2007 +0100 @@ -13,7 +13,7 @@ if XEN if XEN config XEN_INTERFACE_VERSION hex - default 0x00030206 + default 0x00030207 menu "XEN" @@ -247,6 +247,9 @@ choice config XEN_COMPAT_030004_AND_LATER bool "3.0.4 and later" + config XEN_COMPAT_030100_AND_LATER + bool "3.1.0 and later" + config XEN_COMPAT_LATEST_ONLY bool "no compatibility code" @@ -255,6 +258,7 @@ config XEN_COMPAT config XEN_COMPAT hex default 0xffffff if XEN_COMPAT_LATEST_ONLY + default 0x030100 if XEN_COMPAT_030100_AND_LATER default 0x030004 if XEN_COMPAT_030004_AND_LATER default 0x030002 if XEN_COMPAT_030002_AND_LATER default 0 diff -r 32df30e24087 -r 26962454b508 drivers/xen/core/smpboot.c --- a/drivers/xen/core/smpboot.c Tue Oct 23 10:23:00 2007 -0600 +++ b/drivers/xen/core/smpboot.c Wed Oct 24 17:17:09 2007 +0100 @@ -174,6 +174,7 @@ void cpu_bringup(void) void cpu_bringup(void) { cpu_init(); + identify_cpu(cpu_data + smp_processor_id()); touch_softlockup_watchdog(); preempt_disable(); local_irq_enable(); diff -r 32df30e24087 -r 26962454b508 include/xen/interface/callback.h --- a/include/xen/interface/callback.h Tue Oct 23 10:23:00 2007 -0600 +++ b/include/xen/interface/callback.h Wed Oct 24 17:17:09 2007 +0100 @@ -36,15 +36,39 @@ * @extra_args == Operation-specific extra arguments (NULL if none). */ +/* ia64, x86: Callback for event delivery. */ #define CALLBACKTYPE_event 0 + +/* x86: Failsafe callback when guest state cannot be restored by Xen. */ #define CALLBACKTYPE_failsafe 1 -#define CALLBACKTYPE_syscall 2 /* x86_64 only */ + +/* x86/64 hypervisor: Syscall by 64-bit guest app ('64-on-64-on-64'). */ +#define CALLBACKTYPE_syscall 2 + /* - * sysenter is only available on x86_32 with the - * supervisor_mode_kernel option enabled. + * x86/32 hypervisor: Only available on x86/32 when supervisor_mode_kernel + * feature is enabled. Do not use this callback type in new code. */ -#define CALLBACKTYPE_sysenter 3 +#define CALLBACKTYPE_sysenter_deprecated 3 + +/* x86: Callback for NMI delivery. */ #define CALLBACKTYPE_nmi 4 + +/* + * x86: sysenter is only available as follows: + * - 32-bit hypervisor: with the supervisor_mode_kernel feature enabled + * - 64-bit hypervisor: 32-bit guest applications on Intel CPUs + * ('32-on-32-on-64', '32-on-64-on-64') + * [nb. also 64-bit guest applications on Intel CPUs + * ('64-on-64-on-64'), but syscall is preferred] + */ +#define CALLBACKTYPE_sysenter 5 + +/* + * x86/64 hypervisor: Syscall by 32-bit guest app on AMD CPUs + * ('32-on-32-on-64', '32-on-64-on-64') + */ +#define CALLBACKTYPE_syscall32 7 /* * Disable event deliver during callback? This flag is ignored for event and @@ -79,6 +103,11 @@ typedef struct callback_unregister callb typedef struct callback_unregister callback_unregister_t; DEFINE_XEN_GUEST_HANDLE(callback_unregister_t); +#if __XEN_INTERFACE_VERSION__ < 0x00030207 +#undef CALLBACKTYPE_sysenter +#define CALLBACKTYPE_sysenter CALLBACKTYPE_sysenter_deprecated +#endif + #endif /* __XEN_PUBLIC_CALLBACK_H__ */ /* diff -r 32df30e24087 -r 26962454b508 include/xen/interface/xen-compat.h --- a/include/xen/interface/xen-compat.h Tue Oct 23 10:23:00 2007 -0600 +++ b/include/xen/interface/xen-compat.h Wed Oct 24 17:17:09 2007 +0100 @@ -27,7 +27,7 @@ #ifndef __XEN_PUBLIC_XEN_COMPAT_H__ #define __XEN_PUBLIC_XEN_COMPAT_H__ -#define __XEN_LATEST_INTERFACE_VERSION__ 0x00030206 +#define __XEN_LATEST_INTERFACE_VERSION__ 0x00030207 #if defined(__XEN__) || defined(__XEN_TOOLS__) /* Xen is built with matching headers and implements the latest interface. */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |