git: a0f02252c417 - stable/14 - vmm: Expose more registers to VM_GET_REGISTER
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 09 Mar 2024 04:40:47 UTC
The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=a0f02252c4175b5336c215cc7774c3ea08873476 commit a0f02252c4175b5336c215cc7774c3ea08873476 Author: Mark Johnston <markj@FreeBSD.org> AuthorDate: 2024-02-07 13:47:24 +0000 Commit: Mark Johnston <markj@FreeBSD.org> CommitDate: 2024-03-09 04:28:39 +0000 vmm: Expose more registers to VM_GET_REGISTER In a follow-up revision the gdb stub will support sending an XML target description to gdb, which lets us send additional registers, including the ones added in this patch. Reviewed by: jhb MFC after: 1 month Sponsored by: Innovate UK Differential Revision: https://reviews.freebsd.org/D43665 (cherry picked from commit f493ea650e6137ba657dfa0627da1e8bb4a985e9) --- sys/amd64/include/vmm.h | 4 ++++ sys/amd64/vmm/amd/vmcb.c | 17 +++++++++++++++++ sys/amd64/vmm/intel/vmcs.c | 5 ++++- sys/amd64/vmm/intel/vmx.c | 10 +++++++++- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/sys/amd64/include/vmm.h b/sys/amd64/include/vmm.h index 273a1a46ba04..7d5d13678122 100644 --- a/sys/amd64/include/vmm.h +++ b/sys/amd64/include/vmm.h @@ -98,6 +98,10 @@ enum vm_reg_name { VM_REG_GUEST_DR3, VM_REG_GUEST_DR6, VM_REG_GUEST_ENTRY_INST_LENGTH, + VM_REG_GUEST_FS_BASE, + VM_REG_GUEST_GS_BASE, + VM_REG_GUEST_KGS_BASE, + VM_REG_GUEST_TPR, VM_REG_LAST }; diff --git a/sys/amd64/vmm/amd/vmcb.c b/sys/amd64/vmm/amd/vmcb.c index ce05c912fc6a..4bd2fae9f821 100644 --- a/sys/amd64/vmm/amd/vmcb.c +++ b/sys/amd64/vmm/amd/vmcb.c @@ -39,6 +39,7 @@ #include "vmm_ktr.h" +#include "vlapic.h" #include "vmcb.h" #include "svm.h" #include "svm_softc.h" @@ -231,6 +232,22 @@ vmcb_read(struct svm_vcpu *vcpu, int ident, uint64_t *retval) *retval = seg->selector; break; + case VM_REG_GUEST_FS_BASE: + case VM_REG_GUEST_GS_BASE: + seg = vmcb_segptr(vmcb, ident == VM_REG_GUEST_FS_BASE ? + VM_REG_GUEST_FS : VM_REG_GUEST_GS); + KASSERT(seg != NULL, ("%s: unable to get segment %d from VMCB", + __func__, ident)); + *retval = seg->base; + break; + case VM_REG_GUEST_KGS_BASE: + *retval = state->kernelgsbase; + break; + + case VM_REG_GUEST_TPR: + *retval = vlapic_get_cr8(vm_lapic(vcpu->vcpu)); + break; + case VM_REG_GUEST_GDTR: case VM_REG_GUEST_IDTR: /* GDTR and IDTR don't have segment selectors */ diff --git a/sys/amd64/vmm/intel/vmcs.c b/sys/amd64/vmm/intel/vmcs.c index 53ed5fbfc9ba..1a7626f7a65d 100644 --- a/sys/amd64/vmm/intel/vmcs.c +++ b/sys/amd64/vmm/intel/vmcs.c @@ -120,10 +120,13 @@ vmcs_field_encoding(int ident) return (VMCS_GUEST_PDPTE3); case VM_REG_GUEST_ENTRY_INST_LENGTH: return (VMCS_ENTRY_INST_LENGTH); + case VM_REG_GUEST_FS_BASE: + return (VMCS_GUEST_FS_BASE); + case VM_REG_GUEST_GS_BASE: + return (VMCS_GUEST_GS_BASE); default: return (-1); } - } static int diff --git a/sys/amd64/vmm/intel/vmx.c b/sys/amd64/vmm/intel/vmx.c index 317ed7e5d7fb..3fe20986ec8d 100644 --- a/sys/amd64/vmm/intel/vmx.c +++ b/sys/amd64/vmm/intel/vmx.c @@ -3404,8 +3404,16 @@ vmx_getreg(void *vcpui, int reg, uint64_t *retval) panic("vmx_getreg: %s%d is running", vm_name(vmx->vm), vcpu->vcpuid); - if (reg == VM_REG_GUEST_INTR_SHADOW) + switch (reg) { + case VM_REG_GUEST_INTR_SHADOW: return (vmx_get_intr_shadow(vcpu, running, retval)); + case VM_REG_GUEST_KGS_BASE: + *retval = vcpu->guest_msrs[IDX_MSR_KGSBASE]; + return (0); + case VM_REG_GUEST_TPR: + *retval = vlapic_get_cr8(vm_lapic(vcpu->vcpu)); + return (0); + } if (vmxctx_getreg(&vcpu->ctx, reg, retval) == 0) return (0);