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] Rationalise x86 CRn guest state into a ctrlreg array in

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Rationalise x86 CRn guest state into a ctrlreg array in the per-vcpu
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Fri, 24 Jun 2005 10:46:24 +0000
Cc: james@xxxxxxxxxxxxx
Delivery-date: Fri, 24 Jun 2005 11:01:32 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
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 Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1751, 2005/06/24 11:46:24+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        Rationalise x86 CRn guest state into a ctrlreg array in the per-vcpu
        context structure. Most noticeably this means the pt_base field has
        gone away -- replaced by ctrlreg[3] (CR3). VCPU_guest_stts is also
        gone -- it was never arch-independent anyway.
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>



 b/freebsd-5.3-xen-sparse/i386-xen/i386-xen/mp_machdep.c  |    2 
 b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c |    2 
 b/tools/debugger/libxendebug/xendebug.c                  |    6 
 b/tools/libxc/Makefile                                   |    1 
 b/tools/libxc/xc_linux_build.c                           |    6 
 b/tools/libxc/xc_linux_restore.c                         |    4 
 b/tools/libxc/xc_linux_save.c                            |    6 
 b/tools/libxc/xc_ptrace.c                                |    4 
 b/tools/libxc/xc_ptrace_core.c                           |    2 
 b/tools/libxc/xc_vmx_build.c                             |    4 
 b/xen/arch/x86/dom0_ops.c                                |   21 
 b/xen/arch/x86/domain.c                                  |   42 
 b/xen/arch/x86/i387.c                                    |    2 
 b/xen/arch/x86/traps.c                                   |   17 
 b/xen/arch/x86/vmx_vmcs.c                                |    1 
 b/xen/include/asm-x86/domain.h                           |    3 
 b/xen/include/public/arch-x86_32.h                       |    4 
 b/xen/include/public/arch-x86_64.h                       |    4 
 b/xen/include/public/dom0_ops.h                          |    2 
 b/xen/include/xen/sched.h                                |    3 
 tools/libxc/xc_plan9_build.c                             |  694 ---------------
 21 files changed, 52 insertions(+), 778 deletions(-)


diff -Nru a/freebsd-5.3-xen-sparse/i386-xen/i386-xen/mp_machdep.c 
b/freebsd-5.3-xen-sparse/i386-xen/i386-xen/mp_machdep.c
--- a/freebsd-5.3-xen-sparse/i386-xen/i386-xen/mp_machdep.c     2005-06-24 
07:02:39 -04:00
+++ b/freebsd-5.3-xen-sparse/i386-xen/i386-xen/mp_machdep.c     2005-06-24 
07:02:39 -04:00
@@ -974,7 +974,7 @@
        ctxt.failsafe_callback_cs  = __KERNEL_CS;
        ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
 
-       ctxt.pt_base = (vm_paddr_t)IdlePTD;
+       ctxt.ctrlreg[3] = (vm_paddr_t)IdlePTD;
 
        boot_error = HYPERVISOR_boot_vcpu(bootAP, &ctxt);
 
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c 
b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c
--- a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c    2005-06-24 
07:02:39 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c    2005-06-24 
07:02:39 -04:00
@@ -908,7 +908,7 @@
        ctxt.failsafe_callback_cs  = __KERNEL_CS;
        ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
 
-       ctxt.pt_base = (unsigned long)virt_to_machine(swapper_pg_dir);
+       ctxt.ctrlreg[3] = (unsigned long)virt_to_machine(swapper_pg_dir);
 
        boot_error = HYPERVISOR_boot_vcpu(cpu, &ctxt);
 
diff -Nru a/tools/debugger/libxendebug/xendebug.c 
b/tools/debugger/libxendebug/xendebug.c
--- a/tools/debugger/libxendebug/xendebug.c     2005-06-24 07:02:39 -04:00
+++ b/tools/debugger/libxendebug/xendebug.c     2005-06-24 07:02:39 -04:00
@@ -342,9 +342,9 @@
         }
     }
 
-    if ( vcpu_ctxt->pt_base != ctxt->cr3_phys[vcpu]) 
+    if ( vcpu_ctxt->ctrlreg[3] != ctxt->cr3_phys[vcpu]) 
     {
-        ctxt->cr3_phys[vcpu] = vcpu_ctxt->pt_base;
+        ctxt->cr3_phys[vcpu] = vcpu_ctxt->ctrlreg[3];
         if ( ctxt->cr3_virt[vcpu] )
             munmap(ctxt->cr3_virt[vcpu], PAGE_SIZE);
         ctxt->cr3_virt[vcpu] = xc_map_foreign_range(xc_handle, ctxt->domid,
@@ -383,7 +383,7 @@
         if ( ctxt->page_virt[vcpu] == NULL )
         {
             printf("cr3 %lx pde %lx page %lx pti %lx\n", 
-                   vcpu_ctxt->pt_base, pde, page, vtopti(va));
+                   vcpu_ctxt->ctrlreg[3], pde, page, vtopti(va));
             ctxt->page_phys[vcpu] = 0;
             return 0;
         }
diff -Nru a/tools/libxc/Makefile b/tools/libxc/Makefile
--- a/tools/libxc/Makefile      2005-06-24 07:02:38 -04:00
+++ b/tools/libxc/Makefile      2005-06-24 07:02:38 -04:00
@@ -22,7 +22,6 @@
 SRCS     += xc_load_bin.c
 SRCS     += xc_load_elf.c
 SRCS     += xc_linux_build.c
-SRCS     += xc_plan9_build.c
 SRCS     += xc_linux_restore.c
 SRCS     += xc_linux_save.c
 SRCS     += xc_misc.c
diff -Nru a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c      2005-06-24 07:02:39 -04:00
+++ b/tools/libxc/xc_linux_build.c      2005-06-24 07:02:39 -04:00
@@ -227,7 +227,7 @@
     /* First allocate page for page dir. */
     ppt_alloc = (vpt_start - dsi.v_start) >> PAGE_SHIFT;
     l2tab = page_array[ppt_alloc++] << PAGE_SHIFT;
-    ctxt->pt_base = l2tab;
+    ctxt->ctrlreg[3] = l2tab;
 
     /* Initialise the page tables. */
     if ( (vl2tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, 
@@ -282,7 +282,7 @@
     /* First allocate page for page dir. */
     ppt_alloc = (vpt_start - dsi.v_start) >> PAGE_SHIFT;
     l4tab = page_array[ppt_alloc++] << PAGE_SHIFT;
-    ctxt->pt_base = l4tab;
+    ctxt->ctrlreg[3] = l4tab;
     
     /* Intiliaize page table */
     if ( (vl4tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
@@ -502,7 +502,7 @@
     }
 
     if ( !(op.u.getdomaininfo.flags & DOMFLAGS_PAUSED) ||
-         (ctxt->pt_base != 0) )
+         (ctxt->ctrlreg[3] != 0) )
     {
         ERROR("Domain is already constructed");
         goto error_out;
diff -Nru a/tools/libxc/xc_linux_restore.c b/tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c    2005-06-24 07:02:39 -04:00
+++ b/tools/libxc/xc_linux_restore.c    2005-06-24 07:02:39 -04:00
@@ -489,7 +489,7 @@
     }
 
     /* Uncanonicalise the page table base pointer. */
-    pfn = ctxt.pt_base >> PAGE_SHIFT;
+    pfn = ctxt.ctrlreg[3] >> PAGE_SHIFT;
     if ( (pfn >= nr_pfns) || ((pfn_type[pfn]&LTABTYPE_MASK) != L2TAB) )
     {
         printf("PT base is bad. pfn=%lu nr=%lu type=%08lx %08lx\n",
@@ -497,7 +497,7 @@
         ERR("PT base is bad.");
         goto out;
     }
-    ctxt.pt_base = pfn_to_mfn_table[pfn] << PAGE_SHIFT;
+    ctxt.ctrlreg[3] = pfn_to_mfn_table[pfn] << PAGE_SHIFT;
 
     /* clear any pending events and the selector */
     memset(&(shared_info->evtchn_pending[0]), 0,
diff -Nru a/tools/libxc/xc_linux_save.c b/tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c       2005-06-24 07:02:39 -04:00
+++ b/tools/libxc/xc_linux_save.c       2005-06-24 07:02:39 -04:00
@@ -459,7 +459,7 @@
     shared_info_frame = info.shared_info_frame;
 
     /* A cheesy test to see whether the domain contains valid state. */
-    if ( ctxt.pt_base == 0 ){
+    if ( ctxt.ctrlreg[3] == 0 ){
         ERR("Domain is not in a valid Linux guest OS state");
         goto out;
     }
@@ -1015,11 +1015,11 @@
     }
 
     /* Canonicalise the page table base pointer. */
-    if ( !MFN_IS_IN_PSEUDOPHYS_MAP(ctxt.pt_base >> PAGE_SHIFT) ) {
+    if ( !MFN_IS_IN_PSEUDOPHYS_MAP(ctxt.ctrlreg[3] >> PAGE_SHIFT) ) {
         ERR("PT base is not in range of pseudophys map");
         goto out;
     }
-    ctxt.pt_base = live_mfn_to_pfn_table[ctxt.pt_base >> PAGE_SHIFT] <<
+    ctxt.ctrlreg[3] = live_mfn_to_pfn_table[ctxt.ctrlreg[3] >> PAGE_SHIFT] <<
         PAGE_SHIFT;
 
     if (write(io_fd, &ctxt, sizeof(ctxt)) != sizeof(ctxt) ||
diff -Nru a/tools/libxc/xc_plan9_build.c b/tools/libxc/xc_plan9_build.c
--- a/tools/libxc/xc_plan9_build.c      2005-06-24 07:02:39 -04:00
+++ /dev/null   Wed Dec 31 16:00:00 196900
@@ -1,694 +0,0 @@
-/******************************************************************************
- * xc_plan9_build.c
- * derived from xc_linux_build.c
- */
-
-#include "xc_private.h"
-
-#include <zlib.h>
-
-#define DEBUG 1
-#ifdef DEBUG
-#define DPRINTF(x) printf x; fflush(stdout);
-#else
-#define DPRINTF(x)
-#endif
-
-#include "plan9a.out.h"
-
-/* really TOS which means stack starts at 0x2000, and uses page 1*/
-#define STACKPAGE 2
-struct Exec header, origheader;
-
-typedef struct page {
-       char data[PAGE_SIZE];
-} PAGE;
-
-
-int
-memcpy_toguest(int xc_handle, u32 dom, void *v, int size,
-              unsigned long *page_array, unsigned int to_page)
-{
-       int ret;
-       unsigned char *cp = v;
-       unsigned int whichpage;
-       unsigned char *vaddr;
-
-//  DPRINTF(("memcpy_to_guest: to_page 0x%x, count %d\n", to_page, size));
-       for (ret = 0, whichpage = to_page; size > 0;
-            whichpage++, size -= PAGE_SIZE, cp += PAGE_SIZE) {
-
-               //     DPRINTF (("map_pfn_writeable(%p, 0x%lx)\n", pm_handle,
-//                page_array[whichpage]));
-               vaddr = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
-                                            PROT_READ | PROT_WRITE,
-                                            page_array[whichpage]);
-               //    DPRINTF (("vaddr is %p\n", vaddr));
-               if (vaddr == NULL) {
-                       ret = -1;
-                       ERROR("Couldn't map guest memory");
-                       goto out;
-               }
-               //   DPRINTF (("copy %p to %p, count 0x%x\n", cp, vaddr, 4096));
-               memcpy(vaddr, cp, 4096);
-               munmap(vaddr, PAGE_SIZE);
-               //  DPRINTF (("Did %ud'th pages\n", whichpage));
-       }
-      out:
-       return ret;
-}
-
-int
-blah(char *b)
-{
-       fprintf(stderr, "Error in xc_plan9_build!\n");
-       perror(b);
-       return errno;
-}
-
-/* swap bytes. For plan 9 headers */
-void
-swabby(unsigned long *s, char *name)
-{
-       unsigned long it;
-       it = ((*s & 0xff000000) >> 24) | ((*s & 0xff0000) >> 8) |
-           ((*s & 0xff00) << 8) | ((*s & 0xff) << 24);
-       DPRINTF(("Item %s is 0x%lx\n", name, it));
-       *s = it;
-}
-
-void
-plan9header(Exec * header)
-{
-       /* header is big-endian */
-       swabby((unsigned long *)&header->magic, "magic");
-       swabby((unsigned long *)&header->text, "text");
-       swabby((unsigned long *)&header->data, "data");
-       swabby((unsigned long *)&header->bss, "bss");
-       swabby((unsigned long *)&header->syms, "syms");
-       swabby((unsigned long *)&header->entry, "entry");
-       swabby((unsigned long *)&header->spsz, "spsz");
-       swabby((unsigned long *)&header->pcsz, "pcsz");
-
-}
-
-static int
- loadp9image(gzFile kernel_gfd, int xc_handle, u32 dom,
-            unsigned long *page_array,
-            unsigned long tot_pages, unsigned long *virt_load_addr,
-            unsigned long *ksize, unsigned long *symtab_addr,
-            unsigned long *symtab_len,
-            unsigned long *first_data_page, unsigned long *pdb_page, 
-            const char *cmdline);
-
-#define P9ROUND (P9SIZE / 8)
-
-#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
-#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
-
-static int
-setup_guest(int xc_handle,
-             u32 dom,
-             gzFile kernel_gfd,
-             unsigned long tot_pages,
-             unsigned long *virt_startinfo_addr,
-             unsigned long *virt_load_addr,
-             vcpu_guest_context_t * ctxt,
-             const char *cmdline,
-             unsigned long shared_info_frame, 
-             unsigned int control_evtchn,
-             int flags)
-{
-       l1_pgentry_t *vl1e = NULL;
-       l2_pgentry_t *vl2tab = NULL, *vl2e = NULL;
-       unsigned long *cpage_array = NULL;
-       unsigned long *pte_array = NULL;
-       unsigned long l2tab;
-       unsigned long l1tab;
-       unsigned long count;
-       unsigned long symtab_addr = 0, symtab_len = 0;
-       start_info_t *start_info;
-       shared_info_t *shared_info;
-       unsigned long ksize;
-       mmu_t *mmu = NULL;
-       int i;
-       unsigned long first_page_after_kernel = 0, 
-         first_data_page = 0, 
-         page_array_page;
-       unsigned long cpu0pdb, cpu0pte, cpu0ptelast;
-       unsigned long /*last_pfn, */ tot_pte_pages;
-
-       DPRINTF(("tot pages is %ld\n", tot_pages));
-       if ((cpage_array = malloc(tot_pages * sizeof (unsigned long))) == NULL) 
{
-               PERROR("Could not allocate cpage array");
-               goto error_out;
-       }
-
-       if (xc_get_pfn_list(xc_handle, dom, cpage_array, tot_pages) != 
tot_pages) {
-               PERROR("Could not get the page frame list");
-               goto error_out;
-       }
-
-       for (i = 0; i < 64; i++)
-               DPRINTF(("First %d page is 0x%lx\n", i, cpage_array[i]));
-
-       tot_pte_pages = tot_pages >> 10;
-       DPRINTF(("Page range is 0 to 0x%lx, which requires 0x%lx pte pages\n",
-                tot_pte_pages, tot_pte_pages));
-
-       if (loadp9image(kernel_gfd, xc_handle, dom, cpage_array, tot_pages,
-                       virt_load_addr, &ksize, &symtab_addr, &symtab_len,
-                       &first_data_page, &first_page_after_kernel, cmdline))
-               goto error_out;
-       DPRINTF(("First data page is 0x%lx\n", first_data_page));
-       DPRINTF(("First page after kernel is 0x%lx\n",
-                first_page_after_kernel));
-
-       /*
-          NEED TO INCREMENT first page after kernel by:
-          + 1 (pdb)
-          + tot_pte_pages (pte)
-          + tot_pte_pages (page_array)
-        */
-       /* SO, have to copy the first kernel pages pfns right into the 
-        * page_array, then do identity maps for the rest. 
-        */
-       DPRINTF(("mapped kernel pages\n"));
-
-       /* now loop over all ptes and store into the page_array, so as
-        * to get the identity map. 
-        */
-       if ((pte_array =
-            malloc(tot_pte_pages * 1024 * sizeof (unsigned long))) == NULL) {
-               PERROR("Could not allocate pte array");
-               goto error_out;
-       }
-
-       /* plan 9 on startup expects a "l2" (xen parlance) at 0x2000, 
-        * this "l2" should have one PTE pointer for a va of 0x80000000. 
-        * and an l1 (PTEs to you) at 0x3000. (physical). 
-        * the PTEs should map the first 4M of memory. 
-        */
-       /* get a physical address for the L2. This means take the PFN and 
-        * shift left.
-        */
-       /* this terminology is plan 9 terminology. 
-        * pdb is essentially the Xen L2. 'Page Directory Block'? 
-        * I need to ask JMK.
-        * cpupte is the pte array. 
-        * Plan 9 counts on these being set up for cpu0. 
-        * SO: cpu0pdb (Xen L2)
-        * and cpupte  (Xen L1)
-        */
-       /* cpu0pdb is right after kernel */
-       cpu0pdb = first_page_after_kernel;
-       /* cpu0pte comes right after cpu0pdb */
-       cpu0pte = cpu0pdb + 1;
-       /* number of the past cpu0pte page */
-       cpu0ptelast = cpu0pte + tot_pte_pages - 1;
-       /* first page of the page array (mfn) */
-       page_array_page = cpu0ptelast + 1;
-
-       DPRINTF(("cpu0pdb 0x%lx, cpu0pte 0x%lx cpu0ptelast 0x%lx\n", cpu0pdb,
-                cpu0pte, cpu0ptelast));
-       l2tab = cpage_array[cpu0pdb] << PAGE_SHIFT;
-       DPRINTF(("l2tab 0x%lx\n", l2tab));
-       ctxt->pt_base = l2tab;
-
-       /* get a physical address for the L1. This means take the PFN and 
-        * shift left.
-        */
-       l1tab = cpage_array[cpu0pte] << PAGE_SHIFT;
-       DPRINTF(("l1tab 0x%lx\n", l1tab));
-       if ((mmu = init_mmu_updates(xc_handle, dom)) == NULL)
-               goto error_out;
-       DPRINTF(("now map in l2tab\n"));
-
-       /* Initialise the page tables. */
-       /* mmap in the l2tab */
-       if ((vl2tab = xc_map_foreign_range(xc_handle, dom,
-                                          PAGE_SIZE, PROT_READ | PROT_WRITE,
-                                          l2tab >> PAGE_SHIFT)) == NULL)
-               goto error_out;
-       DPRINTF(("vl2tab 0x%p\n", vl2tab));
-       /* now we have the cpu0pdb for the kernel, starting at 0x2000, 
-        * so we can plug in the physical pointer to the 0x3000 pte
-        */
-       /* zero it */
-       memset(vl2tab, 0, PAGE_SIZE);
-       /* get a pointer in the l2tab for the virt_load_addr */
-       DPRINTF(("&vl2tab[l2_table_offset(*virt_load_addr)] is 0x%p[0x%lx]\n",
-                &vl2tab[l2_table_offset(*virt_load_addr)],
-                l2_table_offset(*virt_load_addr)));
-
-       vl2e = &vl2tab[l2_table_offset(*virt_load_addr)];
-
-       /* OK, for all the available PTE, set the PTE pointer up */
-       DPRINTF(("For i  = %ld to %ld ...\n", cpu0pte, cpu0ptelast));
-       for (i = cpu0pte; i <= cpu0ptelast; i++) {
-               DPRINTF(("Index %d Set %p to 0x%lx\n", i, vl2e,
-                        (cpage_array[i] << PAGE_SHIFT) | L2_PROT));
-               *vl2e++ = (cpage_array[i] << PAGE_SHIFT) | L2_PROT;
-       }
-
-       /* unmap it ... */
-       munmap(vl2tab, PAGE_SIZE);
-
-       /* for the pages from virt_load_pointer to the end of this 
-        * set of PTEs, map in the PFN for that VA
-        */
-       for (vl1e = (l1_pgentry_t *) pte_array, count = 0;
-            count < tot_pte_pages * 1024; count++, vl1e++) {
-
-               *vl1e = cpage_array[count];
-               if (!cpage_array[count])
-                       continue;
-               /* set in the PFN for this entry */
-               *vl1e = (cpage_array[count] << PAGE_SHIFT) | L1_PROT;
-/*
-      DPRINTF (("vl1e # %d 0x%lx gets 0x%lx\n",
-               count, vl1e, *vl1e));
-*/
-               if ((count >= cpu0pdb) && (count <= cpu0ptelast)) {
-                       //DPRINTF(("   Fix up page %d as it is in pte ville: ", 
count));
-                       *vl1e &= ~_PAGE_RW;
-                       DPRINTF(("0x%lx\n", *vl1e));
-               }
-               if ((count >= (0x100000 >> 12))
-                   && (count < (first_data_page >> 12))) {
-                       //DPRINTF(("   Fix up page %d as it is in text ", 
count));
-                       *vl1e &= ~_PAGE_RW;
-                       //DPRINTF (("0x%lx\n", *vl1e));
-               }
-       }
-       /* special thing. Pre-map the shared info page */
-       vl1e = &pte_array[2];
-       *vl1e = (shared_info_frame << PAGE_SHIFT) | L1_PROT;
-       DPRINTF(("v1l1 %p, has value 0x%lx\n", vl1e, *(unsigned long *) vl1e));
-       /* another special thing. VA 80005000 has to point to 80006000 */
-       /* this is a Plan 9 thing -- the 'mach' pointer */
-       /* 80005000 is the mach pointer per-cpu, and the actual
-        * mach pointers are 80006000, 80007000 etc. 
-        */
-       vl1e = &pte_array[5];
-       *vl1e = (cpage_array[6] << PAGE_SHIFT) | L1_PROT;
-
-       /* OK, it's all set up, copy it in */
-       memcpy_toguest(xc_handle, dom, pte_array,
-                      (tot_pte_pages * 1024 * sizeof (unsigned long) /**/),
-                      cpage_array, cpu0pte);
-
-       /* We really need to have the vl1tab unmapped or the add_mmu_update
-        * below will fail bigtime. 
-        */
-       /* Xen guys: remember my errors on domain exit? Something I'm doing
-        * wrong in here? We never did find out ...
-        */
-       /* get rid of the entries we can not use ... */
-       memcpy_toguest(xc_handle, dom, cpage_array,
-                      (tot_pte_pages * 1024 * sizeof (unsigned long) /**/),
-                      cpage_array, page_array_page);
-       /* last chance to dump all of memory */
-       // dumpit(xc_handle, dom, 0 /*0x100000>>12*/, tot_pages, cpage_array) ;
-       /*
-        * Pin down l2tab addr as page dir page - causes hypervisor to provide
-        * correct protection for the page
-        */
-       if (pin_table(xc_handle, MMUEXT_PIN_L2_TABLE, l2tab>>PAGE_SHIFT, dom))
-               goto error_out;
-
-       for (count = 0; count < tot_pages; count++) {
-/*
-      DPRINTF (("add_mmu_update(0x%x, 0x%x, 0x%x, %d)\n", xc_handle, mmu,
-                                                          (cpage_array[count]
-                                                           << PAGE_SHIFT) |
-                                                          MMU_MACHPHYS_UPDATE,
-                                                          count));
-*/
-               if (add_mmu_update(xc_handle, mmu,
-                                  (cpage_array[count] << PAGE_SHIFT) |
-                                  MMU_MACHPHYS_UPDATE, count))
-                       goto error_out;
-               //DPRINTF(("Do the next one\n"));
-       }
-/*
- */
-
-       //dumpit(pm_handle, 3, 4, page_array);
-       /* put the virt_startinfo_addr at KZERO */
-       /* just hard-code for now */
-       *virt_startinfo_addr = 0x80000000;
-
-       DPRINTF(("virt_startinfo_addr = 0x%lx\n", *virt_startinfo_addr));
-       start_info = xc_map_foreign_range(xc_handle, dom,
-                                         PAGE_SIZE, PROT_READ | PROT_WRITE,
-                                         cpage_array[0]);
-       DPRINTF(("startinfo = 0x%p\n", start_info));
-       DPRINTF(("shared_info_frame is %lx\n", shared_info_frame));
-       memset(start_info, 0, sizeof (*start_info));
-       start_info->pt_base = 0x80000000 | cpu0pdb << PAGE_SHIFT;
-       start_info->mfn_list = 0x80000000 | (page_array_page) << PAGE_SHIFT;
-       DPRINTF(("mfn_list 0x%lx\n", start_info->mfn_list));
-       start_info->mod_start = 0;
-       start_info->mod_len = 0;
-       start_info->nr_pages = tot_pte_pages * 1024;
-       start_info->nr_pt_frames = tot_pte_pages + 1;
-       start_info->shared_info = shared_info_frame;
-       start_info->flags = 0;
-       DPRINTF((" control event channel is %d\n", control_evtchn));
-       start_info->domain_controller_evtchn = control_evtchn;
-       strncpy((char *)start_info->cmd_line, cmdline, MAX_GUEST_CMDLINE);
-       start_info->cmd_line[MAX_GUEST_CMDLINE - 1] = '\0';
-       munmap(start_info, PAGE_SIZE);
-
-       DPRINTF(("done setting up start_info\n"));
-       DPRINTF(("shared_info_frame = 0x%lx\n", shared_info_frame));
-       /* shared_info page starts its life empty. */
-
-       shared_info = xc_map_foreign_range(xc_handle, dom,
-                                          PAGE_SIZE, PROT_READ | PROT_WRITE,
-                                          shared_info_frame);
-       memset(shared_info, 0, PAGE_SIZE);
-       /* Mask all upcalls... */
-       DPRINTF(("mask all upcalls\n"));
-       for (i = 0; i < MAX_VIRT_CPUS; i++)
-               shared_info->vcpu_data[i].evtchn_upcall_mask = 1;
-       munmap(shared_info, PAGE_SIZE);
-
-       /* Send the page update requests down to the hypervisor. */
-       DPRINTF(("send page update reqs down.\n"));
-       if (finish_mmu_updates(xc_handle, mmu))
-               goto error_out;
-
-       //DPRINTF (("call dumpit.\n"));
-       //dumpit(pm_handle, 0x100000>>12, tot_pages, page_array) ;
-       //dumpit (pm_handle, 2, 0x100, page_array);
-       free(mmu);
-
-       /* we don't bother freeing anything at this point -- 
-        * we're exiting and it is pointless
-        */
-       return 0;
-
-      error_out:
-       /* oh well we still free some things -- I oughtta nuke this */
-       if (mmu != NULL)
-               free(mmu);
-       ;
-       return -1;
-}
-
-int
-xc_plan9_build(int xc_handle,
-              u32 domid,
-              const char *image_name,
-              const char *cmdline,
-              unsigned int control_evtchn, unsigned long flags)
-{
-       dom0_op_t launch_op, op;
-       unsigned long load_addr = 0;
-       long tot_pages;
-       int kernel_fd = -1;
-       gzFile kernel_gfd = NULL;
-       int rc, i;
-       vcpu_guest_context_t st_ctxt, *ctxt = &st_ctxt;
-       unsigned long virt_startinfo_addr;
-
-       if ((tot_pages = xc_get_tot_pages(xc_handle, domid)) < 0) {
-               PERROR("Could not find total pages for domain");
-               return 1;
-       }
-       DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
-
-       kernel_fd = open(image_name, O_RDONLY);
-       if (kernel_fd < 0) {
-               PERROR("Could not open kernel image");
-               return 1;
-       }
-
-       if ((kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL) {
-               PERROR("Could not allocate decompression state for state file");
-               close(kernel_fd);
-               return 1;
-       }
-
-       DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
-       if (mlock(&st_ctxt, sizeof (st_ctxt))) {
-               PERROR("xc_plan9_build: ctxt mlock failed");
-               return 1;
-       }
-
-       op.cmd = DOM0_GETDOMAININFO;
-       op.u.getdomaininfo.domain = (domid_t) domid;
-       if ((do_dom0_op(xc_handle, &op) < 0) ||
-           ((u32) op.u.getdomaininfo.domain != domid)) {
-               PERROR("Could not get info on domain");
-               goto error_out;
-       }
-       DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
-       
-       if ( xc_domain_get_vcpu_context(xc_handle, domid, 0, ctxt) )
-       {
-           PERROR("Could not get vcpu context");
-           goto error_out;
-       }
-
-       if (!(op.u.getdomaininfo.flags & DOMFLAGS_PAUSED)
-           || (ctxt->pt_base != 0)) {
-               ERROR("Domain is already constructed");
-               goto error_out;
-       }
-
-       DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
-       if (setup_guest(xc_handle, domid, kernel_gfd, tot_pages,
-                         &virt_startinfo_addr,
-                         &load_addr, &st_ctxt, cmdline,
-                         op.u.getdomaininfo.shared_info_frame,
-                         control_evtchn, flags) < 0) {
-               ERROR("Error constructing guest OS");
-               goto error_out;
-       }
-
-       /* leave the leak in here for now
-          if ( kernel_fd >= 0 )
-          close(kernel_fd);
-          if( kernel_gfd )
-          gzclose(kernel_gfd);
-        */
-       ctxt->flags = 0;
-
-       /*
-        * Initial register values:
-        *  DS,ES,FS,GS = FLAT_KERNEL_DS
-        *       CS:EIP = FLAT_KERNEL_CS:start_pc
-        *       SS:ESP = FLAT_KERNEL_DS:start_stack
-        *          ESI = start_info
-        *  [EAX,EBX,ECX,EDX,EDI,EBP are zero]
-        *       EFLAGS = IF | 2 (bit 1 is reserved and should always be 1)
-        */
-       ctxt->user_regs.ds = FLAT_KERNEL_DS;
-       ctxt->user_regs.es = FLAT_KERNEL_DS;
-       ctxt->user_regs.fs = FLAT_KERNEL_DS;
-       ctxt->user_regs.gs = FLAT_KERNEL_DS;
-       ctxt->user_regs.ss = FLAT_KERNEL_DS;
-       ctxt->user_regs.cs = FLAT_KERNEL_CS;
-       ctxt->user_regs.eip = load_addr;
-       ctxt->user_regs.eip = 0x80100020;
-       /* put stack at top of second page */
-       ctxt->user_regs.esp = 0x80000000 + (STACKPAGE << PAGE_SHIFT);
-
-       /* why is this set? */
-       ctxt->user_regs.esi = ctxt->user_regs.esp;
-       ctxt->user_regs.eflags = 1 << 9; /* Interrupt Enable */
-
-       /* FPU is set up to default initial state. */
-       memset(&ctxt->fpu_ctxt, 0, sizeof(ctxt->fpu_ctxt));
-
-       /* Virtual IDT is empty at start-of-day. */
-       for (i = 0; i < 256; i++) {
-               ctxt->trap_ctxt[i].vector = i;
-               ctxt->trap_ctxt[i].cs = FLAT_KERNEL_CS;
-       }
-
-       /* No LDT. */
-       ctxt->ldt_ents = 0;
-
-       /* Use the default Xen-provided GDT. */
-       ctxt->gdt_ents = 0;
-
-       /* Ring 1 stack is the initial stack. */
-       /* put stack at top of second page */
-       ctxt->kernel_ss = FLAT_KERNEL_DS;
-       ctxt->kernel_sp = ctxt->user_regs.esp;
-
-       /* No debugging. */
-       memset(ctxt->debugreg, 0, sizeof (ctxt->debugreg));
-
-       /* No callback handlers. */
-#if defined(__i386__)
-       ctxt->event_callback_cs     = FLAT_KERNEL_CS;
-       ctxt->event_callback_eip    = 0;
-       ctxt->failsafe_callback_cs  = FLAT_KERNEL_CS;
-       ctxt->failsafe_callback_eip = 0;
-#elif defined(__x86_64__)
-       ctxt->event_callback_eip    = 0;
-       ctxt->failsafe_callback_eip = 0;
-       ctxt->syscall_callback_eip  = 0;
-#endif
-
-       memset(&launch_op, 0, sizeof (launch_op));
-
-       launch_op.u.setdomaininfo.domain = (domid_t) domid;
-       launch_op.u.setdomaininfo.vcpu   = 0;
-       //  launch_op.u.setdomaininfo.num_vifs = 1;
-       launch_op.u.setdomaininfo.ctxt = ctxt;
-       launch_op.cmd = DOM0_SETDOMAININFO;
-       rc = do_dom0_op(xc_handle, &launch_op);
-
-       fprintf(stderr, "RC is %d\n", rc);
-       return rc;
-
-      error_out:
-       if (kernel_fd >= 0)
-               close(kernel_fd);
-       if (kernel_gfd)
-               gzclose(kernel_gfd);
-
-       return -1;
-}
-
-/* 
- * Plan 9 memory layout (initial)
- * ----------------
- * | info from xen| @0
- * ---------------|<--- boot args (start at 0x1200 + 64)
- * | stack        |
- * ----------------<--- page 2
- * | empty        |
- * ---------------<---- page 5 MACHADDR (always points to machp[cpuno]
- * | aliased      |
- * ---------------<----- page 6 CPU0MACH
- * | CPU0MACH     |
- * ----------------
- * | empty        |
- * ---------------- *virt_load_addr = ehdr.e_entry (0x80100000)
- * | kernel       |
- * |              |
- * ---------------- <----- page aligned boundary.
- * | data         |
- * |              | 
- * ----------------
- * | bss          |
- * ----------------<---  end of kernel (page aligned)
- * | PMD cpu0pdb  |
- * ----------------<--- page +1
- * | PTE cpu0pte  |
- * ----------------<--- page (tot_pte_pages)/1024
- * | page_array   |
- * ---------------- <--- page (tot_pte_pages)/1024
- * | empty to TOM |
- * ----------------
- */
-
-static int
-loadp9image(gzFile kernel_gfd, int xc_handle, u32 dom,
-           unsigned long *page_array,
-           unsigned long tot_pages, unsigned long *virt_load_addr,
-           unsigned long *ksize, unsigned long *symtab_addr,
-           unsigned long *symtab_len,
-           unsigned long *first_data_page, unsigned long *pdb_page, 
-           const char *cmdline)
-{
-       unsigned long datapage;
-       Exec ehdr;
-
-       char *p;
-       unsigned long maxva;
-       int curpos, ret;
-       PAGE *image = 0;
-       unsigned long image_tot_pages = 0;
-       unsigned long textround;
-       static PAGE args;
-
-       ret = -1;
-
-       p = NULL;
-       maxva = 0;
-
-       if (gzread(kernel_gfd, &ehdr, sizeof (Exec)) != sizeof (Exec)) {
-               PERROR("Error reading kernel image P9 header.");
-               goto out;
-       }
-
-       plan9header(&ehdr);
-       curpos = sizeof (Exec);
-
-       if (ehdr.magic != I_MAGIC) {
-               PERROR("Image does not have an P9 header.");
-               goto out;
-       }
-
-       textround = ((ehdr.text + 0x20 + 4095) >> 12) << 12;
-       *first_data_page = 0x100000 + textround;
-       DPRINTF(("ehrd.text is 0x%lx, textround is 0x%lx\n",
-                ehdr.text, textround));
-
-       image_tot_pages =
-           (textround + ehdr.data + ehdr.bss + PAGE_SIZE - 1) >> PAGE_SHIFT;
-       DPRINTF(("tot pages is %ld\n", image_tot_pages));
-
-       *virt_load_addr = 0x80100000;
-
-       if ((*virt_load_addr & (PAGE_SIZE - 1)) != 0) {
-               ERROR("We can only deal with page-aligned load addresses");
-               goto out;
-       }
-
-       if ((*virt_load_addr + (image_tot_pages << PAGE_SHIFT)) >
-           HYPERVISOR_VIRT_START) {
-               ERROR("Cannot map all domain memory without hitting Xen space");
-               goto out;
-       }
-
-       /* just malloc an image that is image_tot_pages  in size. Then read in 
-        * the image -- text, data, -- to page-rounded alignments. 
-        * then copy into xen .
-        * this gets BSS zeroed for free
-        */
-       DPRINTF(("Allocate %ld bytes\n", image_tot_pages * sizeof (*image)));
-       image = calloc(image_tot_pages, sizeof (*image));
-       if (!image)
-               return blah("alloc data");
-       /* text starts at 0x20, after the header, just like Unix long ago */
-       if (gzread(kernel_gfd, &image[0].data[sizeof (Exec)], ehdr.text) <
-           ehdr.text)
-               return blah("read text");
-       DPRINTF(("READ TEXT %ld bytes\n", ehdr.text));
-       datapage = ((ehdr.text + sizeof (Exec)) / PAGE_SIZE) + 1;
-       if (gzread(kernel_gfd, image[datapage].data, ehdr.data) < ehdr.data)
-               return blah("read data");
-       DPRINTF(("READ DATA %ld bytes\n", ehdr.data));
-
-       /* nice contig stuff */
-       /* oops need to start at 0x100000 */
-
-       ret = memcpy_toguest(xc_handle, dom,
-                            image, image_tot_pages * 4096, page_array, 0x100);
-       DPRINTF(("done copying kernel to guest memory\n"));
-
-       /* now do the bootargs */
-       /* in plan 9, the x=y bootargs start at 0x1200 + 64 in real memory */
-       /* we'll copy to page 1, so we offset into the page struct at 
-        * 0x200 + 64 
-        */
-       memset(&args, 0, sizeof(args));
-       memcpy(&args.data[0x200 + 64], cmdline, strlen(cmdline));
-       printf("Copied :%s: to page for args\n", cmdline);
-       ret = memcpy_toguest(xc_handle, dom, &args, sizeof(args), page_array,1);
-       //dumpit(xc_handle, dom, 0 /*0x100000>>12*/, 4, page_array) ;
-      out:
-       if (image)
-               free(image);
-       *pdb_page = image_tot_pages + (0x100000 >> PAGE_SHIFT);
-       return ret;
-}
diff -Nru a/tools/libxc/xc_ptrace.c b/tools/libxc/xc_ptrace.c
--- a/tools/libxc/xc_ptrace.c   2005-06-24 07:02:39 -04:00
+++ b/tools/libxc/xc_ptrace.c   2005-06-24 07:02:39 -04:00
@@ -75,7 +75,7 @@
        int retval = xc_domain_get_vcpu_context(xc_handle, domid, cpu, 
&ctxt[cpu]); \
        if (retval) \
            goto error_out; \
-       cr3[cpu] = ctxt[cpu].pt_base; /* physical address */ \
+       cr3[cpu] = ctxt[cpu].ctrlreg[3]; /* physical address */ \
        regs_valid[cpu] = 1; \
     } \
 
@@ -136,7 +136,7 @@
 
 static inline int paging_enabled(vcpu_guest_context_t *v)
 {
-    unsigned long cr0 = v->cr0;
+    unsigned long cr0 = v->ctrlreg[0];
 
     return (cr0 & X86_CR0_PE) && (cr0 & X86_CR0_PG);
 }
diff -Nru a/tools/libxc/xc_ptrace_core.c b/tools/libxc/xc_ptrace_core.c
--- a/tools/libxc/xc_ptrace_core.c      2005-06-24 07:02:39 -04:00
+++ b/tools/libxc/xc_ptrace_core.c      2005-06-24 07:02:39 -04:00
@@ -193,7 +193,7 @@
            return -1;
 
        for (i = 0; i < nr_vcpus; i++) {
-           cr3[i] = ctxt[i].pt_base;
+           cr3[i] = ctxt[i].ctrlreg[3];
        }
        if ((p2m_array = malloc(nr_pages * sizeof(unsigned long))) == NULL) {
            printf("Could not allocate p2m_array\n");
diff -Nru a/tools/libxc/xc_vmx_build.c b/tools/libxc/xc_vmx_build.c
--- a/tools/libxc/xc_vmx_build.c        2005-06-24 07:02:39 -04:00
+++ b/tools/libxc/xc_vmx_build.c        2005-06-24 07:02:39 -04:00
@@ -271,7 +271,7 @@
     /* First allocate page for page dir. */
     ppt_alloc = (vpt_start - dsi.v_start) >> PAGE_SHIFT;
     l2tab = page_array[ppt_alloc++] << PAGE_SHIFT;
-    ctxt->pt_base = l2tab;
+    ctxt->ctrlreg[3] = l2tab;
 
     /* Initialise the page tables. */
     if ( (vl2tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, 
@@ -549,7 +549,7 @@
     }
 
     if ( !(op.u.getdomaininfo.flags & DOMFLAGS_PAUSED) ||
-         (ctxt->pt_base != 0) )
+         (ctxt->ctrlreg[3] != 0) )
     {
         ERROR("Domain is already constructed");
         goto error_out;
diff -Nru a/xen/arch/x86/dom0_ops.c b/xen/arch/x86/dom0_ops.c
--- a/xen/arch/x86/dom0_ops.c   2005-06-24 07:02:39 -04:00
+++ b/xen/arch/x86/dom0_ops.c   2005-06-24 07:02:39 -04:00
@@ -378,12 +378,8 @@
 
 void arch_getdomaininfo_ctxt(
     struct vcpu *v, struct vcpu_guest_context *c)
-{ 
-#ifdef __i386__  /* Remove when x86_64 VMX is implemented */
-#ifdef CONFIG_VMX
+{
     extern void save_vmx_cpu_user_regs(struct cpu_user_regs *);
-#endif
-#endif
 
     memcpy(c, &v->arch.guest_context, sizeof(*c));
 
@@ -391,27 +387,22 @@
     BUG_ON((c->user_regs.eflags & EF_IOPL) != 0);
     c->user_regs.eflags |= v->arch.iopl << 12;
 
-#ifdef __i386__
-#ifdef CONFIG_VMX
-    if ( VMX_DOMAIN(v) ) {
+    if ( VMX_DOMAIN(v) )
+    {
         save_vmx_cpu_user_regs(&c->user_regs);
-        __vmread(CR0_READ_SHADOW, &c->cr0);
-        __vmread(CR4_READ_SHADOW, &c->cr4);
+        __vmread(CR0_READ_SHADOW, &c->ctrlreg[0]);
+        __vmread(CR4_READ_SHADOW, &c->ctrlreg[4]);
     }
-#endif
-#endif
 
     c->flags = 0;
     if ( test_bit(_VCPUF_fpu_initialised, &v->vcpu_flags) )
         c->flags |= VGCF_I387_VALID;
     if ( KERNEL_MODE(v, &v->arch.guest_context.user_regs) )
         c->flags |= VGCF_IN_KERNEL;
-#ifdef CONFIG_VMX
     if (VMX_DOMAIN(v))
         c->flags |= VGCF_VMX_GUEST;
-#endif
 
-    c->pt_base = pagetable_get_paddr(v->arch.guest_table);
+    c->ctrlreg[3] = pagetable_get_paddr(v->arch.guest_table);
 
     c->vm_assist = v->domain->vm_assist;
 }
diff -Nru a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     2005-06-24 07:02:39 -04:00
+++ b/xen/arch/x86/domain.c     2005-06-24 07:02:39 -04:00
@@ -8,7 +8,7 @@
  *  Copyright (C) 1995  Linus Torvalds
  *
  *  Pentium III FXSR, SSE support
- *     Gareth Hughes <gareth@xxxxxxxxxxx>, May 2000
+ *  Gareth Hughes <gareth@xxxxxxxxxxx>, May 2000
  */
 
 #include <xen/config.h>
@@ -115,7 +115,7 @@
 void machine_restart(char * __unused)
 {
     int i;
-       
+
     if ( opt_noreboot )
     {
         printk("Reboot disabled on cmdline: require manual reset\n");
@@ -432,7 +432,7 @@
     if ( v->vcpu_id == 0 )
         d->vm_assist = c->vm_assist;
 
-    phys_basetab = c->pt_base;
+    phys_basetab = c->ctrlreg[3];
     v->arch.guest_table = mk_pagetable(phys_basetab);
 
     if ( shadow_mode_refcounts(d) )
@@ -453,24 +453,15 @@
         return rc;
     }
 
-#ifdef CONFIG_VMX
     if ( c->flags & VGCF_VMX_GUEST )
     {
-        int error;
-
-        // VMX uses the initially provided page tables as the P2M map.
-        //
-        // XXX: This creates a security issue -- Xen can't necessarily
-        //      trust the VMX domain builder.  Xen should validate this
-        //      page table, and/or build the table itself, or ???
-        //
+        /* VMX uses the initially provided page tables as the P2M map. */
         if ( !pagetable_get_paddr(d->arch.phys_table) )
             d->arch.phys_table = v->arch.guest_table;
 
-        if ( (error = vmx_final_setup_guest(v, c)) )
-            return error;
+        if ( (rc = vmx_final_setup_guest(v, c)) != 0 )
+            return rc;
     }
-#endif
 
     update_pagetables(v);
     
@@ -704,7 +695,7 @@
 #endif
 
 #define loaddebug(_v,_reg) \
-       __asm__ __volatile__ ("mov %0,%%db" #_reg : : "r" 
((_v)->debugreg[_reg]))
+    __asm__ __volatile__ ("mov %0,%%db" #_reg : : "r" ((_v)->debugreg[_reg]))
 
 static void __context_switch(void)
 {
@@ -982,6 +973,7 @@
 void domain_relinquish_resources(struct domain *d)
 {
     struct vcpu *v;
+    unsigned long pfn;
 
     BUG_ON(!cpus_empty(d->cpumask));
 
@@ -995,22 +987,20 @@
     /* Drop the in-use references to page-table bases. */
     for_each_vcpu ( d, v )
     {
-        if ( pagetable_get_paddr(v->arch.guest_table) != 0 )
+        if ( (pfn = pagetable_get_pfn(v->arch.guest_table)) != 0 )
         {
-            if ( shadow_mode_refcounts(d) )
-                put_page(&frame_table[pagetable_get_pfn(v->arch.guest_table)]);
-            else
-                
put_page_and_type(&frame_table[pagetable_get_pfn(v->arch.guest_table)]);
+            if ( !shadow_mode_refcounts(d) )
+                put_page_type(pfn_to_page(pfn));
+            put_page(pfn_to_page(pfn));
 
             v->arch.guest_table = mk_pagetable(0);
         }
 
-        if ( pagetable_get_paddr(v->arch.guest_table_user) != 0 )
+        if ( (pfn = pagetable_get_pfn(v->arch.guest_table_user)) != 0 )
         {
-            if ( shadow_mode_refcounts(d) )
-                
put_page(&frame_table[pagetable_get_pfn(v->arch.guest_table_user)]);
-            else
-                
put_page_and_type(&frame_table[pagetable_get_pfn(v->arch.guest_table_user)]);
+            if ( !shadow_mode_refcounts(d) )
+                put_page_type(pfn_to_page(pfn));
+            put_page(pfn_to_page(pfn));
 
             v->arch.guest_table_user = mk_pagetable(0);
         }
diff -Nru a/xen/arch/x86/i387.c b/xen/arch/x86/i387.c
--- a/xen/arch/x86/i387.c       2005-06-24 07:02:38 -04:00
+++ b/xen/arch/x86/i387.c       2005-06-24 07:02:38 -04:00
@@ -29,7 +29,7 @@
      * This causes us to set the real flag, so we'll need
      * to temporarily clear it while saving f-p state.
      */
-    if ( test_bit(_VCPUF_guest_stts, &tsk->vcpu_flags) )
+    if ( VMX_DOMAIN(tsk) || (tsk->arch.guest_context.ctrlreg[0] & X86_CR0_TS) )
         clts();
 
     if ( cpu_has_fxsr )
diff -Nru a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      2005-06-24 07:02:38 -04:00
+++ b/xen/arch/x86/traps.c      2005-06-24 07:02:39 -04:00
@@ -348,7 +348,7 @@
     if ( TI_GET_IF(ti) )
         tb->flags |= TBF_INTERRUPT;
 
-    v->arch.guest_cr2 = addr;
+    v->arch.guest_context.ctrlreg[2] = addr;
 }
 
 static int handle_perdomain_mapping_fault(
@@ -478,12 +478,12 @@
 
     if ( set )
     {
-        set_bit(_VCPUF_guest_stts, &v->vcpu_flags);
+        v->arch.guest_context.ctrlreg[0] |= X86_CR0_TS;
         stts();
     }
     else
     {
-        clear_bit(_VCPUF_guest_stts, &v->vcpu_flags);
+        v->arch.guest_context.ctrlreg[0] &= ~X86_CR0_TS;
         if ( test_bit(_VCPUF_fpu_dirtied, &v->vcpu_flags) )
             clts();
     }
@@ -789,13 +789,11 @@
         switch ( (opcode >> 3) & 7 )
         {
         case 0: /* Read CR0 */
-            *reg = 
-                (read_cr0() & ~X86_CR0_TS) | 
-                (test_bit(_VCPUF_guest_stts, &v->vcpu_flags) ? X86_CR0_TS:0);
+            *reg = v->arch.guest_context.ctrlreg[0];
             break;
 
         case 2: /* Read CR2 */
-            *reg = v->arch.guest_cr2;
+            *reg = v->arch.guest_context.ctrlreg[2];
             break;
             
         case 3: /* Read CR3 */
@@ -820,7 +818,7 @@
             break;
 
         case 2: /* Write CR2 */
-            v->arch.guest_cr2 = *reg;
+            v->arch.guest_context.ctrlreg[2] = *reg;
             break;
             
         case 3: /* Write CR3 */
@@ -1033,12 +1031,13 @@
 
     setup_fpu(current);
 
-    if ( test_and_clear_bit(_VCPUF_guest_stts, &current->vcpu_flags) )
+    if ( current->arch.guest_context.ctrlreg[0] & X86_CR0_TS )
     {
         struct trap_bounce *tb = &current->arch.trap_bounce;
         tb->flags = TBF_EXCEPTION;
         tb->cs    = current->arch.guest_context.trap_ctxt[7].cs;
         tb->eip   = current->arch.guest_context.trap_ctxt[7].address;
+        current->arch.guest_context.ctrlreg[0] &= ~X86_CR0_TS;
     }
 
     return EXCRET_fault_fixed;
diff -Nru a/xen/arch/x86/vmx_vmcs.c b/xen/arch/x86/vmx_vmcs.c
--- a/xen/arch/x86/vmx_vmcs.c   2005-06-24 07:02:39 -04:00
+++ b/xen/arch/x86/vmx_vmcs.c   2005-06-24 07:02:39 -04:00
@@ -168,7 +168,6 @@
     struct cpu_user_regs *regs = guest_cpu_user_regs();
 
     vmx_stts();
-    set_bit(_VCPUF_guest_stts, &v->vcpu_flags);
 
     cpu = smp_processor_id();
 
diff -Nru a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h      2005-06-24 07:02:38 -04:00
+++ b/xen/include/asm-x86/domain.h      2005-06-24 07:02:38 -04:00
@@ -112,9 +112,6 @@
 
     unsigned long monitor_shadow_ref;
 
-    /* Virtual CR2 value. Can be read/written by guest. */
-    unsigned long guest_cr2;
-
     /* Current LDT details. */
     unsigned long shadow_ldt_mapcnt;
 } __cacheline_aligned;
diff -Nru a/xen/include/public/arch-x86_32.h b/xen/include/public/arch-x86_32.h
--- a/xen/include/public/arch-x86_32.h  2005-06-24 07:02:39 -04:00
+++ b/xen/include/public/arch-x86_32.h  2005-06-24 07:02:39 -04:00
@@ -136,9 +136,7 @@
     unsigned long ldt_base, ldt_ents;       /* LDT (linear address, # ents) */
     unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
     unsigned long kernel_ss, kernel_sp;     /* Virtual TSS (only SS1/SP1)   */
-    unsigned long pt_base;                  /* CR3 (pagetable base)         */
-    unsigned long cr0;                      /* CR0                          */
-    unsigned long cr4;                      /* CR4                          */
+    unsigned long ctrlreg[8];               /* CR0-CR7 (control registers)  */
     unsigned long debugreg[8];              /* DB0-DB7 (debug registers)    */
     unsigned long event_callback_cs;        /* CS:EIP of event callback     */
     unsigned long event_callback_eip;
diff -Nru a/xen/include/public/arch-x86_64.h b/xen/include/public/arch-x86_64.h
--- a/xen/include/public/arch-x86_64.h  2005-06-24 07:02:39 -04:00
+++ b/xen/include/public/arch-x86_64.h  2005-06-24 07:02:39 -04:00
@@ -186,9 +186,7 @@
     unsigned long ldt_base, ldt_ents;       /* LDT (linear address, # ents) */
     unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
     unsigned long kernel_ss, kernel_sp;     /* Virtual TSS (only SS1/SP1)   */
-    unsigned long pt_base;                  /* CR3 (pagetable base)         */
-    unsigned long cr0;                      /* CR0                          */
-    unsigned long cr4;                      /* CR4                          */
+    unsigned long ctrlreg[8];               /* CR0-CR7 (control registers)  */
     unsigned long debugreg[8];              /* DB0-DB7 (debug registers)    */
     unsigned long event_callback_eip;
     unsigned long failsafe_callback_eip;
diff -Nru a/xen/include/public/dom0_ops.h b/xen/include/public/dom0_ops.h
--- a/xen/include/public/dom0_ops.h     2005-06-24 07:02:39 -04:00
+++ b/xen/include/public/dom0_ops.h     2005-06-24 07:02:39 -04:00
@@ -19,7 +19,7 @@
  * This makes sure that old versions of dom0 tools will stop working in a
  * well-defined way (rather than crashing the machine, for instance).
  */
-#define DOM0_INTERFACE_VERSION   0xAAAA1006
+#define DOM0_INTERFACE_VERSION   0xAAAA1007
 
 /************************************************************************/
 
diff -Nru a/xen/include/xen/sched.h b/xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   2005-06-24 07:02:38 -04:00
+++ b/xen/include/xen/sched.h   2005-06-24 07:02:38 -04:00
@@ -327,9 +327,6 @@
  /* Has the FPU been used since it was last saved? */
 #define _VCPUF_fpu_dirtied     1
 #define VCPUF_fpu_dirtied      (1UL<<_VCPUF_fpu_dirtied)
- /* Has the guest OS requested 'stts'? */
-#define _VCPUF_guest_stts      2
-#define VCPUF_guest_stts       (1UL<<_VCPUF_guest_stts)
  /* Domain is blocked waiting for an event. */
 #define _VCPUF_blocked         3
 #define VCPUF_blocked          (1UL<<_VCPUF_blocked)

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Rationalise x86 CRn guest state into a ctrlreg array in the per-vcpu, BitKeeper Bot <=