Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
No build reason found for images:i586
home:lafenghu
xen
23235-svm-decode-assist-crs.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 23235-svm-decode-assist-crs.patch of Package xen
References: FATE#309900 # HG changeset patch # User Andre Przywara <andre.przywara@amd.com> # Date 1303117266 -3600 # Node ID 2c8ad607ece18b4740b9fc4ffe267a0e0893c141 # Parent bf7afd48339a18cd86d89337f3c055045fb78d3b svm: implement CR access part of DecodeAssist Newer SVM implementations (Bulldozer) now give the used general purpose register on a MOV-CR intercept explictly. This avoids fetching and decoding the instruction from guest's memory and speeds up some Windows guest, which exercise CR8 quite often. Signed-off-by: Andre Przywara <andre.przywara@amd.com> Signed-off-by: Keir Fraser <keir@xen.org> Index: xen-4.1.2-testing/xen/arch/x86/hvm/svm/svm.c =================================================================== --- xen-4.1.2-testing.orig/xen/arch/x86/hvm/svm/svm.c +++ xen-4.1.2-testing/xen/arch/x86/hvm/svm/svm.c @@ -1039,6 +1039,22 @@ static void svm_vmexit_do_cpuid(struct c __update_guest_eip(regs, inst_len); } +static void svm_vmexit_do_cr_access( + struct vmcb_struct *vmcb, struct cpu_user_regs *regs) +{ + int gp, cr, dir, rc; + + cr = vmcb->exitcode - VMEXIT_CR0_READ; + dir = (cr > 15); + cr &= 0xf; + gp = vmcb->exitinfo1 & 0xf; + + rc = dir ? hvm_mov_to_cr(cr, gp) : hvm_mov_from_cr(cr, gp); + + if ( rc == X86EMUL_OKAY ) + __update_guest_eip(regs, vmcb->nextrip - vmcb->rip); +} + static void svm_dr_access(struct vcpu *v, struct cpu_user_regs *regs) { HVMTRACE_0D(DR_WRITE); @@ -1620,11 +1636,19 @@ asmlinkage void svm_vmexit_handler(struc int dir = (vmcb->exitinfo1 & 1) ? IOREQ_READ : IOREQ_WRITE; if ( handle_pio(port, bytes, dir) ) __update_guest_eip(regs, vmcb->exitinfo2 - vmcb->rip); - break; } - /* fallthrough to emulation if a string instruction */ + else if ( !handle_mmio() ) + hvm_inject_exception(TRAP_gp_fault, 0, 0); + break; + case VMEXIT_CR0_READ ... VMEXIT_CR15_READ: case VMEXIT_CR0_WRITE ... VMEXIT_CR15_WRITE: + if ( cpu_has_svm_decode && (vmcb->exitinfo1 & (1ULL << 63)) ) + svm_vmexit_do_cr_access(vmcb, regs); + else if ( !handle_mmio() ) + hvm_inject_exception(TRAP_gp_fault, 0, 0); + break; + case VMEXIT_INVLPG: case VMEXIT_INVLPGA: if ( !handle_mmio() )
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor