sipi-undo

---
 drivers/kvm/irq.c      |   10 +------
 drivers/kvm/kvm.h      |    6 ----
 drivers/kvm/kvm_main.c |   76 ++----------------------------------------------
 drivers/kvm/lapic.c    |   15 ++-------
 drivers/kvm/svm.c      |    7 +----
 drivers/kvm/vmx.c      |   39 +-----------------------
 6 files changed, 11 insertions(+), 142 deletions(-)

diff --git a/drivers/kvm/irq.c b/drivers/kvm/irq.c
index ab2bc72..eb72b56 100644
--- a/drivers/kvm/irq.c
+++ b/drivers/kvm/irq.c
@@ -32,17 +32,9 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
 {
 	struct kvm_pic *s;
 
-	if (!(kvm_arch_ops->get_rflags(v) & X86_EFLAGS_IF))
-		return v->sipi_vector != -1;
-
-	if (v->vcpu_id == 1 && v->sipi_vector != -1)
-		printk("%s: %d sipi_vector %x\n", __FUNCTION__, v->vcpu_id, v->sipi_vector);
 	if (kvm_apic_has_interrupt(v) == -1) {	/* LAPIC */
 		s = pic_irqchip(v->kvm);	/* PIC */
-		if (v->vcpu_id && s->output) printk("%s: pic\n", __FUNCTION__);
-		if (s->output && v->vcpu_id == 0)
-			return 1;
-		return v->sipi_vector != -1;
+		return s->output;
 	}
 	return 1;
 }
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 8ead745..f8fe87d 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -65,9 +65,6 @@
  * vcpu->requests bit members
  */
 #define KVM_TLB_FLUSH 0
-#define KVM_REQ_SIPI  1
-#define KVM_REQ_INIT  2
-#define KVM_REQ_HALT  3
 
 /*
  * Address types:
@@ -311,7 +308,6 @@ struct kvm_vcpu {
 	struct kvm_run *run;
 	int interrupt_window_open;
 	int guest_mode;
-	int sipi_vector;
 	unsigned long requests;
 	unsigned long irq_summary; /* bit vector: 1 per word in irq_pending */
 	DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
@@ -572,8 +568,6 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in,
 			    gva_t address, int rep, unsigned port);
 void kvm_emulate_cpuid(struct kvm_vcpu *vcpu);
 int kvm_emulate_halt(struct kvm_vcpu *vcpu);
-void kvm_handle_init(struct kvm_vcpu *vcpu);
-void kvm_handle_sipi(struct kvm_vcpu *vcpu);
 int emulate_invlpg(struct kvm_vcpu *vcpu, gva_t address);
 int emulate_clts(struct kvm_vcpu *vcpu);
 int emulator_get_dr(struct x86_emulate_ctxt* ctxt, int dr,
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 9667cfc..f4cbd4f 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -249,7 +249,6 @@ int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id)
 	vcpu->mmu.root_hpa = INVALID_PAGE;
 	vcpu->kvm = kvm;
 	vcpu->vcpu_id = id;
-	vcpu->sipi_vector = -1;
 	init_waitqueue_head(&vcpu->wq);
 
 	page = alloc_page(GFP_KERNEL | __GFP_ZERO);
@@ -1369,40 +1368,30 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
 }
 EXPORT_SYMBOL_GPL(emulate_instruction);
 
-static int vcpu_unhalted(struct kvm_vcpu *vcpu)
-{
-	return (irqchip_in_kernel(vcpu->kvm) && kvm_cpu_has_interrupt(vcpu))
-		|| vcpu->irq_summary;
-}
-
 /*
  * The vCPU has executed a HLT instruction with in-kernel mode enabled.
  */
 static void kvm_vcpu_kernel_halt(struct kvm_vcpu *vcpu)
 {
 	DECLARE_WAITQUEUE(wait, current);
-	int unhalt;
 
 	add_wait_queue(&vcpu->wq, &wait);
 
 	/*
 	 * We will block until either an interrupt or a signal wakes us up
 	 */
-	if (vcpu->vcpu_id) printk("halt start\n");
-	while(!(unhalt = vcpu_unhalted(vcpu)) && !signal_pending(current)) {
+	while(!(irqchip_in_kernel(vcpu->kvm) && kvm_cpu_has_interrupt(vcpu))
+	      && !vcpu->irq_summary
+	      && !signal_pending(current)) {
 		set_current_state(TASK_INTERRUPTIBLE);
 		vcpu_put(vcpu);
 		schedule();
 		vcpu_load(vcpu);
 	}
-	if (vcpu->vcpu_id) printk("halt end\n");
 
 	remove_wait_queue(&vcpu->wq, &wait);
 	set_current_state(TASK_RUNNING);
-	if (unhalt)
-		clear_bit(KVM_REQ_HALT, &vcpu->requests);
 }
-EXPORT_SYMBOL_GPL(kvm_vcpu_kernel_halt);
 
 int kvm_emulate_halt(struct kvm_vcpu *vcpu)
 {
@@ -2005,65 +1994,6 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in,
 }
 EXPORT_SYMBOL_GPL(kvm_emulate_pio_string);
 
-static void setup_segment(struct kvm_segment *seg, unsigned selector)
-{
-	seg->base = selector << 4;
-	seg->limit = 0xffff;
-	seg->selector = selector;
-	seg->type = 3;
-	seg->present = 1;
-	seg->dpl = 0;
-	seg->db = 0;
-	seg->s = 1;
-	seg->l = 0;
-	seg->g = 0;
-	seg->avl = 0;
-}
-
-void kvm_handle_init(struct kvm_vcpu *vcpu)
-{
-	struct kvm_segment seg;
-
-	printk("%s: %d init\n", __FUNCTION__, vcpu->vcpu_id);
-	memset(vcpu->regs, 0, sizeof vcpu->regs);
-	vcpu->rip = 0xfff0;
-	setup_segment(&seg, 0);
-	kvm_arch_ops->set_segment(vcpu, &seg, VCPU_SREG_DS);
-	kvm_arch_ops->set_segment(vcpu, &seg, VCPU_SREG_ES);
-	kvm_arch_ops->set_segment(vcpu, &seg, VCPU_SREG_FS);
-	kvm_arch_ops->set_segment(vcpu, &seg, VCPU_SREG_GS);
-	kvm_arch_ops->set_segment(vcpu, &seg, VCPU_SREG_SS);
-	setup_segment(&seg, 0xf000);
-	kvm_arch_ops->set_segment(vcpu, &seg, VCPU_SREG_CS);
-	kvm_arch_ops->decache_regs(vcpu);
-#ifdef CONFIG_X86_64
-	set_efer(vcpu, 0);
-#endif
-	set_cr0(vcpu, 0x60000010);
-	vcpu->cr2 = 0;
-	set_cr3(vcpu, 0);
-	set_cr4(vcpu, 0);
-	if (vcpu->vcpu_id != 0)
-		set_bit(KVM_REQ_HALT, &vcpu->requests);
-}
-EXPORT_SYMBOL_GPL(kvm_handle_init);
-
-void kvm_handle_sipi(struct kvm_vcpu *vcpu)
-{
-	struct kvm_segment seg;
-
-	printk("%s: %d sipi %x\n", __FUNCTION__, vcpu->vcpu_id,
-	       vcpu->sipi_vector);
-	kvm_arch_ops->cache_regs(vcpu);
-	setup_segment(&seg, vcpu->sipi_vector << 8);
-	kvm_arch_ops->set_segment(vcpu, &seg, VCPU_SREG_CS);
-	vcpu->rip = 0;
-	kvm_arch_ops->decache_regs(vcpu);
-	vcpu->sipi_vector = -1;
-	clear_bit(KVM_REQ_HALT, &vcpu->requests);
-}
-EXPORT_SYMBOL_GPL(kvm_handle_sipi);
-
 static int kvm_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
 {
 	int r;
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index 751ec03..0d3c16b 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -40,7 +40,7 @@
 
 #define APIC_BUS_CYCLE_NS 1
 
-// #define apic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg)
+/* #define apic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg) */
 #define apic_debug(fmt, arg...)
 
 #define APIC_LVT_NUM			6
@@ -353,16 +353,11 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
 		break;
 
 	case APIC_DM_INIT:
-		printk("%s: init\n", __FUNCTION__);
-		set_bit(KVM_REQ_INIT, &apic->vcpu->requests);
-		kvm_vcpu_kick(apic->vcpu);
+		printk(KERN_DEBUG "Ignoring guest INIT\n");
 		break;
 
 	case APIC_DM_STARTUP:
-		printk("%s: sipi %x\n", __FUNCTION__, vector);
-		apic->vcpu->sipi_vector = vector;
-		set_bit(KVM_REQ_SIPI, &apic->vcpu->requests);
-		kvm_vcpu_kick(apic->vcpu);
+		printk(KERN_DEBUG "Ignoring guest STARTUP\n");
 		break;
 
 	default:
@@ -776,7 +771,7 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
 
 	/* with FSB delivery interrupt, we can restart APIC functionality */
 	apic_debug("apic base msr is 0x%016" PRIx64 ", and base address is "
-		   "0x%lx.\n", vcpu->apic_base, apic->base_address);
+		   "0x%lx.\n", apic->apic_base, apic->base_address);
 
 	spin_unlock_bh(&apic->lock);
 }
@@ -972,8 +967,6 @@ int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu)
 	if ((highest_irr == -1) ||
 	    ((highest_irr & 0xF0) <= apic_get_reg(apic, APIC_PROCPRI)))
 		return -1;
-	if (vcpu->vcpu_id)
-		printk("apic vector: %x\n", highest_irr);
 	return highest_irr;
 }
 
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c
index c64fe6d..3093fb9 100644
--- a/drivers/kvm/svm.c
+++ b/drivers/kvm/svm.c
@@ -1475,14 +1475,9 @@ again:
 		do_interrupt_requests(svm, kvm_run);
 
 	vcpu->guest_mode = 1;
-	if (vcpu->requests) {
+	if (vcpu->requests)
 		if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests))
 		    svm_flush_tlb(vcpu);
-		if (test_and_clear_bit(KVM_REQ_SIPI, &vcpu->requests))
-		    kvm_handle_sipi(vcpu);
-		if (test_and_clear_bit(KVM_REQ_INIT, &vcpu->requests))
-		    kvm_handle_init(vcpu);
-	}
 
 	pre_svm_run(svm);
 
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
index dafa55e..34a7fad 100644
--- a/drivers/kvm/vmx.c
+++ b/drivers/kvm/vmx.c
@@ -1409,8 +1409,6 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)
 	msr = 0xfee00000 | MSR_IA32_APICBASE_ENABLE;
 	if (vmx->vcpu.vcpu_id == 0)
 		msr |= MSR_IA32_APICBASE_BSP;
-	else
-		set_bit(KVM_REQ_HALT, &vmx->vcpu.requests);
 	kvm_set_apic_base(&vmx->vcpu, msr);
 
 	fx_init(&vmx->vcpu);
@@ -2041,8 +2039,7 @@ static int handle_interrupt_window(struct kvm_vcpu *vcpu,
 static int handle_halt(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
 {
 	skip_emulated_instruction(vcpu);
-	set_bit(KVM_REQ_HALT, &vcpu->requests);
-	return 1;
+	return kvm_emulate_halt(vcpu);
 }
 
 static int handle_vmcall(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
@@ -2095,7 +2092,6 @@ static int kvm_handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
 	else {
 		kvm_run->exit_reason = KVM_EXIT_UNKNOWN;
 		kvm_run->hw.hardware_exit_reason = exit_reason;
-		printk("exit %d\n", exit_reason);
 	}
 	return 0;
 }
@@ -2197,23 +2193,11 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
 	u8 fail;
 	int r;
 
-	if (vcpu->vcpu_id)
-		printk("vcpu requests %lx rip %x:%lx\n", vcpu->requests,
-		       vmcs_read16(GUEST_CS_SELECTOR), vmcs_readl(GUEST_RIP));
 preempted:
 	if (vcpu->guest_debug.enabled)
 		kvm_guest_debug_pre(vcpu);
 
 again:
-	if (signal_pending(current)) {
-		if (vcpu->vcpu_id)
-			printk("signal exit\n");
-		r = -EINTR;
-		kvm_run->exit_reason = KVM_EXIT_INTR;
-		++vcpu->stat.signal_exits;
-		goto out;
-	}
-
 	r = kvm_mmu_reload(vcpu);
 	if (unlikely(r))
 		goto out;
@@ -2245,28 +2229,9 @@ again:
 		do_interrupt_requests(vcpu, kvm_run);
 
 	vcpu->guest_mode = 1;
-	if (vcpu->requests) {
+	if (vcpu->requests)
 		if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests))
 		    vmx_flush_tlb(vcpu);
-		if (test_and_clear_bit(KVM_REQ_INIT, &vcpu->requests)) {
-			vcpu->guest_mode = 0;
-			local_irq_enable();
-			preempt_enable();
-			kvm_handle_init(vcpu);
-			goto again;
-		}
-		if (test_and_clear_bit(KVM_REQ_SIPI, &vcpu->requests))
-			kvm_handle_sipi(vcpu);
-		if (test_bit(KVM_REQ_HALT, &vcpu->requests)) {
-			if (vcpu->vcpu_id)
-				printk("vcpu %d halting\n", vcpu->vcpu_id);
-			vcpu->guest_mode = 0;
-			local_irq_enable();
-			preempt_enable();
-			kvm_emulate_halt(vcpu);
-			goto again;
-		}
-	}
 
 	asm (
 		/* Store host registers */

