summaryrefslogtreecommitdiff
path: root/kvm_vmx.c
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2011-06-07 18:54:02 -0700
committerRobert Mustacchi <rm@joyent.com>2011-06-07 18:54:02 -0700
commitb21ef367c9f8dfe7164769b2eea9efbb96628be1 (patch)
treeb6c6baee753b9853e33ed3880601648245f655c1 /kvm_vmx.c
parenteb471cb1421d3beb5c77a2d2724df28b802de07d (diff)
downloadillumos-kvm-b21ef367c9f8dfe7164769b2eea9efbb96628be1.tar.gz
HVM-321 kvm.c and kvm_x86.c are confused
Diffstat (limited to 'kvm_vmx.c')
-rw-r--r--kvm_vmx.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/kvm_vmx.c b/kvm_vmx.c
index fc8034b..5edb0d7 100644
--- a/kvm_vmx.c
+++ b/kvm_vmx.c
@@ -35,6 +35,12 @@
#include "kvm_mmu.h"
#include "kvm_vmx.h"
+
+/*
+ * Globals
+ */
+struct kvm_shared_msrs **shared_msrs;
+
#define VMX_NR_VPIDS (1 << 16)
static kmutex_t vmx_vpid_lock;
static ulong_t *vmx_vpid_bitmap;
@@ -57,8 +63,6 @@ static kmem_cache_t *kvm_vcpu_cache;
static struct vmcs **vmxarea; /* 1 per cpu */
static struct vmcs **current_vmcs;
-/* XXX Should shared_msrs be static? */
-struct kvm_shared_msrs **shared_msrs;
static list_t **vcpus_on_cpu;
static uint64_t *vmxarea_pa; /* physical address of each vmxarea */
@@ -587,6 +591,30 @@ vmwrite_error(unsigned long field, unsigned long value)
field, value, vmcs_read32(VM_INSTRUCTION_ERROR));
}
+static void
+__vmwrite(unsigned long field, unsigned long value)
+{
+ uint8_t err = 0;
+
+ /*CSTYLED*/
+ __asm__ volatile ( ASM_VMX_VMWRITE_RAX_RDX "\n\t" "setna %0"
+ /* XXX: CF==1 or ZF==1 --> crash (ud2) */
+ /* "ja 1f ; ud2 ; 1:\n" */
+ : "=q"(err) : "a" (value), "d" (field)
+ : "cc", "memory");
+
+ /* XXX the following should be ifdef debug... */
+ if (err) {
+#ifdef XXX
+ vmcs_read32(VM_INSTRUCTION_ERROR);
+ cmn_err(CE_WARN, "_vmwrite: error writing %lx to %lx: "
+ "error number = %d\n", value, field, err & 0xff);
+#else
+ XXX_KVM_PROBE;
+#endif
+ }
+}
+
/* XXX Should be static! */
void
vmcs_writel(unsigned long field, unsigned long value)