WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [HVM] Re-introduce the 'apic' configurati

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [HVM] Re-introduce the 'apic' configuration option, default to 1.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 28 Nov 2006 13:40:28 +0000
Delivery-date: Tue, 28 Nov 2006 05:41:51 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 9d6bc06919e09f0d37c70ec92f49bd55fba23526
# Parent  93e657836d070b38a8e10d2e241b298787eae304
[HVM] Re-introduce the 'apic' configuration option, default to 1.

Also simplify the HVM builder interface by doing more work in
the python wrapper, and fix mapping of shared_info page after the
change to map foreign pages by GMFN rather than MFN.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 tools/examples/xmexample.hvm            |   16 +-
 tools/firmware/hvmloader/acpi/build.c   |   13 +-
 tools/firmware/hvmloader/hvmloader.c    |    2 
 tools/firmware/hvmloader/util.c         |   10 +
 tools/firmware/hvmloader/util.h         |    1 
 tools/libxc/xc_hvm_build.c              |  174 +++++++++-----------------------
 tools/libxc/xenguest.h                  |   19 +--
 tools/libxc/xg_private.c                |    7 -
 tools/python/README.XendConfig          |    1 
 tools/python/README.sxpcfg              |    1 
 tools/python/xen/lowlevel/xc/xc.c       |   51 ++++++---
 tools/python/xen/xend/image.py          |   11 +-
 tools/python/xen/xm/create.py           |   12 +-
 xen/include/public/hvm/hvm_info_table.h |    1 
 14 files changed, 142 insertions(+), 177 deletions(-)

diff -r 93e657836d07 -r 9d6bc06919e0 tools/examples/xmexample.hvm
--- a/tools/examples/xmexample.hvm      Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/examples/xmexample.hvm      Mon Nov 27 17:49:41 2006 +0000
@@ -39,14 +39,18 @@ name = "ExampleHVMDomain"
 #uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
 
 #-----------------------------------------------------------------------------
-# the number of cpus guest platform has, default=1
+# The number of cpus guest platform has, default=1
 #vcpus=1
 
-# enable/disable HVM guest PAE, default=0 (disabled)
-#pae=0
-
-# enable/disable HVM guest ACPI, default=0 (disabled)
-#acpi=0
+# Enable/disable HVM guest PAE, default=1 (enabled)
+#pae=1
+
+# Enable/disable HVM guest ACPI, default=1 (enabled)
+#acpi=1
+
+# Enable/disable HVM APIC mode, default=1 (enabled)
+# Note that this option is ignored if vcpus > 1
+#apic=1
 
 # List of which CPUS this domain is allowed to use, default Xen picks
 #cpus = ""         # leave to Xen to pick
diff -r 93e657836d07 -r 9d6bc06919e0 tools/firmware/hvmloader/acpi/build.c
--- a/tools/firmware/hvmloader/acpi/build.c     Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/firmware/hvmloader/acpi/build.c     Mon Nov 27 17:49:41 2006 +0000
@@ -119,10 +119,11 @@ int acpi_build_tables(uint8_t *buf)
     struct acpi_20_madt *madt = 0;
     struct acpi_20_facs *facs;
     unsigned char       *dsdt;
-    int offset = 0, nr_vcpus = get_vcpu_nr();
+    int offset = 0, requires_madt;
+
+    requires_madt = ((get_vcpu_nr() > 1) || get_apic_mode());
 
 #define inc_offset(sz)  (offset = (offset + (sz) + 15) & ~15)
-#define requires_madt() (nr_vcpus > 1)
 
     facs = (struct acpi_20_facs *)&buf[offset];
     memcpy(facs, &Facs, sizeof(struct acpi_20_facs));
@@ -143,7 +144,7 @@ int acpi_build_tables(uint8_t *buf)
                  offsetof(struct acpi_header, checksum),
                  sizeof(struct acpi_20_fadt));
 
-    if ( requires_madt() )
+    if ( requires_madt )
     {
         madt = (struct acpi_20_madt *)&buf[offset];
         inc_offset(construct_madt(madt));
@@ -154,7 +155,7 @@ int acpi_build_tables(uint8_t *buf)
     inc_offset(sizeof(struct acpi_20_xsdt));
     xsdt->entry[0] = (unsigned long)fadt;
     xsdt->header.length = sizeof(struct acpi_header) + sizeof(uint64_t);
-    if ( requires_madt() )
+    if ( requires_madt )
     {
         xsdt->entry[1] = (unsigned long)madt;
         xsdt->header.length += sizeof(uint64_t);
@@ -168,7 +169,7 @@ int acpi_build_tables(uint8_t *buf)
     inc_offset(sizeof(struct acpi_20_rsdt));
     rsdt->entry[0] = (unsigned long)fadt;
     rsdt->header.length = sizeof(struct acpi_header) + sizeof(uint32_t);
-    if ( requires_madt() )
+    if ( requires_madt )
     {
         rsdt->entry[1] = (unsigned long)madt;
         rsdt->header.length += sizeof(uint32_t);
@@ -189,6 +190,8 @@ int acpi_build_tables(uint8_t *buf)
                  offsetof(struct acpi_20_rsdp, extended_checksum),
                  sizeof(struct acpi_20_rsdp));
 
+#undef inc_offset
+
     return offset;
 }
 
diff -r 93e657836d07 -r 9d6bc06919e0 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c      Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/firmware/hvmloader/hvmloader.c      Mon Nov 27 17:49:41 2006 +0000
@@ -298,7 +298,7 @@ int main(void)
     apic_setup();
     pci_setup();
 
-    if ( get_vcpu_nr() > 1 )
+    if ( (get_vcpu_nr() > 1) || get_apic_mode() )
         create_mp_tables();
 
     if ( cirrus_check() )
diff -r 93e657836d07 -r 9d6bc06919e0 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c   Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/firmware/hvmloader/util.c   Mon Nov 27 17:49:41 2006 +0000
@@ -535,13 +535,19 @@ int get_vcpu_nr(void)
 int get_vcpu_nr(void)
 {
     struct hvm_info_table *t = get_hvm_info_table();
-    return (t ? t->nr_vcpus : 1); /* default 1 vcpu */
+    return (t ? t->nr_vcpus : 1);
 }
 
 int get_acpi_enabled(void)
 {
     struct hvm_info_table *t = get_hvm_info_table();
-    return (t ? t->acpi_enabled : 0); /* default no acpi */
+    return (t ? t->acpi_enabled : 1);
+}
+
+int get_apic_mode(void)
+{
+    struct hvm_info_table *t = get_hvm_info_table();
+    return (t ? t->apic_mode : 1);
 }
 
 /*
diff -r 93e657836d07 -r 9d6bc06919e0 tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h   Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/firmware/hvmloader/util.h   Mon Nov 27 17:49:41 2006 +0000
@@ -46,6 +46,7 @@ void cpuid(uint32_t idx, uint32_t *eax, 
 /* HVM-builder info. */
 int get_vcpu_nr(void);
 int get_acpi_enabled(void);
+int get_apic_mode(void);
 
 /* String and memory functions */
 int strcmp(const char *cs, const char *ct);
diff -r 93e657836d07 -r 9d6bc06919e0 tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c        Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/libxc/xc_hvm_build.c        Mon Nov 27 17:49:41 2006 +0000
@@ -15,6 +15,8 @@
 #include <xen/hvm/params.h>
 #include <xen/hvm/e820.h>
 
+#define SCRATCH_PFN 0xFFFFF
+
 #define HVM_LOADER_ENTR_ADDR  0x00100000
 static int
 parseelfimage(
@@ -24,8 +26,8 @@ loadelfimage(
     char *elfbase, int xch, uint32_t dom, unsigned long *parray,
     struct domain_setup_info *dsi);
 
-static void xc_set_hvm_param(int handle,
-                             domid_t dom, int param, unsigned long value)
+int xc_set_hvm_param(
+    int handle, domid_t dom, int param, unsigned long value)
 {
     DECLARE_HYPERCALL;
     xen_hvm_param_t arg;
@@ -38,14 +40,30 @@ static void xc_set_hvm_param(int handle,
     arg.index = param;
     arg.value = value;
     if ( lock_pages(&arg, sizeof(arg)) != 0 )
-    {
-        PERROR("Could not lock memory for set parameter");
-        return;
-    }
+        return -1;
     rc = do_xen_hypercall(handle, &hypercall);
     unlock_pages(&arg, sizeof(arg));
-    if (rc < 0)
-        PERROR("set HVM parameter failed (%d)", rc);
+    return rc;
+}
+
+int xc_get_hvm_param(
+    int handle, domid_t dom, int param, unsigned long *value)
+{
+    DECLARE_HYPERCALL;
+    xen_hvm_param_t arg;
+    int rc;
+
+    hypercall.op     = __HYPERVISOR_hvm_op;
+    hypercall.arg[0] = HVMOP_get_param;
+    hypercall.arg[1] = (unsigned long)&arg;
+    arg.domid = dom;
+    arg.index = param;
+    if ( lock_pages(&arg, sizeof(arg)) != 0 )
+        return -1;
+    rc = do_xen_hypercall(handle, &hypercall);
+    unlock_pages(&arg, sizeof(arg));
+    *value = arg.value;
+    return rc;
 }
 
 static void build_e820map(void *e820_page, unsigned long long mem_size)
@@ -126,67 +144,16 @@ static void build_e820map(void *e820_pag
     *(((unsigned char *)e820_page) + E820_MAP_NR_OFFSET) = nr_map;
 }
 
-static void set_hvm_info_checksum(struct hvm_info_table *t)
-{
-    uint8_t *ptr = (uint8_t *)t, sum = 0;
-    unsigned int i;
-
-    t->checksum = 0;
-
-    for (i = 0; i < t->length; i++)
-        sum += *ptr++;
-
-    t->checksum = -sum;
-}
-
-/*
- * Use E820 reserved memory 0x9F800 to pass HVM info to hvmloader
- * hvmloader will use this info to set BIOS accordingly
- */
-static int set_hvm_info(int xc_handle, uint32_t dom,
-                        xen_pfn_t *pfn_list, unsigned int vcpus,
-                        unsigned int acpi)
-{
-    char *va_map;
-    struct hvm_info_table *va_hvm;
-
-    va_map = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
-                                  PROT_READ | PROT_WRITE,
-                                  pfn_list[HVM_INFO_PFN]);
-
-    if ( va_map == NULL )
-        return -1;
-
-    va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET);
-    memset(va_hvm, 0, sizeof(*va_hvm));
-
-    strncpy(va_hvm->signature, "HVM INFO", 8);
-    va_hvm->length       = sizeof(struct hvm_info_table);
-    va_hvm->acpi_enabled = acpi;
-    va_hvm->nr_vcpus     = vcpus;
-
-    set_hvm_info_checksum(va_hvm);
-
-    munmap(va_map, PAGE_SIZE);
-
-    return 0;
-}
-
 static int setup_guest(int xc_handle,
                        uint32_t dom, int memsize,
                        char *image, unsigned long image_size,
-                       vcpu_guest_context_t *ctxt,
-                       unsigned long shared_info_frame,
-                       unsigned int vcpus,
-                       unsigned int pae,
-                       unsigned int acpi,
-                       unsigned int store_evtchn,
-                       unsigned long *store_mfn)
+                       vcpu_guest_context_t *ctxt)
 {
     xen_pfn_t *page_array = NULL;
     unsigned long i, nr_pages = (unsigned long)memsize << (20 - PAGE_SHIFT);
     unsigned long shared_page_nr;
-    shared_info_t *shared_info;
+    struct xen_add_to_physmap xatp;
+    struct shared_info *shared_info;
     void *e820_page;
     struct domain_setup_info dsi;
     uint64_t v_end;
@@ -247,29 +214,25 @@ static int setup_guest(int xc_handle,
 
     loadelfimage(image, xc_handle, dom, page_array, &dsi);
 
-    if ( set_hvm_info(xc_handle, dom, page_array, vcpus, acpi) )
-    {
-        ERROR("Couldn't set hvm info for HVM guest.\n");
-        goto error_out;
-    }
-
-    xc_set_hvm_param(xc_handle, dom, HVM_PARAM_PAE_ENABLED, pae);
-
     if ( (e820_page = xc_map_foreign_range(
               xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
-              page_array[E820_MAP_PAGE >> PAGE_SHIFT])) == NULL )
+              E820_MAP_PAGE >> PAGE_SHIFT)) == NULL )
         goto error_out;
     memset(e820_page, 0, PAGE_SIZE);
     build_e820map(e820_page, v_end);
     munmap(e820_page, PAGE_SIZE);
 
-    /* shared_info page starts its life empty. */
-    if ( (shared_info = xc_map_foreign_range(
-              xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
-              shared_info_frame)) == NULL )
+    /* Map and initialise shared_info page. */
+    xatp.domid = dom;
+    xatp.space = XENMAPSPACE_shared_info;
+    xatp.idx   = 0;
+    xatp.gpfn  = SCRATCH_PFN;
+    if ( (xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp) != 0) ||
+         ((shared_info = xc_map_foreign_range(
+             xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
+             SCRATCH_PFN)) == NULL) )
         goto error_out;
     memset(shared_info, 0, PAGE_SIZE);
-    /* Mask all upcalls... */
     for ( i = 0; i < MAX_VIRT_CPUS; i++ )
         shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
     memset(&shared_info->evtchn_mask[0], 0xff,
@@ -282,14 +245,12 @@ static int setup_guest(int xc_handle,
         shared_page_nr = (v_end >> PAGE_SHIFT) - 1;
 
     /* Paranoia: clean pages. */
-    if ( xc_clear_domain_page(xc_handle, dom, page_array[shared_page_nr]) ||
-         xc_clear_domain_page(xc_handle, dom, page_array[shared_page_nr-1]) ||
-         xc_clear_domain_page(xc_handle, dom, page_array[shared_page_nr-2]) )
-        goto error_out;
-
-    *store_mfn = page_array[shared_page_nr - 1];
+    if ( xc_clear_domain_page(xc_handle, dom, shared_page_nr) ||
+         xc_clear_domain_page(xc_handle, dom, shared_page_nr-1) ||
+         xc_clear_domain_page(xc_handle, dom, shared_page_nr-2) )
+        goto error_out;
+
     xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_PFN, shared_page_nr-1);
-    xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_EVTCHN, store_evtchn);
     xc_set_hvm_param(xc_handle, dom, HVM_PARAM_BUFIOREQ_PFN, shared_page_nr-2);
     xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IOREQ_PFN, shared_page_nr);
 
@@ -308,14 +269,9 @@ static int xc_hvm_build_internal(int xc_
                                  uint32_t domid,
                                  int memsize,
                                  char *image,
-                                 unsigned long image_size,
-                                 unsigned int vcpus,
-                                 unsigned int pae,
-                                 unsigned int acpi,
-                                 unsigned int store_evtchn,
-                                 unsigned long *store_mfn)
-{
-    struct xen_domctl launch_domctl, domctl;
+                                 unsigned long image_size)
+{
+    struct xen_domctl launch_domctl;
     vcpu_guest_context_t ctxt;
     int rc;
 
@@ -325,20 +281,9 @@ static int xc_hvm_build_internal(int xc_
         goto error_out;
     }
 
-    domctl.cmd = XEN_DOMCTL_getdomaininfo;
-    domctl.domain = (domid_t)domid;
-    if ( (xc_domctl(xc_handle, &domctl) < 0) ||
-         ((uint16_t)domctl.domain != domid) )
-    {
-        PERROR("Could not get info on domain");
-        goto error_out;
-    }
-
     memset(&ctxt, 0, sizeof(ctxt));
 
-    if ( setup_guest(xc_handle, domid, memsize, image, image_size,
-                     &ctxt, domctl.u.getdomaininfo.shared_info_frame,
-                     vcpus, pae, acpi, store_evtchn, store_mfn) < 0)
+    if ( setup_guest(xc_handle, domid, memsize, image, image_size, &ctxt) < 0 )
     {
         ERROR("Error constructing guest OS");
         goto error_out;
@@ -500,12 +445,7 @@ int xc_hvm_build(int xc_handle,
 int xc_hvm_build(int xc_handle,
                  uint32_t domid,
                  int memsize,
-                 const char *image_name,
-                 unsigned int vcpus,
-                 unsigned int pae,
-                 unsigned int acpi,
-                 unsigned int store_evtchn,
-                 unsigned long *store_mfn)
+                 const char *image_name)
 {
     char *image;
     int  sts;
@@ -515,10 +455,7 @@ int xc_hvm_build(int xc_handle,
          ((image = xc_read_image(image_name, &image_size)) == NULL) )
         return -1;
 
-    sts = xc_hvm_build_internal(xc_handle, domid, memsize,
-                                image, image_size,
-                                vcpus, pae, acpi,
-                                store_evtchn, store_mfn);
+    sts = xc_hvm_build_internal(xc_handle, domid, memsize, image, image_size);
 
     free(image);
 
@@ -535,12 +472,7 @@ int xc_hvm_build_mem(int xc_handle,
                      uint32_t domid,
                      int memsize,
                      const char *image_buffer,
-                     unsigned long image_size,
-                     unsigned int vcpus,
-                     unsigned int pae,
-                     unsigned int acpi,
-                     unsigned int store_evtchn,
-                     unsigned long *store_mfn)
+                     unsigned long image_size)
 {
     int           sts;
     unsigned long img_len;
@@ -562,9 +494,7 @@ int xc_hvm_build_mem(int xc_handle,
     }
 
     sts = xc_hvm_build_internal(xc_handle, domid, memsize,
-                                img, img_len,
-                                vcpus, pae, acpi,
-                                store_evtchn, store_mfn);
+                                img, img_len);
 
     /* xc_inflate_buffer may return the original buffer pointer (for
        for already inflated buffers), so exercise some care in freeing */
diff -r 93e657836d07 -r 9d6bc06919e0 tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h    Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/libxc/xenguest.h    Mon Nov 27 17:49:41 2006 +0000
@@ -109,22 +109,17 @@ int xc_hvm_build(int xc_handle,
 int xc_hvm_build(int xc_handle,
                  uint32_t domid,
                  int memsize,
-                 const char *image_name,
-                 unsigned int vcpus,
-                 unsigned int pae,
-                 unsigned int acpi,
-                 unsigned int store_evtchn,
-                 unsigned long *store_mfn);
+                 const char *image_name);
 
 int xc_hvm_build_mem(int xc_handle,
                      uint32_t domid,
                      int memsize,
                      const char *image_buffer,
-                     unsigned long image_size,
-                     unsigned int vcpus,
-                     unsigned int pae,
-                     unsigned int acpi,
-                     unsigned int store_evtchn,
-                     unsigned long *store_mfn);
+                     unsigned long image_size);
+
+int xc_set_hvm_param(
+    int handle, domid_t dom, int param, unsigned long value);
+int xc_get_hvm_param(
+    int handle, domid_t dom, int param, unsigned long *value);
 
 #endif /* XENGUEST_H */
diff -r 93e657836d07 -r 9d6bc06919e0 tools/libxc/xg_private.c
--- a/tools/libxc/xg_private.c  Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/libxc/xg_private.c  Mon Nov 27 17:49:41 2006 +0000
@@ -192,12 +192,7 @@ __attribute__((weak)) int xc_hvm_build(
     int xc_handle,
     uint32_t domid,
     int memsize,
-    const char *image_name,
-    unsigned int vcpus,
-    unsigned int pae,
-    unsigned int acpi,
-    unsigned int store_evtchn,
-    unsigned long *store_mfn)
+    const char *image_name)
 {
     return -ENOSYS;
 }
diff -r 93e657836d07 -r 9d6bc06919e0 tools/python/README.XendConfig
--- a/tools/python/README.XendConfig    Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/python/README.XendConfig    Mon Nov 27 17:49:41 2006 +0000
@@ -123,6 +123,7 @@ otherConfig
                                 image.hvm.vncconsole
                                 image.hvm.pae
                                 image.hvm.acpi (also in image.devices)
+                                image.hvm.apic
                                 image.hvm.devices.boot
                                 image.hvm.devices.fda
                                 image.hvm.devices.fdb
diff -r 93e657836d07 -r 9d6bc06919e0 tools/python/README.sxpcfg
--- a/tools/python/README.sxpcfg        Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/python/README.sxpcfg        Mon Nov 27 17:49:41 2006 +0000
@@ -56,6 +56,7 @@ image
   - vncconsole
   - pae
   - acpi
+  - apic
   (parseDeviceModel)
   - boot
   - fda
diff -r 93e657836d07 -r 9d6bc06919e0 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/python/xen/lowlevel/xc/xc.c Mon Nov 27 17:49:41 2006 +0000
@@ -13,10 +13,13 @@
 #include <netinet/tcp.h>
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <sys/mman.h>
 #include <netdb.h>
 #include <arpa/inet.h>
 
 #include "xenctrl.h"
+#include <xen/hvm/hvm_info_table.h>
+#include <xen/hvm/params.h>
 
 /* Needed for Python versions earlier than 2.3. */
 #ifndef PyMODINIT_FUNC
@@ -371,25 +374,45 @@ static PyObject *pyxc_hvm_build(XcObject
                                 PyObject *kwds)
 {
     uint32_t dom;
+    struct hvm_info_table *va_hvm;
+    uint8_t *va_map, sum;
     char *image;
-    int store_evtchn;
-    int memsize;
-    int vcpus = 1;
-    int pae  = 0;
-    int acpi = 0;
-    unsigned long store_mfn = 0;
+    int i, store_evtchn, memsize, vcpus = 1, pae = 0, acpi = 0, apic = 1;
+    unsigned long store_mfn;
 
     static char *kwd_list[] = { "domid", "store_evtchn",
                                "memsize", "image", "vcpus", "pae", "acpi",
-                               NULL };
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiisiii", kwd_list,
+                               "apic", NULL };
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiis|iiii", kwd_list,
                                       &dom, &store_evtchn, &memsize,
-                                      &image, &vcpus, &pae, &acpi) )
-        return NULL;
-
-    if ( xc_hvm_build(self->xc_handle, dom, memsize, image,
-                      vcpus, pae, acpi, store_evtchn, &store_mfn) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+                                      &image, &vcpus, &pae, &acpi, &apic) )
+        return NULL;
+
+    if ( xc_hvm_build(self->xc_handle, dom, memsize, image) != 0 )
+        return PyErr_SetFromErrno(xc_error);
+
+    /* Set up the HVM info table. */
+    va_map = xc_map_foreign_range(self->xc_handle, dom, PAGE_SIZE,
+                                  PROT_READ | PROT_WRITE,
+                                  HVM_INFO_PFN);
+    if ( va_map == NULL )
+        return PyErr_SetFromErrno(xc_error);
+    va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET);
+    memset(va_hvm, 0, sizeof(*va_hvm));
+    strncpy(va_hvm->signature, "HVM INFO", 8);
+    va_hvm->length       = sizeof(struct hvm_info_table);
+    va_hvm->acpi_enabled = acpi;
+    va_hvm->apic_mode    = apic;
+    va_hvm->nr_vcpus     = vcpus;
+    for ( i = 0, sum = 0; i < va_hvm->length; i++ )
+        sum += ((uint8_t *)va_hvm)[i];
+    va_hvm->checksum = -sum;
+    munmap(va_map, PAGE_SIZE);
+
+    xc_get_hvm_param(self->xc_handle, dom, HVM_PARAM_STORE_PFN, &store_mfn);
+    xc_set_hvm_param(self->xc_handle, dom, HVM_PARAM_PAE_ENABLED, pae);
+    xc_set_hvm_param(self->xc_handle, dom, HVM_PARAM_STORE_EVTCHN,
+                     store_evtchn);
 
     return Py_BuildValue("{s:i}", "store_mfn", store_mfn);
 }
diff -r 93e657836d07 -r 9d6bc06919e0 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/python/xen/xend/image.py    Mon Nov 27 17:49:41 2006 +0000
@@ -252,7 +252,6 @@ class HVMImageHandler(ImageHandler):
         ImageHandler.__init__(self, vm, imageConfig, deviceConfig)
         self.shutdownWatch = None
 
-
     def configure(self, imageConfig, deviceConfig):
         ImageHandler.configure(self, imageConfig, deviceConfig)
 
@@ -277,9 +276,9 @@ class HVMImageHandler(ImageHandler):
 
         self.dmargs += self.configVNC(imageConfig)
 
-        self.pae  = int(sxp.child_value(imageConfig, 'pae', 0))
-
-        self.acpi = int(sxp.child_value(imageConfig, 'acpi', 0))
+        self.pae  = int(sxp.child_value(imageConfig, 'pae',  1))
+        self.acpi = int(sxp.child_value(imageConfig, 'acpi', 1))
+        self.apic = int(sxp.child_value(imageConfig, 'apic', 1))
 
     def buildDomain(self):
         store_evtchn = self.vm.getStorePort()
@@ -293,6 +292,7 @@ class HVMImageHandler(ImageHandler):
         log.debug("vcpus          = %d", self.vm.getVCpuCount())
         log.debug("pae            = %d", self.pae)
         log.debug("acpi           = %d", self.acpi)
+        log.debug("apic           = %d", self.apic)
 
         self.register_shutdown_watch()
 
@@ -302,7 +302,8 @@ class HVMImageHandler(ImageHandler):
                             memsize        = mem_mb,
                             vcpus          = self.vm.getVCpuCount(),
                             pae            = self.pae,
-                            acpi           = self.acpi)
+                            acpi           = self.acpi,
+                            apic           = self.apic)
 
     # Return a list of cmd line args to the device models based on the
     # xm config file
diff -r 93e657836d07 -r 9d6bc06919e0 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Mon Nov 27 17:48:24 2006 +0000
+++ b/tools/python/xen/xm/create.py     Mon Nov 27 17:49:41 2006 +0000
@@ -174,12 +174,16 @@ gopts.var('cpus', val='CPUS',
           use="CPUS to run the domain on.")
 
 gopts.var('pae', val='PAE',
-          fn=set_int, default=0,
+          fn=set_int, default=1,
           use="Disable or enable PAE of HVM domain.")
 
 gopts.var('acpi', val='ACPI',
-          fn=set_int, default=0,
+          fn=set_int, default=1,
           use="Disable or enable ACPI of HVM domain.")
+
+gopts.var('apic', val='APIC',
+          fn=set_int, default=1,
+          use="Disable or enable APIC mode.")
 
 gopts.var('vcpus', val='VCPUS',
           fn=set_int, default=1,
@@ -664,9 +668,9 @@ def configure_hvm(config_image, vals):
              'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'soundhw',
              'vnc', 'vncdisplay', 'vncunused', 'vncconsole', 'vnclisten',
              'sdl', 'display', 'xauthority',
-             'acpi', 'usb', 'usbdevice', 'keymap' ]
+             'acpi', 'apic', 'usb', 'usbdevice', 'keymap' ]
     for a in args:
-        if (vals.__dict__[a]):
+        if a in vals.__dict__ and vals.__dict__[a] is not None:
             config_image.append([a, vals.__dict__[a]])
     config_image.append(['vncpasswd', vals.vncpasswd])
 
diff -r 93e657836d07 -r 9d6bc06919e0 xen/include/public/hvm/hvm_info_table.h
--- a/xen/include/public/hvm/hvm_info_table.h   Mon Nov 27 17:48:24 2006 +0000
+++ b/xen/include/public/hvm/hvm_info_table.h   Mon Nov 27 17:49:41 2006 +0000
@@ -34,6 +34,7 @@ struct hvm_info_table {
     uint32_t    length;
     uint8_t     checksum;
     uint8_t     acpi_enabled;
+    uint8_t     apic_mode;
     uint32_t    nr_vcpus;
 };
 

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [HVM] Re-introduce the 'apic' configuration option, default to 1., Xen patchbot-unstable <=