KVM: x86: Route non-canonical checks in emulator through emulate_ops

Add emulate_ops.is_canonical_addr() to perform (non-)canonical checks in
the emulator, which will allow extending is_noncanonical_address() to
support different flavors of canonical checks, e.g. for descriptor table
bases vs. MSRs, without needing duplicate logic in the emulator.

No functional change is intended.

Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Link: https://lore.kernel.org/r/20240906221824.491834-3-mlevitsk@redhat.com
[sean: separate from additional of flags, massage changelog]
Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
Maxim Levitsky 2024-09-06 18:18:22 -04:00 committed by Sean Christopherson
parent e52ad1ddd0
commit 16ccadefa2
3 changed files with 10 additions and 1 deletions

View File

@ -653,7 +653,7 @@ static inline u8 ctxt_virt_addr_bits(struct x86_emulate_ctxt *ctxt)
static inline bool emul_is_noncanonical_address(u64 la,
struct x86_emulate_ctxt *ctxt)
{
return !__is_canonical_address(la, ctxt_virt_addr_bits(ctxt));
return !ctxt->ops->is_canonical_addr(ctxt, la);
}
/*

View File

@ -235,6 +235,8 @@ struct x86_emulate_ops {
gva_t (*get_untagged_addr)(struct x86_emulate_ctxt *ctxt, gva_t addr,
unsigned int flags);
bool (*is_canonical_addr)(struct x86_emulate_ctxt *ctxt, gva_t addr);
};
/* Type, address-of, and value of an instruction's operand. */

View File

@ -8619,6 +8619,12 @@ static gva_t emulator_get_untagged_addr(struct x86_emulate_ctxt *ctxt,
addr, flags);
}
static bool emulator_is_canonical_addr(struct x86_emulate_ctxt *ctxt,
gva_t addr)
{
return !is_noncanonical_address(addr, emul_to_vcpu(ctxt));
}
static const struct x86_emulate_ops emulate_ops = {
.vm_bugged = emulator_vm_bugged,
.read_gpr = emulator_read_gpr,
@ -8665,6 +8671,7 @@ static const struct x86_emulate_ops emulate_ops = {
.triple_fault = emulator_triple_fault,
.set_xcr = emulator_set_xcr,
.get_untagged_addr = emulator_get_untagged_addr,
.is_canonical_addr = emulator_is_canonical_addr,
};
static void toggle_interruptibility(struct kvm_vcpu *vcpu, u32 mask)