mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-19 17:14:40 +08:00
KVM: x86: Reduce the number of emulator GPRs to '8' for 32-bit KVM
Reduce the number of GPRs emulated by 32-bit KVM from 16 to 8. KVM does not support emulating 64-bit mode on 32-bit host kernels, and so should never generate accesses to R8-15. Opportunistically use NR_EMULATOR_GPRS in rsm_load_state_{32,64}() now that it is precise and accurate for both flavors. Wrap the definition with full #ifdef ugliness; sadly, IS_ENABLED() doesn't guarantee a compile-time constant as far as BUILD_BUG_ON() is concerned. Signed-off-by: Sean Christopherson <seanjc@google.com> Reviewed-by: Kees Cook <keescook@chromium.org> Message-Id: <20220526210817.3428868-6-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
0cbc60d44c
commit
b443183a25
@ -2441,7 +2441,7 @@ static int rsm_load_state_32(struct x86_emulate_ctxt *ctxt,
|
|||||||
ctxt->eflags = GET_SMSTATE(u32, smstate, 0x7ff4) | X86_EFLAGS_FIXED;
|
ctxt->eflags = GET_SMSTATE(u32, smstate, 0x7ff4) | X86_EFLAGS_FIXED;
|
||||||
ctxt->_eip = GET_SMSTATE(u32, smstate, 0x7ff0);
|
ctxt->_eip = GET_SMSTATE(u32, smstate, 0x7ff0);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < NR_EMULATOR_GPRS; i++)
|
||||||
*reg_write(ctxt, i) = GET_SMSTATE(u32, smstate, 0x7fd0 + i * 4);
|
*reg_write(ctxt, i) = GET_SMSTATE(u32, smstate, 0x7fd0 + i * 4);
|
||||||
|
|
||||||
val = GET_SMSTATE(u32, smstate, 0x7fcc);
|
val = GET_SMSTATE(u32, smstate, 0x7fcc);
|
||||||
@ -2498,7 +2498,7 @@ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt,
|
|||||||
u16 selector;
|
u16 selector;
|
||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < NR_EMULATOR_GPRS; i++)
|
||||||
*reg_write(ctxt, i) = GET_SMSTATE(u64, smstate, 0x7ff8 - i * 8);
|
*reg_write(ctxt, i) = GET_SMSTATE(u64, smstate, 0x7ff8 - i * 8);
|
||||||
|
|
||||||
ctxt->_eip = GET_SMSTATE(u64, smstate, 0x7f78);
|
ctxt->_eip = GET_SMSTATE(u64, smstate, 0x7f78);
|
||||||
|
@ -306,11 +306,12 @@ typedef void (*fastop_t)(struct fastop *);
|
|||||||
* tracked/accessed via _eip, and except for RIP relative addressing, which
|
* tracked/accessed via _eip, and except for RIP relative addressing, which
|
||||||
* also uses _eip, RIP cannot be a register operand nor can it be an operand in
|
* also uses _eip, RIP cannot be a register operand nor can it be an operand in
|
||||||
* a ModRM or SIB byte.
|
* a ModRM or SIB byte.
|
||||||
*
|
|
||||||
* TODO: this is technically wrong for 32-bit KVM, which only supports 8 GPRs;
|
|
||||||
* R8-R15 don't exist.
|
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
#define NR_EMULATOR_GPRS 16
|
#define NR_EMULATOR_GPRS 16
|
||||||
|
#else
|
||||||
|
#define NR_EMULATOR_GPRS 8
|
||||||
|
#endif
|
||||||
|
|
||||||
struct x86_emulate_ctxt {
|
struct x86_emulate_ctxt {
|
||||||
void *vcpu;
|
void *vcpu;
|
||||||
|
Loading…
Reference in New Issue
Block a user