All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Add hvm vcpu reset support
@ 2007-02-05 15:09 Li, Xin B
  2007-02-05 15:33 ` Keir Fraser
  0 siblings, 1 reply; 3+ messages in thread
From: Li, Xin B @ 2007-02-05 15:09 UTC (permalink / raw)
  To: xen-devel

[-- Attachment #1: Type: text/plain, Size: 123 bytes --]

Add hvm vcpu reset support for x86 INIT IPI which is needed for CPU
hotplug.
Signed-off-by: Xin Li <xin.b.li@intel.com>

[-- Attachment #2: hotplug.init_ipi.patch --]
[-- Type: application/octet-stream, Size: 6240 bytes --]

diff -r 7a7509570af9 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c	Mon Feb 05 11:38:22 2007 +0000
+++ b/xen/arch/x86/hvm/hvm.c	Mon Feb 05 22:46:59 2007 +0800
@@ -273,6 +273,24 @@ void hvm_vcpu_destroy(struct vcpu *v)
     /*free_xen_event_channel(v, v->arch.hvm_vcpu.xen_port);*/
 }
 
+
+void hvm_vcpu_reset(struct vcpu *v)
+{
+    vcpu_pause(v);
+
+    vlapic_reset(vcpu_vlapic(v));
+
+    hvm_funcs.vcpu_initialise(v);
+
+    set_bit(_VCPUF_down, &v->vcpu_flags);
+    clear_bit(_VCPUF_initialised, &v->vcpu_flags);
+    clear_bit(_VCPUF_fpu_initialised, &v->vcpu_flags);
+    clear_bit(_VCPUF_fpu_dirtied, &v->vcpu_flags);
+    clear_bit(_VCPUF_blocked, &v->vcpu_flags);
+
+    vcpu_unpause(v);
+}
+
 static void hvm_vcpu_down(void)
 {
     struct vcpu *v = current;
@@ -624,19 +642,12 @@ void hvm_hypercall_page_initialise(struc
  */
 int hvm_bringup_ap(int vcpuid, int trampoline_vector)
 {
-    struct vcpu *bsp = current, *v;
-    struct domain *d = bsp->domain;
+    struct vcpu *v;
+    struct domain *d = current->domain;
     struct vcpu_guest_context *ctxt;
     int rc = 0;
 
     BUG_ON(!is_hvm_domain(d));
-
-    if ( bsp->vcpu_id != 0 )
-    {
-        gdprintk(XENLOG_ERR, "Not calling hvm_bringup_ap from BSP context.\n");
-        domain_crash(bsp->domain);
-        return -EINVAL;
-    }
 
     if ( (v = d->vcpu[vcpuid]) == NULL )
         return -ENOENT;
@@ -668,8 +679,8 @@ int hvm_bringup_ap(int vcpuid, int tramp
         goto out;
     }
 
-    if ( test_and_clear_bit(_VCPUF_down, &d->vcpu[vcpuid]->vcpu_flags) )
-        vcpu_wake(d->vcpu[vcpuid]);
+    if ( test_and_clear_bit(_VCPUF_down, &v->vcpu_flags) )
+        vcpu_wake(v);
     gdprintk(XENLOG_INFO, "AP %d bringup suceeded.\n", vcpuid);
 
  out:
diff -r 7a7509570af9 xen/arch/x86/hvm/svm/vmcb.c
--- a/xen/arch/x86/hvm/svm/vmcb.c	Mon Feb 05 11:38:22 2007 +0000
+++ b/xen/arch/x86/hvm/svm/vmcb.c	Mon Feb 05 22:37:41 2007 +0800
@@ -209,7 +209,8 @@ int svm_create_vmcb(struct vcpu *v)
     struct arch_svm_struct *arch_svm = &v->arch.hvm_svm;
     int rc;
 
-    if ( (arch_svm->vmcb = alloc_vmcb()) == NULL )
+    if ( (arch_svm->vmcb == NULL) &&
+         (arch_svm->vmcb = alloc_vmcb()) == NULL )
     {
         printk("Failed to create a new VMCB\n");
         return -ENOMEM;
diff -r 7a7509570af9 xen/arch/x86/hvm/vlapic.c
--- a/xen/arch/x86/hvm/vlapic.c	Mon Feb 05 11:38:22 2007 +0000
+++ b/xen/arch/x86/hvm/vlapic.c	Mon Feb 05 22:45:35 2007 +0800
@@ -83,8 +83,6 @@ static unsigned int vlapic_lvt_mask[VLAP
 #define vlapic_base_address(vlapic)                             \
     (vlapic->hw.apic_base_msr & MSR_IA32_APICBASE_BASE)
 
-static int vlapic_reset(struct vlapic *vlapic);
-
 /*
  * Generic APIC bitmap vector update & search routines.
  */
@@ -293,8 +291,11 @@ static int vlapic_accept_irq(struct vcpu
         break;
 
     case APIC_DM_SMI:
+        gdprintk(XENLOG_WARNING, "Ignoring guest SMI\n");
+        break;
+
     case APIC_DM_NMI:
-        gdprintk(XENLOG_WARNING, "Ignoring guest SMI/NMI\n");
+        gdprintk(XENLOG_WARNING, "Ignoring guest NMI\n");
         break;
 
     case APIC_DM_INIT:
@@ -303,10 +304,7 @@ static int vlapic_accept_irq(struct vcpu
             break;
         /* FIXME How to check the situation after vcpu reset? */
         if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
-        {
-            gdprintk(XENLOG_ERR, "Reset hvm vcpu not supported yet\n");
-            goto exit_and_crash;
-        }
+            hvm_vcpu_reset(v);
         v->arch.hvm_vcpu.init_sipi_sipi_state =
             HVM_VCPU_INIT_SIPI_SIPI_STATE_WAIT_SIPI;
         result = 1;
@@ -764,7 +762,7 @@ int cpu_get_apic_interrupt(struct vcpu *
 }
 
 /* Reset the VLPAIC back to its power-on/reset state. */
-static int vlapic_reset(struct vlapic *vlapic)
+void vlapic_reset(struct vlapic *vlapic)
 {
     struct vcpu *v = vlapic_vcpu(vlapic);
     int i;
@@ -793,8 +791,6 @@ static int vlapic_reset(struct vlapic *v
 
     vlapic_set_reg(vlapic, APIC_SPIV, 0xff);
     vlapic->hw.disabled |= VLAPIC_SW_DISABLED;
-
-    return 1;
 }
 
 #ifdef HVM_DEBUG_SUSPEND
@@ -922,7 +918,6 @@ int vlapic_init(struct vcpu *v)
     {
         dprintk(XENLOG_ERR, "malloc vlapic regs error for vcpu %x\n",
                 v->vcpu_id);
-        xfree(vlapic);
         return -ENOMEM;
     }
 
diff -r 7a7509570af9 xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c	Mon Feb 05 11:38:22 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmcs.c	Mon Feb 05 22:35:44 2007 +0800
@@ -295,6 +295,11 @@ static void construct_vmcs(struct vcpu *
 
     vmx_vmcs_enter(v);
 
+    v->arch.hvm_vmx.cpu_cr2 = 0;
+    v->arch.hvm_vmx.cpu_cr3 = 0;
+    memset(&v->arch.hvm_vmx.msr_state, 0, sizeof(v->arch.hvm_vmx.msr_state));
+    v->arch.hvm_vmx.vmxassist_enabled = 0;
+
     /* VMCS controls. */
     __vmwrite(PIN_BASED_VM_EXEC_CONTROL, vmx_pin_based_exec_control);
     __vmwrite(VM_EXIT_CONTROLS, vmx_vmexit_control);
@@ -448,10 +453,13 @@ static void construct_vmcs(struct vcpu *
 
 int vmx_create_vmcs(struct vcpu *v)
 {
-    if ( (v->arch.hvm_vmx.vmcs = vmx_alloc_vmcs()) == NULL )
-        return -ENOMEM;
- 
-    __vmx_clear_vmcs(v);
+    if ( v->arch.hvm_vmx.vmcs == NULL )
+    {
+        if ( (v->arch.hvm_vmx.vmcs = vmx_alloc_vmcs()) == NULL )
+            return -ENOMEM;
+
+        __vmx_clear_vmcs(v);
+    }
 
     construct_vmcs(v);
 
diff -r 7a7509570af9 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h	Mon Feb 05 11:38:22 2007 +0000
+++ b/xen/include/asm-x86/hvm/hvm.h	Mon Feb 05 22:47:20 2007 +0800
@@ -153,6 +153,7 @@ void hvm_domain_destroy(struct domain *d
 
 int hvm_vcpu_initialise(struct vcpu *v);
 void hvm_vcpu_destroy(struct vcpu *v);
+void hvm_vcpu_reset(struct vcpu *vcpu);
 
 void hvm_send_assist_req(struct vcpu *v);
 
diff -r 7a7509570af9 xen/include/asm-x86/hvm/vlapic.h
--- a/xen/include/asm-x86/hvm/vlapic.h	Mon Feb 05 11:38:22 2007 +0000
+++ b/xen/include/asm-x86/hvm/vlapic.h	Mon Feb 05 22:35:44 2007 +0800
@@ -78,6 +78,8 @@ int  vlapic_init(struct vcpu *v);
 int  vlapic_init(struct vcpu *v);
 void vlapic_destroy(struct vcpu *v);
 
+void vlapic_reset(struct vlapic *vlapic);
+
 void vlapic_msr_set(struct vlapic *vlapic, uint64_t value);
 
 int vlapic_accept_pic_intr(struct vcpu *v);

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Add hvm vcpu reset support
  2007-02-05 15:09 [PATCH] Add hvm vcpu reset support Li, Xin B
@ 2007-02-05 15:33 ` Keir Fraser
  2007-02-06  3:25   ` Li, Xin B
  0 siblings, 1 reply; 3+ messages in thread
From: Keir Fraser @ 2007-02-05 15:33 UTC (permalink / raw)
  To: Li, Xin B, xen-devel

Does shadow pagetable state (e.g., reference counts) get properly reset when
a CPU is reset?

 -- Keir

On 5/2/07 15:09, "Li, Xin B" <xin.b.li@intel.com> wrote:

> Add hvm vcpu reset support for x86 INIT IPI which is needed for CPU
> hotplug.
> Signed-off-by: Xin Li <xin.b.li@intel.com>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH] Add hvm vcpu reset support
  2007-02-05 15:33 ` Keir Fraser
@ 2007-02-06  3:25   ` Li, Xin B
  0 siblings, 0 replies; 3+ messages in thread
From: Li, Xin B @ 2007-02-06  3:25 UTC (permalink / raw)
  To: Keir Fraser, xen-devel

I think it's OK since arch_set_info_guest() will call
shadow_update_paging_modes(v), which handles shadow mode changes like
unmapping guest_vtable, puting reference count of top level shadow and
puting guest_table.

-Xin 

>-----Original Message-----
>From: Keir Fraser [mailto:Keir.Fraser@cl.cam.ac.uk] 
>Sent: Monday, February 05, 2007 11:34 PM
>To: Li, Xin B; xen-devel@lists.xensource.com
>Subject: Re: [Xen-devel] [PATCH] Add hvm vcpu reset support
>
>Does shadow pagetable state (e.g., reference counts) get 
>properly reset when a CPU is reset?
>
> -- Keir
>
>On 5/2/07 15:09, "Li, Xin B" <xin.b.li@intel.com> wrote:
>
>> Add hvm vcpu reset support for x86 INIT IPI which is needed for CPU
>> hotplug.
>> Signed-off-by: Xin Li <xin.b.li@intel.com>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-02-06  3:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-05 15:09 [PATCH] Add hvm vcpu reset support Li, Xin B
2007-02-05 15:33 ` Keir Fraser
2007-02-06  3:25   ` Li, Xin B

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.