From dc6610d553fe231438a5bd4c0e5491ed6500b8ee Mon Sep 17 00:00:00 2001 From: Peter Grehan Date: Sat, 7 Jun 2014 23:05:12 +0000 Subject: Set the guest PAT MSR in the VMCB to power-on defaults. Linux guests accept the values in this register, while *BSD guests reprogram it. Default values of zero correspond to PAT_UNCACHEABLE, resulting in glacial performance. Thanks to Willem Jan Withagen for first reporting this and helping out with the investigation. --- sys/amd64/vmm/amd/vmcb.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'sys/amd64/vmm/amd') diff --git a/sys/amd64/vmm/amd/vmcb.c b/sys/amd64/vmm/amd/vmcb.c index fa7d91f6572e..9fc30b062616 100644 --- a/sys/amd64/vmm/amd/vmcb.c +++ b/sys/amd64/vmm/amd/vmcb.c @@ -67,10 +67,20 @@ svm_init_vmcb(struct vmcb *vmcb, uint64_t iopm_base_pa, /* Enable nested paging */ ctrl->np_enable = 1; ctrl->n_cr3 = np_pml4; - + /* EFER_SVM must always be set when the guest is executing */ state->efer = EFER_SVM; - + + /* Set up the PAT to power-on state */ + state->g_pat = PAT_VALUE(0, PAT_WRITE_BACK) | + PAT_VALUE(1, PAT_WRITE_THROUGH) | + PAT_VALUE(2, PAT_UNCACHED) | + PAT_VALUE(3, PAT_UNCACHEABLE) | + PAT_VALUE(4, PAT_WRITE_BACK) | + PAT_VALUE(5, PAT_WRITE_THROUGH) | + PAT_VALUE(6, PAT_UNCACHED) | + PAT_VALUE(7, PAT_UNCACHEABLE); + return (0); } -- cgit v1.2.3