[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86: always supply .cpuid() handler to x86_emulate()
commit 043ad80d4fad75651e825ef3f935be52f2d6fda0 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Nov 11 17:19:12 2016 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Nov 11 17:19:12 2016 +0100 x86: always supply .cpuid() handler to x86_emulate() With us incremementally adding proper CPUID checks to x86_emulate() (see commit de05bd965a ["x86emul: correct {,F}CMOV and F{,U}COMI{,P} emulation"]) it is no longer appropriate to invoke the function with that hook being NULL, as long as respective instructions may get used in that case. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Release-acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- xen/arch/x86/hvm/emulate.c | 6 ++++-- xen/arch/x86/mm.c | 3 +++ xen/arch/x86/mm/shadow/common.c | 2 ++ xen/arch/x86/traps.c | 18 ++++++++++++++++++ xen/include/asm-x86/hvm/emulate.h | 6 ++++++ xen/include/asm-x86/mm.h | 2 ++ 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 5b408f8..e9b8f8c 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -1542,7 +1542,7 @@ static int hvmemul_wbinvd( return X86EMUL_OKAY; } -static int hvmemul_cpuid( +int hvmemul_cpuid( unsigned int *eax, unsigned int *ebx, unsigned int *ecx, @@ -1892,11 +1892,13 @@ int hvm_emulate_one_mmio(unsigned long mfn, unsigned long gla) .read = x86emul_unhandleable_rw, .insn_fetch = hvmemul_insn_fetch, .write = mmcfg_intercept_write, + .cpuid = hvmemul_cpuid, }; static const struct x86_emulate_ops hvm_ro_emulate_ops_mmio = { .read = x86emul_unhandleable_rw, .insn_fetch = hvmemul_insn_fetch, - .write = mmio_ro_emulated_write + .write = mmio_ro_emulated_write, + .cpuid = hvmemul_cpuid, }; struct mmio_ro_emulate_ctxt mmio_ro_ctxt = { .cr2 = gla }; struct hvm_emulate_ctxt ctxt; diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index eddf098..03dcd71 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -5327,6 +5327,7 @@ static const struct x86_emulate_ops ptwr_emulate_ops = { .insn_fetch = ptwr_emulated_read, .write = ptwr_emulated_write, .cmpxchg = ptwr_emulated_cmpxchg, + .cpuid = pv_emul_cpuid, }; /* Write page fault handler: check if guest is trying to modify a PTE. */ @@ -5414,6 +5415,7 @@ static const struct x86_emulate_ops mmio_ro_emulate_ops = { .read = x86emul_unhandleable_rw, .insn_fetch = ptwr_emulated_read, .write = mmio_ro_emulated_write, + .cpuid = pv_emul_cpuid, }; int mmcfg_intercept_write( @@ -5451,6 +5453,7 @@ static const struct x86_emulate_ops mmcfg_intercept_ops = { .read = x86emul_unhandleable_rw, .insn_fetch = ptwr_emulated_read, .write = mmcfg_intercept_write, + .cpuid = pv_emul_cpuid, }; /* Check if guest is trying to modify a r/o MMIO page. */ diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 21607bf..ced2313 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -306,6 +306,7 @@ static const struct x86_emulate_ops hvm_shadow_emulator_ops = { .insn_fetch = hvm_emulate_insn_fetch, .write = hvm_emulate_write, .cmpxchg = hvm_emulate_cmpxchg, + .cpuid = hvmemul_cpuid, }; static int @@ -374,6 +375,7 @@ static const struct x86_emulate_ops pv_shadow_emulator_ops = { .insn_fetch = pv_emulate_read, .write = pv_emulate_write, .cmpxchg = pv_emulate_cmpxchg, + .cpuid = pv_emul_cpuid, }; const struct x86_emulate_ops *shadow_init_emulation( diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 822556a..14abb62 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -2755,6 +2755,24 @@ static int priv_op_write_msr(unsigned int reg, uint64_t val, return X86EMUL_UNHANDLEABLE; } +int pv_emul_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, + unsigned int *edx, struct x86_emulate_ctxt *ctxt) +{ + struct cpu_user_regs regs = *ctxt->regs; + + regs._eax = *eax; + regs._ecx = *ecx; + + pv_cpuid(®s); + + *eax = regs._eax; + *ebx = regs._ebx; + *ecx = regs._ecx; + *edx = regs._edx; + + return X86EMUL_OKAY; +} + /* Instruction fetch with error handling. */ #define insn_fetch(type, base, eip, limit) \ ({ unsigned long _rc, _ptr = (base) + (eip); \ diff --git a/xen/include/asm-x86/hvm/emulate.h b/xen/include/asm-x86/hvm/emulate.h index 1055563..f610673 100644 --- a/xen/include/asm-x86/hvm/emulate.h +++ b/xen/include/asm-x86/hvm/emulate.h @@ -60,6 +60,12 @@ void hvm_emulate_init( unsigned int insn_bytes); void hvm_emulate_writeback( struct hvm_emulate_ctxt *hvmemul_ctxt); +int hvmemul_cpuid( + unsigned int *eax, + unsigned int *ebx, + unsigned int *ecx, + unsigned int *edx, + struct x86_emulate_ctxt *ctxt); struct segment_register *hvmemul_get_seg_reg( enum x86_segment seg, struct hvm_emulate_ctxt *hvmemul_ctxt); diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index b781495..1b4d1c3 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -504,6 +504,8 @@ extern int mmcfg_intercept_write(enum x86_segment seg, void *p_data, unsigned int bytes, struct x86_emulate_ctxt *ctxt); +int pv_emul_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, + unsigned int *edx, struct x86_emulate_ctxt *ctxt); int ptwr_do_page_fault(struct vcpu *, unsigned long, struct cpu_user_regs *); -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |