From: Avi Kivity <avi@qumranet.com>
To: kvm-devel@lists.sourceforge.net
Cc: linux-kernel@vger.kernel.org, Rusty Russell <rusty@rustcorp.com.au>
Subject: [PATCH 033/104] KVM: SVM: de-containization
Date: Mon, 17 Sep 2007 10:31:15 +0200 [thread overview]
Message-ID: <11900179471458-git-send-email-avi@qumranet.com> (raw)
In-Reply-To: <11900179463203-git-send-email-avi@qumranet.com>
From: Rusty Russell <rusty@rustcorp.com.au>
container_of is wonderful, but not casting at all is better. This
patch changes svm.c's internal functions to pass "struct vcpu_svm"
instead of "struct kvm_vcpu" and using container_of.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Avi Kivity <avi@qumranet.com>
---
drivers/kvm/svm.c | 232 +++++++++++++++++++++++++----------------------------
1 files changed, 108 insertions(+), 124 deletions(-)
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c
index c18f0b2..504fb50 100644
--- a/drivers/kvm/svm.c
+++ b/drivers/kvm/svm.c
@@ -98,9 +98,9 @@ static inline u32 svm_has(u32 feat)
return svm_features & feat;
}
-static unsigned get_addr_size(struct kvm_vcpu *vcpu)
+static unsigned get_addr_size(struct vcpu_svm *svm)
{
- struct vmcb_save_area *sa = &to_svm(vcpu)->vmcb->save;
+ struct vmcb_save_area *sa = &svm->vmcb->save;
u16 cs_attrib;
if (!(sa->cr0 & X86_CR0_PE) || (sa->rflags & X86_EFLAGS_VM))
@@ -865,17 +865,15 @@ static void save_host_msrs(struct kvm_vcpu *vcpu)
#endif
}
-static void new_asid(struct kvm_vcpu *vcpu, struct svm_cpu_data *svm_data)
+static void new_asid(struct vcpu_svm *svm, struct svm_cpu_data *svm_data)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
if (svm_data->next_asid > svm_data->max_asid) {
++svm_data->asid_generation;
svm_data->next_asid = 1;
svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ALL_ASID;
}
- vcpu->cpu = svm_data->cpu;
+ svm->vcpu.cpu = svm_data->cpu;
svm->asid_generation = svm_data->asid_generation;
svm->vmcb->control.asid = svm_data->next_asid++;
}
@@ -929,42 +927,43 @@ static void svm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long value,
}
}
-static int pf_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
u32 exit_int_info = svm->vmcb->control.exit_int_info;
+ struct kvm *kvm = svm->vcpu.kvm;
u64 fault_address;
u32 error_code;
enum emulation_result er;
int r;
if (is_external_interrupt(exit_int_info))
- push_irq(vcpu, exit_int_info & SVM_EVTINJ_VEC_MASK);
+ push_irq(&svm->vcpu, exit_int_info & SVM_EVTINJ_VEC_MASK);
- mutex_lock(&vcpu->kvm->lock);
+ mutex_lock(&kvm->lock);
fault_address = svm->vmcb->control.exit_info_2;
error_code = svm->vmcb->control.exit_info_1;
- r = kvm_mmu_page_fault(vcpu, fault_address, error_code);
+ r = kvm_mmu_page_fault(&svm->vcpu, fault_address, error_code);
if (r < 0) {
- mutex_unlock(&vcpu->kvm->lock);
+ mutex_unlock(&kvm->lock);
return r;
}
if (!r) {
- mutex_unlock(&vcpu->kvm->lock);
+ mutex_unlock(&kvm->lock);
return 1;
}
- er = emulate_instruction(vcpu, kvm_run, fault_address, error_code);
- mutex_unlock(&vcpu->kvm->lock);
+ er = emulate_instruction(&svm->vcpu, kvm_run, fault_address,
+ error_code);
+ mutex_unlock(&kvm->lock);
switch (er) {
case EMULATE_DONE:
return 1;
case EMULATE_DO_MMIO:
- ++vcpu->stat.mmio_exits;
+ ++svm->vcpu.stat.mmio_exits;
return 0;
case EMULATE_FAIL:
- vcpu_printf(vcpu, "%s: emulate fail\n", __FUNCTION__);
+ vcpu_printf(&svm->vcpu, "%s: emulate fail\n", __FUNCTION__);
break;
default:
BUG();
@@ -974,21 +973,18 @@ static int pf_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
return 0;
}
-static int nm_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int nm_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
svm->vmcb->control.intercept_exceptions &= ~(1 << NM_VECTOR);
- if (!(vcpu->cr0 & X86_CR0_TS))
+ if (!(svm->vcpu.cr0 & X86_CR0_TS))
svm->vmcb->save.cr0 &= ~X86_CR0_TS;
- vcpu->fpu_active = 1;
+ svm->vcpu.fpu_active = 1;
return 1;
}
-static int shutdown_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int shutdown_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
/*
* VMCB is undefined after a SHUTDOWN intercept
* so reinitialize it.
@@ -1000,11 +996,10 @@ static int shutdown_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
return 0;
}
-static int io_get_override(struct kvm_vcpu *vcpu,
+static int io_get_override(struct vcpu_svm *svm,
struct vmcb_seg **seg,
int *addr_override)
{
- struct vcpu_svm *svm = to_svm(vcpu);
u8 inst[MAX_INST_SIZE];
unsigned ins_length;
gva_t rip;
@@ -1024,7 +1019,7 @@ static int io_get_override(struct kvm_vcpu *vcpu,
svm->vmcb->control.exit_info_2,
ins_length);
- if (kvm_read_guest(vcpu, rip, ins_length, inst) != ins_length)
+ if (kvm_read_guest(&svm->vcpu, rip, ins_length, inst) != ins_length)
/* #PF */
return 0;
@@ -1065,28 +1060,27 @@ static int io_get_override(struct kvm_vcpu *vcpu,
return 0;
}
-static unsigned long io_adress(struct kvm_vcpu *vcpu, int ins, gva_t *address)
+static unsigned long io_adress(struct vcpu_svm *svm, int ins, gva_t *address)
{
unsigned long addr_mask;
unsigned long *reg;
struct vmcb_seg *seg;
int addr_override;
- struct vcpu_svm *svm = to_svm(vcpu);
struct vmcb_save_area *save_area = &svm->vmcb->save;
u16 cs_attrib = save_area->cs.attrib;
- unsigned addr_size = get_addr_size(vcpu);
+ unsigned addr_size = get_addr_size(svm);
- if (!io_get_override(vcpu, &seg, &addr_override))
+ if (!io_get_override(svm, &seg, &addr_override))
return 0;
if (addr_override)
addr_size = (addr_size == 2) ? 4: (addr_size >> 1);
if (ins) {
- reg = &vcpu->regs[VCPU_REGS_RDI];
+ reg = &svm->vcpu.regs[VCPU_REGS_RDI];
seg = &svm->vmcb->save.es;
} else {
- reg = &vcpu->regs[VCPU_REGS_RSI];
+ reg = &svm->vcpu.regs[VCPU_REGS_RSI];
seg = (seg) ? seg : &svm->vmcb->save.ds;
}
@@ -1099,7 +1093,7 @@ static unsigned long io_adress(struct kvm_vcpu *vcpu, int ins, gva_t *address)
}
if (!(seg->attrib & SVM_SELECTOR_P_SHIFT)) {
- svm_inject_gp(vcpu, 0);
+ svm_inject_gp(&svm->vcpu, 0);
return 0;
}
@@ -1107,16 +1101,15 @@ static unsigned long io_adress(struct kvm_vcpu *vcpu, int ins, gva_t *address)
return addr_mask;
}
-static int io_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int io_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
u32 io_info = svm->vmcb->control.exit_info_1; //address size bug?
int size, down, in, string, rep;
unsigned port;
unsigned long count;
gva_t address = 0;
- ++vcpu->stat.io_exits;
+ ++svm->vcpu.stat.io_exits;
svm->next_rip = svm->vmcb->control.exit_info_2;
@@ -1131,7 +1124,7 @@ static int io_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
if (string) {
unsigned addr_mask;
- addr_mask = io_adress(vcpu, in, &address);
+ addr_mask = io_adress(svm, in, &address);
if (!addr_mask) {
printk(KERN_DEBUG "%s: get io address failed\n",
__FUNCTION__);
@@ -1139,60 +1132,57 @@ static int io_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
}
if (rep)
- count = vcpu->regs[VCPU_REGS_RCX] & addr_mask;
+ count = svm->vcpu.regs[VCPU_REGS_RCX] & addr_mask;
}
- return kvm_setup_pio(vcpu, kvm_run, in, size, count, string, down,
- address, rep, port);
+ return kvm_setup_pio(&svm->vcpu, kvm_run, in, size, count, string,
+ down, address, rep, port);
}
-static int nop_on_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int nop_on_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
return 1;
}
-static int halt_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int halt_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
svm->next_rip = svm->vmcb->save.rip + 1;
- skip_emulated_instruction(vcpu);
- return kvm_emulate_halt(vcpu);
+ skip_emulated_instruction(&svm->vcpu);
+ return kvm_emulate_halt(&svm->vcpu);
}
-static int vmmcall_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int vmmcall_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
svm->next_rip = svm->vmcb->save.rip + 3;
- skip_emulated_instruction(vcpu);
- return kvm_hypercall(vcpu, kvm_run);
+ skip_emulated_instruction(&svm->vcpu);
+ return kvm_hypercall(&svm->vcpu, kvm_run);
}
-static int invalid_op_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int invalid_op_interception(struct vcpu_svm *svm,
+ struct kvm_run *kvm_run)
{
- inject_ud(vcpu);
+ inject_ud(&svm->vcpu);
return 1;
}
-static int task_switch_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int task_switch_interception(struct vcpu_svm *svm,
+ struct kvm_run *kvm_run)
{
printk(KERN_DEBUG "%s: task swiche is unsupported\n", __FUNCTION__);
kvm_run->exit_reason = KVM_EXIT_UNKNOWN;
return 0;
}
-static int cpuid_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int cpuid_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
svm->next_rip = svm->vmcb->save.rip + 2;
- kvm_emulate_cpuid(vcpu);
+ kvm_emulate_cpuid(&svm->vcpu);
return 1;
}
-static int emulate_on_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int emulate_on_interception(struct vcpu_svm *svm,
+ struct kvm_run *kvm_run)
{
- if (emulate_instruction(vcpu, NULL, 0, 0) != EMULATE_DONE)
+ if (emulate_instruction(&svm->vcpu, NULL, 0, 0) != EMULATE_DONE)
printk(KERN_ERR "%s: failed\n", __FUNCTION__);
return 1;
}
@@ -1241,19 +1231,18 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data)
return 0;
}
-static int rdmsr_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int rdmsr_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
- u32 ecx = vcpu->regs[VCPU_REGS_RCX];
+ u32 ecx = svm->vcpu.regs[VCPU_REGS_RCX];
u64 data;
- if (svm_get_msr(vcpu, ecx, &data))
- svm_inject_gp(vcpu, 0);
+ if (svm_get_msr(&svm->vcpu, ecx, &data))
+ svm_inject_gp(&svm->vcpu, 0);
else {
svm->vmcb->save.rax = data & 0xffffffff;
- vcpu->regs[VCPU_REGS_RDX] = data >> 32;
+ svm->vcpu.regs[VCPU_REGS_RDX] = data >> 32;
svm->next_rip = svm->vmcb->save.rip + 2;
- skip_emulated_instruction(vcpu);
+ skip_emulated_instruction(&svm->vcpu);
}
return 1;
}
@@ -1302,29 +1291,28 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data)
return 0;
}
-static int wrmsr_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int wrmsr_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
- u32 ecx = vcpu->regs[VCPU_REGS_RCX];
+ u32 ecx = svm->vcpu.regs[VCPU_REGS_RCX];
u64 data = (svm->vmcb->save.rax & -1u)
- | ((u64)(vcpu->regs[VCPU_REGS_RDX] & -1u) << 32);
+ | ((u64)(svm->vcpu.regs[VCPU_REGS_RDX] & -1u) << 32);
svm->next_rip = svm->vmcb->save.rip + 2;
- if (svm_set_msr(vcpu, ecx, data))
- svm_inject_gp(vcpu, 0);
+ if (svm_set_msr(&svm->vcpu, ecx, data))
+ svm_inject_gp(&svm->vcpu, 0);
else
- skip_emulated_instruction(vcpu);
+ skip_emulated_instruction(&svm->vcpu);
return 1;
}
-static int msr_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int msr_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- if (to_svm(vcpu)->vmcb->control.exit_info_1)
- return wrmsr_interception(vcpu, kvm_run);
+ if (svm->vmcb->control.exit_info_1)
+ return wrmsr_interception(svm, kvm_run);
else
- return rdmsr_interception(vcpu, kvm_run);
+ return rdmsr_interception(svm, kvm_run);
}
-static int interrupt_window_interception(struct kvm_vcpu *vcpu,
+static int interrupt_window_interception(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
/*
@@ -1332,8 +1320,8 @@ static int interrupt_window_interception(struct kvm_vcpu *vcpu,
* possible
*/
if (kvm_run->request_interrupt_window &&
- !vcpu->irq_summary) {
- ++vcpu->stat.irq_window_exits;
+ !svm->vcpu.irq_summary) {
+ ++svm->vcpu.stat.irq_window_exits;
kvm_run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN;
return 0;
}
@@ -1341,7 +1329,7 @@ static int interrupt_window_interception(struct kvm_vcpu *vcpu,
return 1;
}
-static int (*svm_exit_handlers[])(struct kvm_vcpu *vcpu,
+static int (*svm_exit_handlers[])(struct vcpu_svm *svm,
struct kvm_run *kvm_run) = {
[SVM_EXIT_READ_CR0] = emulate_on_interception,
[SVM_EXIT_READ_CR3] = emulate_on_interception,
@@ -1388,9 +1376,8 @@ static int (*svm_exit_handlers[])(struct kvm_vcpu *vcpu,
};
-static int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int handle_exit(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
u32 exit_code = svm->vmcb->control.exit_code;
if (is_external_interrupt(svm->vmcb->control.exit_int_info) &&
@@ -1407,7 +1394,7 @@ static int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
return 0;
}
- return svm_exit_handlers[exit_code](vcpu, kvm_run);
+ return svm_exit_handlers[exit_code](svm, kvm_run);
}
static void reload_tss(struct kvm_vcpu *vcpu)
@@ -1419,80 +1406,77 @@ static void reload_tss(struct kvm_vcpu *vcpu)
load_TR_desc();
}
-static void pre_svm_run(struct kvm_vcpu *vcpu)
+static void pre_svm_run(struct vcpu_svm *svm)
{
- struct vcpu_svm *svm = to_svm(vcpu);
int cpu = raw_smp_processor_id();
struct svm_cpu_data *svm_data = per_cpu(svm_data, cpu);
svm->vmcb->control.tlb_ctl = TLB_CONTROL_DO_NOTHING;
- if (vcpu->cpu != cpu ||
+ if (svm->vcpu.cpu != cpu ||
svm->asid_generation != svm_data->asid_generation)
- new_asid(vcpu, svm_data);
+ new_asid(svm, svm_data);
}
-static inline void kvm_do_inject_irq(struct kvm_vcpu *vcpu)
+static inline void kvm_do_inject_irq(struct vcpu_svm *svm)
{
struct vmcb_control_area *control;
- control = &to_svm(vcpu)->vmcb->control;
- control->int_vector = pop_irq(vcpu);
+ control = &svm->vmcb->control;
+ control->int_vector = pop_irq(&svm->vcpu);
control->int_ctl &= ~V_INTR_PRIO_MASK;
control->int_ctl |= V_IRQ_MASK |
((/*control->int_vector >> 4*/ 0xf) << V_INTR_PRIO_SHIFT);
}
-static void kvm_reput_irq(struct kvm_vcpu *vcpu)
+static void kvm_reput_irq(struct vcpu_svm *svm)
{
- struct vmcb_control_area *control = &to_svm(vcpu)->vmcb->control;
+ struct vmcb_control_area *control = &svm->vmcb->control;
if (control->int_ctl & V_IRQ_MASK) {
control->int_ctl &= ~V_IRQ_MASK;
- push_irq(vcpu, control->int_vector);
+ push_irq(&svm->vcpu, control->int_vector);
}
- vcpu->interrupt_window_open =
+ svm->vcpu.interrupt_window_open =
!(control->int_state & SVM_INTERRUPT_SHADOW_MASK);
}
-static void do_interrupt_requests(struct kvm_vcpu *vcpu,
+static void do_interrupt_requests(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
struct vmcb_control_area *control = &svm->vmcb->control;
- vcpu->interrupt_window_open =
+ svm->vcpu.interrupt_window_open =
(!(control->int_state & SVM_INTERRUPT_SHADOW_MASK) &&
(svm->vmcb->save.rflags & X86_EFLAGS_IF));
- if (vcpu->interrupt_window_open && vcpu->irq_summary)
+ if (svm->vcpu.interrupt_window_open && svm->vcpu.irq_summary)
/*
* If interrupts enabled, and not blocked by sti or mov ss. Good.
*/
- kvm_do_inject_irq(vcpu);
+ kvm_do_inject_irq(svm);
/*
* Interrupts blocked. Wait for unblock.
*/
- if (!vcpu->interrupt_window_open &&
- (vcpu->irq_summary || kvm_run->request_interrupt_window)) {
+ if (!svm->vcpu.interrupt_window_open &&
+ (svm->vcpu.irq_summary || kvm_run->request_interrupt_window)) {
control->intercept |= 1ULL << INTERCEPT_VINTR;
} else
control->intercept &= ~(1ULL << INTERCEPT_VINTR);
}
-static void post_kvm_run_save(struct kvm_vcpu *vcpu,
+static void post_kvm_run_save(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
- kvm_run->ready_for_interrupt_injection = (vcpu->interrupt_window_open &&
- vcpu->irq_summary == 0);
+ kvm_run->ready_for_interrupt_injection
+ = (svm->vcpu.interrupt_window_open &&
+ svm->vcpu.irq_summary == 0);
kvm_run->if_flag = (svm->vmcb->save.rflags & X86_EFLAGS_IF) != 0;
- kvm_run->cr8 = vcpu->cr8;
- kvm_run->apic_base = vcpu->apic_base;
+ kvm_run->cr8 = svm->vcpu.cr8;
+ kvm_run->apic_base = svm->vcpu.apic_base;
}
/*
@@ -1501,13 +1485,13 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu,
*
* No need to exit to userspace if we already have an interrupt queued.
*/
-static int dm_request_for_irq_injection(struct kvm_vcpu *vcpu,
+static int dm_request_for_irq_injection(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
- return (!vcpu->irq_summary &&
+ return (!svm->vcpu.irq_summary &&
kvm_run->request_interrupt_window &&
- vcpu->interrupt_window_open &&
- (to_svm(vcpu)->vmcb->save.rflags & X86_EFLAGS_IF));
+ svm->vcpu.interrupt_window_open &&
+ (svm->vmcb->save.rflags & X86_EFLAGS_IF));
}
static void save_db_regs(unsigned long *db_regs)
@@ -1545,7 +1529,7 @@ again:
return r;
if (!vcpu->mmio_read_completed)
- do_interrupt_requests(vcpu, kvm_run);
+ do_interrupt_requests(svm, kvm_run);
clgi();
@@ -1554,7 +1538,7 @@ again:
if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests))
svm_flush_tlb(vcpu);
- pre_svm_run(vcpu);
+ pre_svm_run(svm);
save_host_msrs(vcpu);
fs_selector = read_fs();
@@ -1714,7 +1698,7 @@ again:
stgi();
- kvm_reput_irq(vcpu);
+ kvm_reput_irq(svm);
svm->next_rip = 0;
@@ -1722,29 +1706,29 @@ again:
kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY;
kvm_run->fail_entry.hardware_entry_failure_reason
= svm->vmcb->control.exit_code;
- post_kvm_run_save(vcpu, kvm_run);
+ post_kvm_run_save(svm, kvm_run);
return 0;
}
- r = handle_exit(vcpu, kvm_run);
+ r = handle_exit(svm, kvm_run);
if (r > 0) {
if (signal_pending(current)) {
++vcpu->stat.signal_exits;
- post_kvm_run_save(vcpu, kvm_run);
+ post_kvm_run_save(svm, kvm_run);
kvm_run->exit_reason = KVM_EXIT_INTR;
return -EINTR;
}
- if (dm_request_for_irq_injection(vcpu, kvm_run)) {
+ if (dm_request_for_irq_injection(svm, kvm_run)) {
++vcpu->stat.request_irq_exits;
- post_kvm_run_save(vcpu, kvm_run);
+ post_kvm_run_save(svm, kvm_run);
kvm_run->exit_reason = KVM_EXIT_INTR;
return -EINTR;
}
kvm_resched(vcpu);
goto again;
}
- post_kvm_run_save(vcpu, kvm_run);
+ post_kvm_run_save(svm, kvm_run);
return r;
}
--
1.5.3
WARNING: multiple messages have this Message-ID (diff)
From: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: [PATCH 033/104] KVM: SVM: de-containization
Date: Mon, 17 Sep 2007 10:31:15 +0200 [thread overview]
Message-ID: <11900179471458-git-send-email-avi@qumranet.com> (raw)
In-Reply-To: <11900179463203-git-send-email-avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
From: Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
container_of is wonderful, but not casting at all is better. This
patch changes svm.c's internal functions to pass "struct vcpu_svm"
instead of "struct kvm_vcpu" and using container_of.
Signed-off-by: Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
Signed-off-by: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
---
drivers/kvm/svm.c | 232 +++++++++++++++++++++++++----------------------------
1 files changed, 108 insertions(+), 124 deletions(-)
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c
index c18f0b2..504fb50 100644
--- a/drivers/kvm/svm.c
+++ b/drivers/kvm/svm.c
@@ -98,9 +98,9 @@ static inline u32 svm_has(u32 feat)
return svm_features & feat;
}
-static unsigned get_addr_size(struct kvm_vcpu *vcpu)
+static unsigned get_addr_size(struct vcpu_svm *svm)
{
- struct vmcb_save_area *sa = &to_svm(vcpu)->vmcb->save;
+ struct vmcb_save_area *sa = &svm->vmcb->save;
u16 cs_attrib;
if (!(sa->cr0 & X86_CR0_PE) || (sa->rflags & X86_EFLAGS_VM))
@@ -865,17 +865,15 @@ static void save_host_msrs(struct kvm_vcpu *vcpu)
#endif
}
-static void new_asid(struct kvm_vcpu *vcpu, struct svm_cpu_data *svm_data)
+static void new_asid(struct vcpu_svm *svm, struct svm_cpu_data *svm_data)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
if (svm_data->next_asid > svm_data->max_asid) {
++svm_data->asid_generation;
svm_data->next_asid = 1;
svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ALL_ASID;
}
- vcpu->cpu = svm_data->cpu;
+ svm->vcpu.cpu = svm_data->cpu;
svm->asid_generation = svm_data->asid_generation;
svm->vmcb->control.asid = svm_data->next_asid++;
}
@@ -929,42 +927,43 @@ static void svm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long value,
}
}
-static int pf_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
u32 exit_int_info = svm->vmcb->control.exit_int_info;
+ struct kvm *kvm = svm->vcpu.kvm;
u64 fault_address;
u32 error_code;
enum emulation_result er;
int r;
if (is_external_interrupt(exit_int_info))
- push_irq(vcpu, exit_int_info & SVM_EVTINJ_VEC_MASK);
+ push_irq(&svm->vcpu, exit_int_info & SVM_EVTINJ_VEC_MASK);
- mutex_lock(&vcpu->kvm->lock);
+ mutex_lock(&kvm->lock);
fault_address = svm->vmcb->control.exit_info_2;
error_code = svm->vmcb->control.exit_info_1;
- r = kvm_mmu_page_fault(vcpu, fault_address, error_code);
+ r = kvm_mmu_page_fault(&svm->vcpu, fault_address, error_code);
if (r < 0) {
- mutex_unlock(&vcpu->kvm->lock);
+ mutex_unlock(&kvm->lock);
return r;
}
if (!r) {
- mutex_unlock(&vcpu->kvm->lock);
+ mutex_unlock(&kvm->lock);
return 1;
}
- er = emulate_instruction(vcpu, kvm_run, fault_address, error_code);
- mutex_unlock(&vcpu->kvm->lock);
+ er = emulate_instruction(&svm->vcpu, kvm_run, fault_address,
+ error_code);
+ mutex_unlock(&kvm->lock);
switch (er) {
case EMULATE_DONE:
return 1;
case EMULATE_DO_MMIO:
- ++vcpu->stat.mmio_exits;
+ ++svm->vcpu.stat.mmio_exits;
return 0;
case EMULATE_FAIL:
- vcpu_printf(vcpu, "%s: emulate fail\n", __FUNCTION__);
+ vcpu_printf(&svm->vcpu, "%s: emulate fail\n", __FUNCTION__);
break;
default:
BUG();
@@ -974,21 +973,18 @@ static int pf_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
return 0;
}
-static int nm_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int nm_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
svm->vmcb->control.intercept_exceptions &= ~(1 << NM_VECTOR);
- if (!(vcpu->cr0 & X86_CR0_TS))
+ if (!(svm->vcpu.cr0 & X86_CR0_TS))
svm->vmcb->save.cr0 &= ~X86_CR0_TS;
- vcpu->fpu_active = 1;
+ svm->vcpu.fpu_active = 1;
return 1;
}
-static int shutdown_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int shutdown_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
/*
* VMCB is undefined after a SHUTDOWN intercept
* so reinitialize it.
@@ -1000,11 +996,10 @@ static int shutdown_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
return 0;
}
-static int io_get_override(struct kvm_vcpu *vcpu,
+static int io_get_override(struct vcpu_svm *svm,
struct vmcb_seg **seg,
int *addr_override)
{
- struct vcpu_svm *svm = to_svm(vcpu);
u8 inst[MAX_INST_SIZE];
unsigned ins_length;
gva_t rip;
@@ -1024,7 +1019,7 @@ static int io_get_override(struct kvm_vcpu *vcpu,
svm->vmcb->control.exit_info_2,
ins_length);
- if (kvm_read_guest(vcpu, rip, ins_length, inst) != ins_length)
+ if (kvm_read_guest(&svm->vcpu, rip, ins_length, inst) != ins_length)
/* #PF */
return 0;
@@ -1065,28 +1060,27 @@ static int io_get_override(struct kvm_vcpu *vcpu,
return 0;
}
-static unsigned long io_adress(struct kvm_vcpu *vcpu, int ins, gva_t *address)
+static unsigned long io_adress(struct vcpu_svm *svm, int ins, gva_t *address)
{
unsigned long addr_mask;
unsigned long *reg;
struct vmcb_seg *seg;
int addr_override;
- struct vcpu_svm *svm = to_svm(vcpu);
struct vmcb_save_area *save_area = &svm->vmcb->save;
u16 cs_attrib = save_area->cs.attrib;
- unsigned addr_size = get_addr_size(vcpu);
+ unsigned addr_size = get_addr_size(svm);
- if (!io_get_override(vcpu, &seg, &addr_override))
+ if (!io_get_override(svm, &seg, &addr_override))
return 0;
if (addr_override)
addr_size = (addr_size == 2) ? 4: (addr_size >> 1);
if (ins) {
- reg = &vcpu->regs[VCPU_REGS_RDI];
+ reg = &svm->vcpu.regs[VCPU_REGS_RDI];
seg = &svm->vmcb->save.es;
} else {
- reg = &vcpu->regs[VCPU_REGS_RSI];
+ reg = &svm->vcpu.regs[VCPU_REGS_RSI];
seg = (seg) ? seg : &svm->vmcb->save.ds;
}
@@ -1099,7 +1093,7 @@ static unsigned long io_adress(struct kvm_vcpu *vcpu, int ins, gva_t *address)
}
if (!(seg->attrib & SVM_SELECTOR_P_SHIFT)) {
- svm_inject_gp(vcpu, 0);
+ svm_inject_gp(&svm->vcpu, 0);
return 0;
}
@@ -1107,16 +1101,15 @@ static unsigned long io_adress(struct kvm_vcpu *vcpu, int ins, gva_t *address)
return addr_mask;
}
-static int io_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int io_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
u32 io_info = svm->vmcb->control.exit_info_1; //address size bug?
int size, down, in, string, rep;
unsigned port;
unsigned long count;
gva_t address = 0;
- ++vcpu->stat.io_exits;
+ ++svm->vcpu.stat.io_exits;
svm->next_rip = svm->vmcb->control.exit_info_2;
@@ -1131,7 +1124,7 @@ static int io_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
if (string) {
unsigned addr_mask;
- addr_mask = io_adress(vcpu, in, &address);
+ addr_mask = io_adress(svm, in, &address);
if (!addr_mask) {
printk(KERN_DEBUG "%s: get io address failed\n",
__FUNCTION__);
@@ -1139,60 +1132,57 @@ static int io_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
}
if (rep)
- count = vcpu->regs[VCPU_REGS_RCX] & addr_mask;
+ count = svm->vcpu.regs[VCPU_REGS_RCX] & addr_mask;
}
- return kvm_setup_pio(vcpu, kvm_run, in, size, count, string, down,
- address, rep, port);
+ return kvm_setup_pio(&svm->vcpu, kvm_run, in, size, count, string,
+ down, address, rep, port);
}
-static int nop_on_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int nop_on_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
return 1;
}
-static int halt_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int halt_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
svm->next_rip = svm->vmcb->save.rip + 1;
- skip_emulated_instruction(vcpu);
- return kvm_emulate_halt(vcpu);
+ skip_emulated_instruction(&svm->vcpu);
+ return kvm_emulate_halt(&svm->vcpu);
}
-static int vmmcall_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int vmmcall_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
svm->next_rip = svm->vmcb->save.rip + 3;
- skip_emulated_instruction(vcpu);
- return kvm_hypercall(vcpu, kvm_run);
+ skip_emulated_instruction(&svm->vcpu);
+ return kvm_hypercall(&svm->vcpu, kvm_run);
}
-static int invalid_op_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int invalid_op_interception(struct vcpu_svm *svm,
+ struct kvm_run *kvm_run)
{
- inject_ud(vcpu);
+ inject_ud(&svm->vcpu);
return 1;
}
-static int task_switch_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int task_switch_interception(struct vcpu_svm *svm,
+ struct kvm_run *kvm_run)
{
printk(KERN_DEBUG "%s: task swiche is unsupported\n", __FUNCTION__);
kvm_run->exit_reason = KVM_EXIT_UNKNOWN;
return 0;
}
-static int cpuid_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int cpuid_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
svm->next_rip = svm->vmcb->save.rip + 2;
- kvm_emulate_cpuid(vcpu);
+ kvm_emulate_cpuid(&svm->vcpu);
return 1;
}
-static int emulate_on_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int emulate_on_interception(struct vcpu_svm *svm,
+ struct kvm_run *kvm_run)
{
- if (emulate_instruction(vcpu, NULL, 0, 0) != EMULATE_DONE)
+ if (emulate_instruction(&svm->vcpu, NULL, 0, 0) != EMULATE_DONE)
printk(KERN_ERR "%s: failed\n", __FUNCTION__);
return 1;
}
@@ -1241,19 +1231,18 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data)
return 0;
}
-static int rdmsr_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int rdmsr_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
- u32 ecx = vcpu->regs[VCPU_REGS_RCX];
+ u32 ecx = svm->vcpu.regs[VCPU_REGS_RCX];
u64 data;
- if (svm_get_msr(vcpu, ecx, &data))
- svm_inject_gp(vcpu, 0);
+ if (svm_get_msr(&svm->vcpu, ecx, &data))
+ svm_inject_gp(&svm->vcpu, 0);
else {
svm->vmcb->save.rax = data & 0xffffffff;
- vcpu->regs[VCPU_REGS_RDX] = data >> 32;
+ svm->vcpu.regs[VCPU_REGS_RDX] = data >> 32;
svm->next_rip = svm->vmcb->save.rip + 2;
- skip_emulated_instruction(vcpu);
+ skip_emulated_instruction(&svm->vcpu);
}
return 1;
}
@@ -1302,29 +1291,28 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data)
return 0;
}
-static int wrmsr_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int wrmsr_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
- u32 ecx = vcpu->regs[VCPU_REGS_RCX];
+ u32 ecx = svm->vcpu.regs[VCPU_REGS_RCX];
u64 data = (svm->vmcb->save.rax & -1u)
- | ((u64)(vcpu->regs[VCPU_REGS_RDX] & -1u) << 32);
+ | ((u64)(svm->vcpu.regs[VCPU_REGS_RDX] & -1u) << 32);
svm->next_rip = svm->vmcb->save.rip + 2;
- if (svm_set_msr(vcpu, ecx, data))
- svm_inject_gp(vcpu, 0);
+ if (svm_set_msr(&svm->vcpu, ecx, data))
+ svm_inject_gp(&svm->vcpu, 0);
else
- skip_emulated_instruction(vcpu);
+ skip_emulated_instruction(&svm->vcpu);
return 1;
}
-static int msr_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int msr_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- if (to_svm(vcpu)->vmcb->control.exit_info_1)
- return wrmsr_interception(vcpu, kvm_run);
+ if (svm->vmcb->control.exit_info_1)
+ return wrmsr_interception(svm, kvm_run);
else
- return rdmsr_interception(vcpu, kvm_run);
+ return rdmsr_interception(svm, kvm_run);
}
-static int interrupt_window_interception(struct kvm_vcpu *vcpu,
+static int interrupt_window_interception(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
/*
@@ -1332,8 +1320,8 @@ static int interrupt_window_interception(struct kvm_vcpu *vcpu,
* possible
*/
if (kvm_run->request_interrupt_window &&
- !vcpu->irq_summary) {
- ++vcpu->stat.irq_window_exits;
+ !svm->vcpu.irq_summary) {
+ ++svm->vcpu.stat.irq_window_exits;
kvm_run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN;
return 0;
}
@@ -1341,7 +1329,7 @@ static int interrupt_window_interception(struct kvm_vcpu *vcpu,
return 1;
}
-static int (*svm_exit_handlers[])(struct kvm_vcpu *vcpu,
+static int (*svm_exit_handlers[])(struct vcpu_svm *svm,
struct kvm_run *kvm_run) = {
[SVM_EXIT_READ_CR0] = emulate_on_interception,
[SVM_EXIT_READ_CR3] = emulate_on_interception,
@@ -1388,9 +1376,8 @@ static int (*svm_exit_handlers[])(struct kvm_vcpu *vcpu,
};
-static int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+static int handle_exit(struct vcpu_svm *svm, struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
u32 exit_code = svm->vmcb->control.exit_code;
if (is_external_interrupt(svm->vmcb->control.exit_int_info) &&
@@ -1407,7 +1394,7 @@ static int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
return 0;
}
- return svm_exit_handlers[exit_code](vcpu, kvm_run);
+ return svm_exit_handlers[exit_code](svm, kvm_run);
}
static void reload_tss(struct kvm_vcpu *vcpu)
@@ -1419,80 +1406,77 @@ static void reload_tss(struct kvm_vcpu *vcpu)
load_TR_desc();
}
-static void pre_svm_run(struct kvm_vcpu *vcpu)
+static void pre_svm_run(struct vcpu_svm *svm)
{
- struct vcpu_svm *svm = to_svm(vcpu);
int cpu = raw_smp_processor_id();
struct svm_cpu_data *svm_data = per_cpu(svm_data, cpu);
svm->vmcb->control.tlb_ctl = TLB_CONTROL_DO_NOTHING;
- if (vcpu->cpu != cpu ||
+ if (svm->vcpu.cpu != cpu ||
svm->asid_generation != svm_data->asid_generation)
- new_asid(vcpu, svm_data);
+ new_asid(svm, svm_data);
}
-static inline void kvm_do_inject_irq(struct kvm_vcpu *vcpu)
+static inline void kvm_do_inject_irq(struct vcpu_svm *svm)
{
struct vmcb_control_area *control;
- control = &to_svm(vcpu)->vmcb->control;
- control->int_vector = pop_irq(vcpu);
+ control = &svm->vmcb->control;
+ control->int_vector = pop_irq(&svm->vcpu);
control->int_ctl &= ~V_INTR_PRIO_MASK;
control->int_ctl |= V_IRQ_MASK |
((/*control->int_vector >> 4*/ 0xf) << V_INTR_PRIO_SHIFT);
}
-static void kvm_reput_irq(struct kvm_vcpu *vcpu)
+static void kvm_reput_irq(struct vcpu_svm *svm)
{
- struct vmcb_control_area *control = &to_svm(vcpu)->vmcb->control;
+ struct vmcb_control_area *control = &svm->vmcb->control;
if (control->int_ctl & V_IRQ_MASK) {
control->int_ctl &= ~V_IRQ_MASK;
- push_irq(vcpu, control->int_vector);
+ push_irq(&svm->vcpu, control->int_vector);
}
- vcpu->interrupt_window_open =
+ svm->vcpu.interrupt_window_open =
!(control->int_state & SVM_INTERRUPT_SHADOW_MASK);
}
-static void do_interrupt_requests(struct kvm_vcpu *vcpu,
+static void do_interrupt_requests(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
struct vmcb_control_area *control = &svm->vmcb->control;
- vcpu->interrupt_window_open =
+ svm->vcpu.interrupt_window_open =
(!(control->int_state & SVM_INTERRUPT_SHADOW_MASK) &&
(svm->vmcb->save.rflags & X86_EFLAGS_IF));
- if (vcpu->interrupt_window_open && vcpu->irq_summary)
+ if (svm->vcpu.interrupt_window_open && svm->vcpu.irq_summary)
/*
* If interrupts enabled, and not blocked by sti or mov ss. Good.
*/
- kvm_do_inject_irq(vcpu);
+ kvm_do_inject_irq(svm);
/*
* Interrupts blocked. Wait for unblock.
*/
- if (!vcpu->interrupt_window_open &&
- (vcpu->irq_summary || kvm_run->request_interrupt_window)) {
+ if (!svm->vcpu.interrupt_window_open &&
+ (svm->vcpu.irq_summary || kvm_run->request_interrupt_window)) {
control->intercept |= 1ULL << INTERCEPT_VINTR;
} else
control->intercept &= ~(1ULL << INTERCEPT_VINTR);
}
-static void post_kvm_run_save(struct kvm_vcpu *vcpu,
+static void post_kvm_run_save(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
- struct vcpu_svm *svm = to_svm(vcpu);
-
- kvm_run->ready_for_interrupt_injection = (vcpu->interrupt_window_open &&
- vcpu->irq_summary == 0);
+ kvm_run->ready_for_interrupt_injection
+ = (svm->vcpu.interrupt_window_open &&
+ svm->vcpu.irq_summary == 0);
kvm_run->if_flag = (svm->vmcb->save.rflags & X86_EFLAGS_IF) != 0;
- kvm_run->cr8 = vcpu->cr8;
- kvm_run->apic_base = vcpu->apic_base;
+ kvm_run->cr8 = svm->vcpu.cr8;
+ kvm_run->apic_base = svm->vcpu.apic_base;
}
/*
@@ -1501,13 +1485,13 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu,
*
* No need to exit to userspace if we already have an interrupt queued.
*/
-static int dm_request_for_irq_injection(struct kvm_vcpu *vcpu,
+static int dm_request_for_irq_injection(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
- return (!vcpu->irq_summary &&
+ return (!svm->vcpu.irq_summary &&
kvm_run->request_interrupt_window &&
- vcpu->interrupt_window_open &&
- (to_svm(vcpu)->vmcb->save.rflags & X86_EFLAGS_IF));
+ svm->vcpu.interrupt_window_open &&
+ (svm->vmcb->save.rflags & X86_EFLAGS_IF));
}
static void save_db_regs(unsigned long *db_regs)
@@ -1545,7 +1529,7 @@ again:
return r;
if (!vcpu->mmio_read_completed)
- do_interrupt_requests(vcpu, kvm_run);
+ do_interrupt_requests(svm, kvm_run);
clgi();
@@ -1554,7 +1538,7 @@ again:
if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests))
svm_flush_tlb(vcpu);
- pre_svm_run(vcpu);
+ pre_svm_run(svm);
save_host_msrs(vcpu);
fs_selector = read_fs();
@@ -1714,7 +1698,7 @@ again:
stgi();
- kvm_reput_irq(vcpu);
+ kvm_reput_irq(svm);
svm->next_rip = 0;
@@ -1722,29 +1706,29 @@ again:
kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY;
kvm_run->fail_entry.hardware_entry_failure_reason
= svm->vmcb->control.exit_code;
- post_kvm_run_save(vcpu, kvm_run);
+ post_kvm_run_save(svm, kvm_run);
return 0;
}
- r = handle_exit(vcpu, kvm_run);
+ r = handle_exit(svm, kvm_run);
if (r > 0) {
if (signal_pending(current)) {
++vcpu->stat.signal_exits;
- post_kvm_run_save(vcpu, kvm_run);
+ post_kvm_run_save(svm, kvm_run);
kvm_run->exit_reason = KVM_EXIT_INTR;
return -EINTR;
}
- if (dm_request_for_irq_injection(vcpu, kvm_run)) {
+ if (dm_request_for_irq_injection(svm, kvm_run)) {
++vcpu->stat.request_irq_exits;
- post_kvm_run_save(vcpu, kvm_run);
+ post_kvm_run_save(svm, kvm_run);
kvm_run->exit_reason = KVM_EXIT_INTR;
return -EINTR;
}
kvm_resched(vcpu);
goto again;
}
- post_kvm_run_save(vcpu, kvm_run);
+ post_kvm_run_save(svm, kvm_run);
return r;
}
--
1.5.3
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
next prev parent reply other threads:[~2007-09-17 8:41 UTC|newest]
Thread overview: 223+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-17 8:30 [PATCH 000/104] KVM patch queue for the 2.6.24 merge window Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 001/104] KVM: Fix *nopage() in kvm_main.c Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 9:13 ` Christoph Hellwig
2007-09-17 9:13 ` Christoph Hellwig
2007-09-17 9:15 ` Avi Kivity
2007-09-17 9:15 ` Avi Kivity
2007-09-17 9:18 ` Avi Kivity
2007-09-17 9:18 ` Avi Kivity
2007-09-16 21:29 ` Nick Piggin
2007-09-16 21:29 ` Nick Piggin
2007-09-17 18:19 ` Avi Kivity
2007-09-17 18:19 ` Avi Kivity
2007-09-17 17:17 ` Nick Piggin
2007-09-17 17:17 ` Nick Piggin
2007-09-18 10:44 ` Avi Kivity
2007-09-18 10:44 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 002/104] KVM: SMP: Add vcpu_id field in struct vcpu Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 003/104] KVM: Future-proof the exit information union ABI Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 004/104] KVM: In-kernel string pio write support Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 005/104] KVM: Trivial: /dev/kvm interface is no longer experimental Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 006/104] KVM: Trivial: Remove unused struct cpu_user_regs declaration Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 007/104] KVM: Trivial: Make decode_register() static Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 008/104] KVM: Trivial: Comment spelling may escape grep Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 009/104] KVM: Trivial: Avoid hardware_disable predeclaration Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 010/104] KVM: Trivial: Use standard CR0 flags macros from asm/cpu-features.h Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 011/104] KVM: Use standard CR3 flags, tighten checking Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 012/104] KVM: Use standard CR4 " Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 013/104] KVM: Trivial: Use standard BITMAP macros, open-code userspace-exposed header Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 014/104] KVM: Set exit_reason to KVM_EXIT_MMIO where run->mmio is initialized Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 015/104] KVM: Use standard CR8 flags, and fix TPR definition Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 016/104] KVM: x86 emulator: fix cmov for writeback changes Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:30 ` [PATCH 017/104] KVM: x86 emulator: fix faulty check for two-byte opcode Avi Kivity
2007-09-17 8:30 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 018/104] KVM: Return if the pdptrs are invalid when the guest turns on PAE Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 019/104] KVM: Hoist kvm_mmu_reload() out of the critical section Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 020/104] KVM: Move gfn_to_page out of kmap/unmap pairs Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 021/104] KVM: VMX: Import some constants of vmcs from IA32 SDM Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 022/104] KVM: Remove dead code in the cmpxchg instruction emulation Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 023/104] KVM: load_pdptrs() cleanups Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 024/104] KVM: Remove arch specific components from the general code Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 025/104] KVM: Dynamically allocate vcpus Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 026/104] KVM: VMX: Improve the method of writing vmcs control Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 027/104] KVM: add hypercall nr to kvm_run Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 028/104] KVM: Use the scheduler preemption notifiers to make kvm preemptible Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 029/104] KVM: Convert vm lock to a mutex Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 030/104] KVM: fx_init() needs preemption disabled while it plays with the FPU state Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 031/104] KVM: VMX: pass vcpu_vmx internally Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 032/104] KVM: Remove three magic numbers Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` Avi Kivity [this message]
2007-09-17 8:31 ` [PATCH 033/104] KVM: SVM: de-containization Avi Kivity
2007-09-17 8:31 ` [PATCH 034/104] KVM: SVM: internal function name cleanup Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 035/104] KVM: Change the emulator_{read,write,cmpxchg}_* functions to take a vcpu Avi Kivity
2007-09-17 8:31 ` [PATCH 035/104] KVM: Change the emulator_{read, write, cmpxchg}_* " Avi Kivity
2007-09-17 8:31 ` [PATCH 036/104] KVM: Remove kvm_{read,write}_guest() Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 037/104] KVM: Use kmem cache for allocating vcpus Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 038/104] KVM: Use alignment properties of vcpu to simplify FPU ops Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 039/104] KVM: kvm_vm_ioctl_get_dirty_log restore "nothing dirty" optimization Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 040/104] KVM: VMX: Add cpu consistency check Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 041/104] KVM: Don't assign vcpu->cr3 if it's invalid: check first, set last Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 042/104] KVM: Cleanup mark_page_dirty Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 043/104] KVM: SVM: Make set_msr_interception more reliable Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 044/104] KVM: Remove redundant alloc_vmcs_cpu declaration Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 045/104] KVM: Fix defined but not used warning in drivers/kvm/vmx.c Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 16:27 ` David Miller
2007-09-17 16:27 ` David Miller
2007-09-17 17:35 ` [kvm-devel] " Avi Kivity
2007-09-17 17:35 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 046/104] KVM: Remove stat_set from debugfs Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 047/104] KVM: Remove unneeded kvm_dev_open and kvm_dev_release functions Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 048/104] KVM: Add and use pr_unimpl for standard formatting of unimplemented features Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 16:16 ` Joe Perches
2007-09-17 16:16 ` Joe Perches
2007-09-17 23:08 ` Rusty Russell
2007-09-17 8:31 ` [PATCH 049/104] KVM: Use kmem_cache_free for kmem_cache_zalloc'ed objects Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 050/104] KVM: VMX: Remove a duplicated ia32e mode vm entry control Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 051/104] KVM: Remove useless assignment Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 052/104] KVM: Cleanup string I/O instruction emulation Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 053/104] KVM: Clean up kvm_setup_pio() Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 055/104] KVM: Communicate cr8 changes to userspace Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 056/104] KVM: x86 emulator: implement 'and $imm, %{al|ax|eax}' Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 057/104] KVM: x86 emulator: implement 'jmp rel' instruction (opcode 0xe9) Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 058/104] KVM: x86 emulator: Implement 'jmp rel short' instruction (opcode 0xeb) Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 059/104] KVM: x86 emulator: implement 'push reg' (opcodes 0x50-0x57) Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 060/104] KVM: VMX: allow rmode_tss_base() to work with >2G of guest memory Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 061/104] KVM: Support more memory slots Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 062/104] KVM: X86 emulator: fix 'push reg' writeback Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 063/104] KVM: VMX: Split segments reload in vmx_load_host_state() Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 064/104] KVM: Add support for in-kernel PIC emulation Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 065/104] KVM: Define and use cr8 access functions Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 066/104] KVM: Emulate local APIC in kernel Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 067/104] KVM: In-kernel I/O APIC model Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 068/104] KVM: Emulate hlt in the kernel Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 069/104] KVM: Protect in-kernel pio using kvm->lock Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 070/104] KVM: Add get/set irqchip ioctls for in-kernel PIC live migration support Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 071/104] KVM: Bypass irq_pending get/set when using in kernel irqchip Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 072/104] KVM: in-kernel IOAPIC save and restore support Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 073/104] KVM: in-kernel LAPIC " Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 074/104] KVM: pending irq save/restore Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 075/104] KVM: VMX: Use shadow TPR/cr8 for 64-bits guests Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 076/104] KVM: Keep track of missed timer irq injections Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:31 ` [PATCH 077/104] KVM: Migrate lapic hrtimer when vcpu moves to another cpu Avi Kivity
2007-09-17 8:31 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 078/104] KVM: disable tpr/cr8 sync when in-kernel APIC is used Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 079/104] KVM: deliver PIC interrupt only to vcpu0 Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 080/104] KVM: round robin for APIC lowest priority delivery mode Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 081/104] KVM: enable in-kernel APIC INIT/SIPI handling Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 082/104] KVM: Set the ET flag in CR0 after initializing FX Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 083/104] KVM: Remove the unused invlpg member of struct kvm_arch_ops Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 084/104] KVM: Clean up unloved invlpg emulation Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 085/104] KVM: Keep control regs in sync Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 086/104] KVM: Hoist SVM's get_cs_db_l_bits into core code Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 087/104] KVM: Simplify memory allocation Avi Kivity
2007-09-17 8:32 ` [PATCH 088/104] KVM: Rename kvm_arch_ops to kvm_x86_ops Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 089/104] KVM: MMU: Don't do GFP_NOWAIT allocations Avi Kivity
2007-09-17 8:32 ` [PATCH 090/104] KVM: VMX: Move vm entry failure handling to the exit handler Avi Kivity
2007-09-17 8:32 ` [PATCH 091/104] KVM: Move main vcpu loop into subarch independent code Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 092/104] KVM: VMX: Fix exit qualification width on i386 Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 093/104] KVM: x86 emulator: push imm8 Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 094/104] KVM: x86 emulator: call near Avi Kivity
2007-09-17 8:32 ` [PATCH 095/104] KVM: x86 emulator: pushf Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 096/104] KVM: Improve emulation failure reporting Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 097/104] KVM: x86 emulator: sort opcodes into ascending order Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 098/104] KVM: x86 emulator: imlpement jump conditional relative Avi Kivity
2007-09-17 8:32 ` [PATCH 099/104] KVM: X86 emulator: jump conditional short Avi Kivity
2007-09-17 8:32 ` [PATCH 100/104] KVM: x86 emulator: lea Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 101/104] KVM: x86 emulator: jmp abs Avi Kivity
2007-09-17 8:32 ` [PATCH 102/104] KVM: x86 emulator: fix src, dst value initialization Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 8:32 ` [PATCH 103/104] KVM: x86 emulator: popf Avi Kivity
2007-09-17 8:32 ` Avi Kivity
2007-09-17 15:59 ` git-send-email creates duplicate Message-Id's Adrian Bunk
2007-09-17 20:22 ` Junio C Hamano
2007-09-17 20:47 ` Matti Aarnio
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11900179471458-git-send-email-avi@qumranet.com \
--to=avi@qumranet.com \
--cc=kvm-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.