[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [HVM][SVM] Change the calling convention for SVM VMMCALLs so
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Node ID 2e3b121662dc71c192d8af584c9f6497139feed1 # Parent 0d2ba35c0cf2403af80338fdadd67f52cb549d70 [HVM][SVM] Change the calling convention for SVM VMMCALLs so that they don't conflict with the hypercall calling convention. Signed-off-by: Steven Smith <ssmith@xxxxxxxxxxxxx> --- tools/firmware/hvmloader/hvmloader.c | 10 ++--- xen/arch/x86/hvm/svm/svm.c | 58 +++++++++++++++++++--------------- xen/include/asm-x86/hvm/svm/vmmcall.h | 8 ++-- 3 files changed, 42 insertions(+), 34 deletions(-) diff -r 0d2ba35c0cf2 -r 2e3b121662dc tools/firmware/hvmloader/hvmloader.c --- a/tools/firmware/hvmloader/hvmloader.c Tue Aug 01 17:18:05 2006 +0100 +++ b/tools/firmware/hvmloader/hvmloader.c Tue Aug 01 17:28:19 2006 +0100 @@ -31,7 +31,7 @@ #define ROMBIOS_PHYSICAL_ADDRESS 0x000F0000 /* invoke SVM's paged realmode support */ -#define SVM_VMMCALL_RESET_TO_REALMODE 0x00000001 +#define SVM_VMMCALL_RESET_TO_REALMODE 0x80000001 /* * C runtime start off @@ -133,15 +133,15 @@ cirrus_check(void) return inb(0x3C5) == 0x12; } -int -vmmcall(int edi, int esi, int edx, int ecx, int ebx) +int +vmmcall(int function, int edi, int esi, int edx, int ecx, int ebx) { int eax; __asm__ __volatile__( ".byte 0x0F,0x01,0xD9" : "=a" (eax) - : "a"(0x58454E00), /* XEN\0 key */ + : "a"(function), "b"(ebx), "c"(ecx), "d"(edx), "D"(edi), "S"(esi) ); return eax; @@ -200,7 +200,7 @@ main(void) if (check_amd()) { /* AMD implies this is SVM */ puts("SVM go ...\n"); - vmmcall(SVM_VMMCALL_RESET_TO_REALMODE, 0, 0, 0, 0); + vmmcall(SVM_VMMCALL_RESET_TO_REALMODE, 0, 0, 0, 0, 0); } else { puts("Loading VMXAssist ...\n"); memcpy((void *)VMXASSIST_PHYSICAL_ADDRESS, diff -r 0d2ba35c0cf2 -r 2e3b121662dc xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Tue Aug 01 17:18:05 2006 +0100 +++ b/xen/arch/x86/hvm/svm/svm.c Tue Aug 01 17:28:19 2006 +0100 @@ -2349,33 +2349,41 @@ static int svm_do_vmmcall(struct vcpu *v inst_len = __get_instruction_length(vmcb, INSTR_VMCALL, NULL); ASSERT(inst_len > 0); - /* VMMCALL sanity check */ - if (vmcb->cpl > get_vmmcall_cpl(regs->edi)) - { - printf("VMMCALL CPL check failed\n"); - return -1; - } - - /* handle the request */ - switch (regs->edi) - { - case VMMCALL_RESET_TO_REALMODE: - if (svm_do_vmmcall_reset_to_realmode(v, regs)) - { - printf("svm_do_vmmcall_reset_to_realmode() failed\n"); + if ( regs->eax & 0x80000000 ) + { + /* VMMCALL sanity check */ + if ( vmcb->cpl > get_vmmcall_cpl(regs->edi) ) + { + printf("VMMCALL CPL check failed\n"); return -1; } - - /* since we just reset the VMCB, return without adjusting the eip */ - return 0; - case VMMCALL_DEBUG: - printf("DEBUG features not implemented yet\n"); - break; - default: - break; - } - - hvm_print_line(v, regs->eax); /* provides the current domain */ + + /* handle the request */ + switch ( regs->eax ) + { + case VMMCALL_RESET_TO_REALMODE: + if ( svm_do_vmmcall_reset_to_realmode(v, regs) ) + { + printf("svm_do_vmmcall_reset_to_realmode() failed\n"); + return -1; + } + /* since we just reset the VMCB, return without adjusting + * the eip */ + return 0; + + case VMMCALL_DEBUG: + printf("DEBUG features not implemented yet\n"); + break; + default: + break; + } + + hvm_print_line(v, regs->eax); /* provides the current domain */ + } + else + { + hvm_do_hypercall(regs); + } __update_guest_eip(vmcb, inst_len); return 0; diff -r 0d2ba35c0cf2 -r 2e3b121662dc xen/include/asm-x86/hvm/svm/vmmcall.h --- a/xen/include/asm-x86/hvm/svm/vmmcall.h Tue Aug 01 17:18:05 2006 +0100 +++ b/xen/include/asm-x86/hvm/svm/vmmcall.h Tue Aug 01 17:28:19 2006 +0100 @@ -23,11 +23,11 @@ #define __ASM_X86_HVM_SVM_VMMCALL_H__ /* VMMCALL command fields */ -#define VMMCALL_CODE_CPL_MASK 0xC0000000 -#define VMMCALL_CODE_MBZ_MASK 0x3FFF0000 +#define VMMCALL_CODE_CPL_MASK 0x60000000 +#define VMMCALL_CODE_MBZ_MASK 0x1FFF0000 #define VMMCALL_CODE_COMMAND_MASK 0x0000FFFF -#define MAKE_VMMCALL_CODE(cpl,func) ((cpl << 30) | (func)) +#define MAKE_VMMCALL_CODE(cpl,func) ((cpl << 29) | (func) | 0x80000000) /* CPL=0 VMMCALL Requests */ #define VMMCALL_RESET_TO_REALMODE MAKE_VMMCALL_CODE(0,1) @@ -38,7 +38,7 @@ /* return the cpl required for the vmmcall cmd */ static inline int get_vmmcall_cpl(int cmd) { - return (cmd & VMMCALL_CODE_CPL_MASK) >> 30; + return (cmd & VMMCALL_CODE_CPL_MASK) >> 29; } #endif /* __ASM_X86_HVM_SVM_VMMCALL_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |