summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile12
-rw-r--r--kvm.c65
-rw-r--r--kvm_cache_regs.c93
-rw-r--r--kvm_cache_regs.h22
-rw-r--r--kvm_x86.c14
5 files changed, 124 insertions, 82 deletions
diff --git a/Makefile b/Makefile
index 9c51696..966d0a3 100644
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ CSTYLE=$(KERNEL_SOURCE)/usr/src/tools/scripts/cstyle
all: kvm kvm.so
-kvm: kvm.c kvm_x86.c kvm_emulate.c kvm.h kvm_x86host.h msr.h bitops.h kvm_subr.c kvm_irq.c kvm_i8254.c kvm_lapic.c kvm_mmu.c kvm_iodev.c kvm_ioapic.c kvm_vmx.c kvm_i8259.c kvm_coalesced_mmio.c kvm_irq_comm.c
+kvm: kvm.c kvm_x86.c kvm_emulate.c kvm.h kvm_x86host.h msr.h bitops.h kvm_subr.c kvm_irq.c kvm_i8254.c kvm_lapic.c kvm_mmu.c kvm_iodev.c kvm_ioapic.c kvm_vmx.c kvm_i8259.c kvm_coalesced_mmio.c kvm_irq_comm.c kvm_cache_regs.c
$(CC) $(CFLAGS) $(INCLUDEDIR) kvm.c
$(CC) $(CFLAGS) $(INCLUDEDIR) kvm_x86.c
$(CC) $(CFLAGS) $(INCLUDEDIR) kvm_emulate.c
@@ -31,6 +31,7 @@ kvm: kvm.c kvm_x86.c kvm_emulate.c kvm.h kvm_x86host.h msr.h bitops.h kvm_subr.c
$(CC) $(CFLAGS) $(INCLUDEDIR) kvm_i8259.c
$(CC) $(CFLAGS) $(INCLUDEDIR) kvm_coalesced_mmio.c
$(CC) $(CFLAGS) $(INCLUDEDIR) kvm_irq_comm.c
+ $(CC) $(CFLAGS) $(INCLUDEDIR) kvm_cache_regs.c
$(CTFCONVERT) -i -L VERSION kvm.o
$(CTFCONVERT) -i -L VERSION kvm_x86.o
$(CTFCONVERT) -i -L VERSION kvm_emulate.o
@@ -45,8 +46,9 @@ kvm: kvm.c kvm_x86.c kvm_emulate.c kvm.h kvm_x86host.h msr.h bitops.h kvm_subr.c
$(CTFCONVERT) -i -L VERSION kvm_i8259.o
$(CTFCONVERT) -i -L VERSION kvm_coalesced_mmio.o
$(CTFCONVERT) -i -L VERSION kvm_irq_comm.o
- $(LD) -r -o kvm kvm.o kvm_x86.o kvm_emulate.o kvm_subr.o kvm_irq.o kvm_i8254.o kvm_lapic.o kvm_mmu.o kvm_iodev.o kvm_ioapic.o kvm_vmx.o kvm_i8259.o kvm_coalesced_mmio.o kvm_irq_comm.o
- $(CTFMERGE) -L VERSION -o kvm kvm.o kvm_x86.o kvm_emulate.o kvm_subr.o kvm_irq.o kvm_i8254.o kvm_lapic.o kvm_mmu.o kvm_iodev.o kvm_ioapic.o kvm_vmx.o kvm_i8259.o kvm_coalesced_mmio.o kvm_irq_comm.o
+ $(CTFCONVERT) -i -L VERSION kvm_cache_regs.o
+ $(LD) -r -o kvm kvm.o kvm_x86.o kvm_emulate.o kvm_subr.o kvm_irq.o kvm_i8254.o kvm_lapic.o kvm_mmu.o kvm_iodev.o kvm_ioapic.o kvm_vmx.o kvm_i8259.o kvm_coalesced_mmio.o kvm_irq_comm.o kvm_cache_regs.o
+ $(CTFMERGE) -L VERSION -o kvm kvm.o kvm_x86.o kvm_emulate.o kvm_subr.o kvm_irq.o kvm_i8254.o kvm_lapic.o kvm_mmu.o kvm_iodev.o kvm_ioapic.o kvm_vmx.o kvm_i8259.o kvm_coalesced_mmio.o kvm_irq_comm.o kvm_cache_regs.o
kvm.so: kvm_mdb.c
gcc -m64 -shared \
@@ -59,8 +61,8 @@ install: kvm
@pfexec cp kvm.conf /usr/kernel/drv
check:
- @$(CSTYLE) kvm.c kvm_mdb.c kvm_emulate.c kvm_x86.c kvm_irq.c kvm_lapic.c kvm_i8254.c kvm_mmu.c kvm_iodev.c kvm_subr.c kvm_ioapic.c kvm_vmx.c kvm_i8259.c kvm_coalesced_mmio.c kvm_irq_comm.c
- @./tools/xxxcheck kvm_x86.c kvm.c kvm_irq.c kvm_lapic.c kvm_i8254.c kvm_mmu.c kvm_iodev.c kvm_ioapic.c kvm_vmx.c kvm_i8259.c kvm_coalesced_mmio.c kvm_irq_comm.c
+ @$(CSTYLE) kvm.c kvm_mdb.c kvm_emulate.c kvm_x86.c kvm_irq.c kvm_lapic.c kvm_i8254.c kvm_mmu.c kvm_iodev.c kvm_subr.c kvm_ioapic.c kvm_vmx.c kvm_i8259.c kvm_coalesced_mmio.c kvm_irq_comm.c kvm_cache_regs.c
+ @./tools/xxxcheck kvm_x86.c kvm.c kvm_irq.c kvm_lapic.c kvm_i8254.c kvm_mmu.c kvm_iodev.c kvm_ioapic.c kvm_vmx.c kvm_i8259.c kvm_coalesced_mmio.c kvm_irq_comm.c kvm_cache_regs.c
load: install
@echo "==> Loading kvm module"
diff --git a/kvm.c b/kvm.c
index c2f570b..6ee4b1f 100644
--- a/kvm.c
+++ b/kvm.c
@@ -52,6 +52,7 @@
#include "kvm_coalesced_mmio.h"
#include "kvm_i8254.h"
#include "kvm_mmu.h"
+#include "kvm_cache_regs.h"
#undef DEBUG
@@ -288,45 +289,7 @@ struct kvm_x86_ops *kvm_x86_ops;
-inline ulong
-kvm_read_cr0_bits(struct kvm_vcpu *vcpu, ulong mask)
-{
- ulong tmask = mask & KVM_POSSIBLE_CR0_GUEST_BITS;
-
- if (tmask & vcpu->arch.cr0_guest_owned_bits)
- kvm_x86_ops->decache_cr0_guest_bits(vcpu);
- return (vcpu->arch.cr0 & mask);
-}
-
-unsigned long
-kvm_register_read(struct kvm_vcpu *vcpu, enum kvm_reg reg)
-{
- if (!test_bit(reg, (unsigned long *)&vcpu->arch.regs_avail))
- kvm_x86_ops->cache_reg(vcpu, reg);
-
- return (vcpu->arch.regs[reg]);
-}
-
-inline void
-kvm_register_write(struct kvm_vcpu *vcpu, enum kvm_reg reg, unsigned long val)
-{
- vcpu->arch.regs[reg] = val;
- __set_bit(reg, (unsigned long *)&vcpu->arch.regs_dirty);
- __set_bit(reg, (unsigned long *)&vcpu->arch.regs_avail);
-}
-
-inline unsigned long
-kvm_rip_read(struct kvm_vcpu *vcpu)
-{
- return (kvm_register_read(vcpu, VCPU_REGS_RIP));
-}
-
-inline void
-kvm_rip_write(struct kvm_vcpu *vcpu, unsigned long val)
-{
- kvm_register_write(vcpu, VCPU_REGS_RIP, val);
-}
inline int
kvm_exception_is_soft(unsigned int nr)
@@ -428,9 +391,6 @@ kvm_reload_remote_mmus(struct kvm *kvm)
make_all_cpus_request(kvm, KVM_REQ_MMU_RELOAD);
}
-
-extern inline uint64_t kvm_pdptr_read(struct kvm_vcpu *vcpu, int index);
-
gfn_t
unalias_gfn_instantiation(struct kvm *kvm, gfn_t gfn)
{
@@ -2186,16 +2146,6 @@ ldt_load(void)
wr_ldtr(ULDT_SEL);
}
-inline ulong
-kvm_read_cr4_bits(struct kvm_vcpu *vcpu, ulong mask)
-{
- uint64_t tmask = mask & KVM_POSSIBLE_CR4_GUEST_BITS;
-
- if (tmask & vcpu->arch.cr4_guest_owned_bits)
- kvm_x86_ops->decache_cr4_guest_bits(vcpu);
-
- return (vcpu->arch.cr4 & mask);
-}
inline int
is_pae(struct kvm_vcpu *vcpu)
@@ -2550,19 +2500,6 @@ kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
return (0);
}
-
-inline ulong
-kvm_read_cr4(struct kvm_vcpu *vcpu)
-{
- return (kvm_read_cr4_bits(vcpu, ~0UL));
-}
-
-inline ulong
-kvm_read_cr0(struct kvm_vcpu *vcpu)
-{
- return (kvm_read_cr0_bits(vcpu, ~0UL));
-}
-
unsigned long
kvm_get_cr8(struct kvm_vcpu *vcpu)
{
diff --git a/kvm_cache_regs.c b/kvm_cache_regs.c
new file mode 100644
index 0000000..33da1f2
--- /dev/null
+++ b/kvm_cache_regs.c
@@ -0,0 +1,93 @@
+/*
+ * Ported from Linux by Joyent.
+ * Copyright 2011 Joyent, Inc.
+ */
+/*
+ * XXX Need proper header files!
+ */
+#include "msr.h"
+#include "irqflags.h"
+#include "kvm_host.h"
+#include "kvm_x86host.h"
+#include "kvm_iodev.h"
+#include "kvm.h"
+#include "apicdef.h"
+#include "kvm_ioapic.h"
+#include "kvm_lapic.h"
+#include "irq.h"
+#include "kvm_cache_regs.h"
+
+
+unsigned long
+kvm_register_read(struct kvm_vcpu *vcpu, enum kvm_reg reg)
+{
+ if (!test_bit(reg, (unsigned long *)&vcpu->arch.regs_avail))
+ kvm_x86_ops->cache_reg(vcpu, reg);
+
+ return (vcpu->arch.regs[reg]);
+}
+
+void
+kvm_register_write(struct kvm_vcpu *vcpu, enum kvm_reg reg, unsigned long val)
+{
+ vcpu->arch.regs[reg] = val;
+ __set_bit(reg, (unsigned long *)&vcpu->arch.regs_dirty);
+ __set_bit(reg, (unsigned long *)&vcpu->arch.regs_avail);
+}
+
+unsigned long
+kvm_rip_read(struct kvm_vcpu *vcpu)
+{
+ return (kvm_register_read(vcpu, VCPU_REGS_RIP));
+}
+
+void
+kvm_rip_write(struct kvm_vcpu *vcpu, unsigned long val)
+{
+ kvm_register_write(vcpu, VCPU_REGS_RIP, val);
+}
+
+uint64_t
+kvm_pdptr_read(struct kvm_vcpu *vcpu, int index)
+{
+ if (!test_bit(VCPU_EXREG_PDPTR,
+ (unsigned long *)&vcpu->arch.regs_avail)) {
+ kvm_x86_ops->cache_reg(vcpu, VCPU_EXREG_PDPTR);
+ }
+
+ return (vcpu->arch.pdptrs[index]);
+}
+
+ulong
+kvm_read_cr0_bits(struct kvm_vcpu *vcpu, ulong mask)
+{
+ ulong tmask = mask & KVM_POSSIBLE_CR0_GUEST_BITS;
+
+ if (tmask & vcpu->arch.cr0_guest_owned_bits)
+ kvm_x86_ops->decache_cr0_guest_bits(vcpu);
+
+ return (vcpu->arch.cr0 & mask);
+}
+
+ulong
+kvm_read_cr0(struct kvm_vcpu *vcpu)
+{
+ return (kvm_read_cr0_bits(vcpu, ~0UL));
+}
+
+ulong
+kvm_read_cr4_bits(struct kvm_vcpu *vcpu, ulong mask)
+{
+ uint64_t tmask = mask & KVM_POSSIBLE_CR4_GUEST_BITS;
+
+ if (tmask & vcpu->arch.cr4_guest_owned_bits)
+ kvm_x86_ops->decache_cr4_guest_bits(vcpu);
+
+ return (vcpu->arch.cr4 & mask);
+}
+
+ulong
+kvm_read_cr4(struct kvm_vcpu *vcpu)
+{
+ return (kvm_read_cr4_bits(vcpu, ~0UL));
+}
diff --git a/kvm_cache_regs.h b/kvm_cache_regs.h
new file mode 100644
index 0000000..b8ea86f
--- /dev/null
+++ b/kvm_cache_regs.h
@@ -0,0 +1,22 @@
+#ifndef ASM_KVM_CACHE_REGS_H
+#define ASM_KVM_CACHE_REGS_H
+
+#include "processor-flags.h"
+#include <sys/types.h>
+
+#define KVM_POSSIBLE_CR0_GUEST_BITS X86_CR0_TS
+#define KVM_POSSIBLE_CR4_GUEST_BITS \
+ (X86_CR4_PVI | X86_CR4_DE | X86_CR4_PCE | X86_CR4_OSFXSR \
+ | X86_CR4_OSXMMEXCPT | X86_CR4_PGE)
+
+extern unsigned long kvm_register_read(struct kvm_vcpu *, enum kvm_reg);
+extern void kvm_register_write(struct kvm_vcpu *, enum kvm_reg, unsigned long);
+extern unsigned long kvm_rip_read(struct kvm_vcpu *vcpu);
+extern void kvm_rip_write(struct kvm_vcpu *vcpu, unsigned long val);
+extern uint64_t kvm_pdptr_read(struct kvm_vcpu *vcpu, int index);
+extern ulong kvm_read_cr0_bits(struct kvm_vcpu *vcpu, ulong mask);
+extern ulong kvm_read_cr0(struct kvm_vcpu *vcpu);
+extern ulong kvm_read_cr4_bits(struct kvm_vcpu *vcpu, ulong mask);
+extern ulong kvm_read_cr4(struct kvm_vcpu *vcpu);
+
+#endif
diff --git a/kvm_x86.c b/kvm_x86.c
index 07bad1e..3ab2843 100644
--- a/kvm_x86.c
+++ b/kvm_x86.c
@@ -43,6 +43,7 @@
#include "irq.h"
#include "kvm_i8254.h"
#include "kvm_lapic.h"
+#include "kvm_cache_regs.h"
#undef DEBUG
@@ -56,10 +57,8 @@ extern unsigned long find_first_zero_bit(const unsigned long *addr,
unsigned long size);
extern uint32_t vmcs_read32(unsigned long field);
extern uint16_t vmcs_read16(unsigned long field);
-extern ulong kvm_read_cr4(struct kvm_vcpu *vcpu);
extern void kvm_rip_write(struct kvm_vcpu *vcpu, unsigned long val);
extern int kvm_is_mmio_pfn(pfn_t pfn);
-extern ulong kvm_read_cr4_bits(struct kvm_vcpu *vcpu, ulong mask);
extern int is_long_mode(struct kvm_vcpu *vcpu);
extern void kvm_mmu_unload(struct kvm_vcpu *);
extern void kvm_free_physmem_slot(struct kvm_memory_slot *,
@@ -757,8 +756,6 @@ kvm_set_cr8(struct kvm_vcpu *vcpu, unsigned long cr8)
vcpu->arch.cr8 = cr8;
}
-extern inline ulong kvm_read_cr0_bits(struct kvm_vcpu *vcpu, ulong mask);
-
int
is_paging(struct kvm_vcpu *vcpu)
{
@@ -1126,16 +1123,7 @@ kvm_flush_remote_tlbs(struct kvm *kvm)
KVM_KSTAT_INC(kvm, kvmks_remote_tlb_flush);
}
-inline uint64_t
-kvm_pdptr_read(struct kvm_vcpu *vcpu, int index)
-{
- if (!test_bit(VCPU_EXREG_PDPTR,
- (unsigned long *)&vcpu->arch.regs_avail)) {
- kvm_x86_ops->cache_reg(vcpu, VCPU_EXREG_PDPTR);
- }
- return (vcpu->arch.pdptrs[index]);
-}
gfn_t