Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F96562710
D33431.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
10 KB
Referenced Files
None
Subscribers
None
D33431.id.diff
View Options
diff --git a/sys/amd64/vmm/amd/svm.c b/sys/amd64/vmm/amd/svm.c
--- a/sys/amd64/vmm/amd/svm.c
+++ b/sys/amd64/vmm/amd/svm.c
@@ -2412,8 +2412,6 @@
/* struct svm_softc is AMD's representation for SVM softc */
struct svm_softc *sc;
struct svm_vcpu *vcpu;
- struct vmcb *vmcb;
- uint64_t val;
int i;
int ret;
@@ -2421,78 +2419,8 @@
KASSERT(sc != NULL, ("%s: arg was NULL", __func__));
- SNAPSHOT_VAR_OR_LEAVE(sc->nptp, meta, ret, done);
-
for (i = 0; i < VM_MAXCPU; i++) {
vcpu = &sc->vcpu[i];
- vmcb = &vcpu->vmcb;
-
- /* VMCB fields for virtual cpu i */
- SNAPSHOT_VAR_OR_LEAVE(vmcb->ctrl.v_tpr, meta, ret, done);
- val = vmcb->ctrl.v_tpr;
- SNAPSHOT_VAR_OR_LEAVE(val, meta, ret, done);
- vmcb->ctrl.v_tpr = val;
-
- SNAPSHOT_VAR_OR_LEAVE(vmcb->ctrl.asid, meta, ret, done);
- val = vmcb->ctrl.np_enable;
- SNAPSHOT_VAR_OR_LEAVE(val, meta, ret, done);
- vmcb->ctrl.np_enable = val;
-
- val = vmcb->ctrl.intr_shadow;
- SNAPSHOT_VAR_OR_LEAVE(val, meta, ret, done);
- vmcb->ctrl.intr_shadow = val;
- SNAPSHOT_VAR_OR_LEAVE(vmcb->ctrl.tlb_ctrl, meta, ret, done);
-
- SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad1,
- sizeof(vmcb->state.pad1),
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cpl, meta, ret, done);
- SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad2,
- sizeof(vmcb->state.pad2),
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.efer, meta, ret, done);
- SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad3,
- sizeof(vmcb->state.pad3),
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cr4, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cr3, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cr0, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.dr7, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.dr6, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.rflags, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.rip, meta, ret, done);
- SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad4,
- sizeof(vmcb->state.pad4),
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.rsp, meta, ret, done);
- SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad5,
- sizeof(vmcb->state.pad5),
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.rax, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.star, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.lstar, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cstar, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.sfmask, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.kernelgsbase,
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.sysenter_cs, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.sysenter_esp,
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.sysenter_eip,
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cr2, meta, ret, done);
- SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad6,
- sizeof(vmcb->state.pad6),
- meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.g_pat, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.dbgctl, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.br_from, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.br_to, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.int_from, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vmcb->state.int_to, meta, ret, done);
- SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad7,
- sizeof(vmcb->state.pad7),
- meta, ret, done);
/* Snapshot swctx for virtual cpu i */
SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_rbp, meta, ret, done);
@@ -2514,15 +2442,6 @@
SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_dr2, meta, ret, done);
SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_dr3, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr0, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr1, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr2, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr3, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr6, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr7, meta, ret, done);
- SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_debugctl, meta, ret,
- done);
-
/* Restore other svm_vcpu struct fields */
/* Restore NEXTRIP field */
@@ -2532,7 +2451,7 @@
SNAPSHOT_VAR_OR_LEAVE(vcpu->lastcpu, meta, ret, done);
SNAPSHOT_VAR_OR_LEAVE(vcpu->dirty, meta, ret, done);
- /* Restore EPTGEN field - EPT is Extended Page Tabel */
+ /* Restore EPTGEN field - EPT is Extended Page Table */
SNAPSHOT_VAR_OR_LEAVE(vcpu->eptgen, meta, ret, done);
SNAPSHOT_VAR_OR_LEAVE(vcpu->asid.gen, meta, ret, done);
@@ -2581,6 +2500,7 @@
err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_CR3, meta);
err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_CR4, meta);
+ err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_DR6, meta);
err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_DR7, meta);
err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_RAX, meta);
@@ -2630,15 +2550,7 @@
err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_GDTR, meta);
/* Specific AMD registers */
- err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_SYSENTER_CS, 8), meta);
- err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_SYSENTER_ESP, 8), meta);
- err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_SYSENTER_EIP, 8), meta);
-
- err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_NPT_BASE, 8), meta);
+ err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_INTR_SHADOW, meta);
err += vmcb_snapshot_any(sc, vcpu,
VMCB_ACCESS(VMCB_OFF_CR_INTERCEPT, 4), meta);
@@ -2651,9 +2563,22 @@
err += vmcb_snapshot_any(sc, vcpu,
VMCB_ACCESS(VMCB_OFF_INST2_INTERCEPT, 4), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_PAUSE_FILTHRESH, 2), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_PAUSE_FILCNT, 2), meta);
+
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_ASID, 4), meta);
+
err += vmcb_snapshot_any(sc, vcpu,
VMCB_ACCESS(VMCB_OFF_TLB_CTRL, 4), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_VIRQ, 8), meta);
+
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_EXIT_REASON, 8), meta);
err += vmcb_snapshot_any(sc, vcpu,
VMCB_ACCESS(VMCB_OFF_EXITINFO1, 8), meta);
err += vmcb_snapshot_any(sc, vcpu,
@@ -2662,10 +2587,7 @@
VMCB_ACCESS(VMCB_OFF_EXITINTINFO, 8), meta);
err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_VIRQ, 8), meta);
-
- err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_GUEST_PAT, 8), meta);
+ VMCB_ACCESS(VMCB_OFF_NP_ENABLE, 1), meta);
err += vmcb_snapshot_any(sc, vcpu,
VMCB_ACCESS(VMCB_OFF_AVIC_BAR, 8), meta);
@@ -2677,17 +2599,41 @@
VMCB_ACCESS(VMCB_OFF_AVIC_PT, 8), meta);
err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_IO_PERM, 8), meta);
+ VMCB_ACCESS(VMCB_OFF_CPL, 1), meta);
+
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_STAR, 8), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_LSTAR, 8), meta);
err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_MSR_PERM, 8), meta);
+ VMCB_ACCESS(VMCB_OFF_CSTAR, 8), meta);
err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_ASID, 4), meta);
+ VMCB_ACCESS(VMCB_OFF_SFMASK, 8), meta);
err += vmcb_snapshot_any(sc, vcpu,
- VMCB_ACCESS(VMCB_OFF_EXIT_REASON, 8), meta);
+ VMCB_ACCESS(VMCB_OFF_KERNELGBASE, 8), meta);
- err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_INTR_SHADOW, meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_SYSENTER_CS, 8), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_SYSENTER_ESP, 8), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_SYSENTER_EIP, 8), meta);
+
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_GUEST_PAT, 8), meta);
+
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_DBGCTL, 8), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_BR_FROM, 8), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_BR_TO, 8), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_INT_FROM, 8), meta);
+ err += vmcb_snapshot_any(sc, vcpu,
+ VMCB_ACCESS(VMCB_OFF_INT_TO, 8), meta);
return (err);
}
diff --git a/sys/amd64/vmm/amd/vmcb.h b/sys/amd64/vmm/amd/vmcb.h
--- a/sys/amd64/vmm/amd/vmcb.h
+++ b/sys/amd64/vmm/amd/vmcb.h
@@ -187,6 +187,8 @@
#define VMCB_OFF_EXC_INTERCEPT VMCB_OFF_CTRL(0x8)
#define VMCB_OFF_INST1_INTERCEPT VMCB_OFF_CTRL(0xC)
#define VMCB_OFF_INST2_INTERCEPT VMCB_OFF_CTRL(0x10)
+#define VMCB_OFF_PAUSE_FILTHRESH VMCB_OFF_CTRL(0x3C)
+#define VMCB_OFF_PAUSE_FILCNT VMCB_OFF_CTRL(0x3E)
#define VMCB_OFF_IO_PERM VMCB_OFF_CTRL(0x40)
#define VMCB_OFF_MSR_PERM VMCB_OFF_CTRL(0x48)
#define VMCB_OFF_TSC_OFFSET VMCB_OFF_CTRL(0x50)
@@ -197,15 +199,28 @@
#define VMCB_OFF_EXITINFO1 VMCB_OFF_CTRL(0x78)
#define VMCB_OFF_EXITINFO2 VMCB_OFF_CTRL(0x80)
#define VMCB_OFF_EXITINTINFO VMCB_OFF_CTRL(0x88)
+#define VMCB_OFF_NP_ENABLE VMCB_OFF_CTRL(0x90)
#define VMCB_OFF_AVIC_BAR VMCB_OFF_CTRL(0x98)
#define VMCB_OFF_NPT_BASE VMCB_OFF_CTRL(0xB0)
#define VMCB_OFF_AVIC_PAGE VMCB_OFF_CTRL(0xE0)
#define VMCB_OFF_AVIC_LT VMCB_OFF_CTRL(0xF0)
#define VMCB_OFF_AVIC_PT VMCB_OFF_CTRL(0xF8)
+
+#define VMCB_OFF_CPL VMCB_OFF_STATE(0xCB)
+#define VMCB_OFF_STAR VMCB_OFF_STATE(0x200)
+#define VMCB_OFF_LSTAR VMCB_OFF_STATE(0x208)
+#define VMCB_OFF_CSTAR VMCB_OFF_STATE(0x210)
+#define VMCB_OFF_SFMASK VMCB_OFF_STATE(0x218)
+#define VMCB_OFF_KERNELGBASE VMCB_OFF_STATE(0x220)
#define VMCB_OFF_SYSENTER_CS VMCB_OFF_STATE(0x228)
#define VMCB_OFF_SYSENTER_ESP VMCB_OFF_STATE(0x230)
#define VMCB_OFF_SYSENTER_EIP VMCB_OFF_STATE(0x238)
#define VMCB_OFF_GUEST_PAT VMCB_OFF_STATE(0x268)
+#define VMCB_OFF_DBGCTL VMCB_OFF_STATE(0x270)
+#define VMCB_OFF_BR_FROM VMCB_OFF_STATE(0x278)
+#define VMCB_OFF_BR_TO VMCB_OFF_STATE(0x280)
+#define VMCB_OFF_INT_FROM VMCB_OFF_STATE(0x288)
+#define VMCB_OFF_INT_TO VMCB_OFF_STATE(0x290)
/*
* Encode the VMCB offset and bytes that we want to read from VMCB.
diff --git a/sys/amd64/vmm/amd/vmcb.c b/sys/amd64/vmm/amd/vmcb.c
--- a/sys/amd64/vmm/amd/vmcb.c
+++ b/sys/amd64/vmm/amd/vmcb.c
@@ -139,6 +139,7 @@
case 8:
case 4:
case 2:
+ case 1:
if (write)
memcpy(ptr + off, val, bytes);
else
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Sep 26, 12:26 PM (17 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
12832664
Default Alt Text
D33431.id.diff (10 KB)
Attached To
Mode
D33431: bhyve snapshot fix for AMD CPUs
Attached
Detach File
Event Timeline
Log In to Comment