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] merge

# HG changeset patch
# User ack@xxxxxxxxxxxxxxxxxxxxx
# Node ID 5de3bc3c6297e3553cad92a2df0a699da0f7ca9d
# Parent  d48842f924d0e0c8e6e52887914850f4c7c02585
# Parent  438ed1c4b3916058a183d6c8e731566d2f4ca1da
merge
---
 .hgignore                               |    5 -
 tools/firmware/vmxassist/head.S         |    5 -
 tools/firmware/vmxassist/vm86.c         |  103 ++++++++++++++++++++++++++++----
 tools/python/xen/xend/XendDomainInfo.py |    7 --
 tools/xenmon/xenbaked.c                 |   19 ++---
 xen/arch/powerpc/Makefile               |    8 +-
 xen/arch/powerpc/boot_of.c              |   49 +++++++++------
 xen/arch/powerpc/domain.c               |   47 ++++++++------
 xen/arch/powerpc/domain_build.c         |    6 -
 xen/arch/powerpc/htab.c                 |   13 +---
 xen/arch/powerpc/mm.c                   |   20 +++++-
 xen/arch/powerpc/ofd_fixup.c            |    8 +-
 xen/arch/powerpc/papr/xlate.c           |    2 
 xen/arch/powerpc/powerpc64/ppc970.c     |    7 +-
 xen/arch/powerpc/setup.c                |   41 ++++++++----
 xen/include/asm-powerpc/config.h        |    1 
 xen/include/asm-powerpc/domain.h        |   13 ++--
 xen/include/asm-powerpc/grant_table.h   |    2 
 xen/include/asm-powerpc/htab.h          |    8 --
 xen/include/asm-powerpc/mm.h            |    2 
 xen/include/asm-powerpc/shadow.h        |   15 ++++
 21 files changed, 260 insertions(+), 121 deletions(-)

diff -r d48842f924d0 -r 5de3bc3c6297 .hgignore
--- a/.hgignore Tue Aug 15 11:13:04 2006 +0100
+++ b/.hgignore Tue Aug 15 11:16:46 2006 +0100
@@ -199,5 +199,6 @@
 ^xen/xen\..*$
 ^xen/arch/powerpc/dom0\.bin$
 ^xen/arch/powerpc/asm-offsets\.s$
-^xen/arch/powerpc/firmware
-^xen/arch/powerpc/firmware_image
+^xen/arch/powerpc/firmware$
+^xen/arch/powerpc/firmware_image$
+^xen/arch/powerpc/xen\.lds$
diff -r d48842f924d0 -r 5de3bc3c6297 tools/firmware/vmxassist/head.S
--- a/tools/firmware/vmxassist/head.S   Tue Aug 15 11:13:04 2006 +0100
+++ b/tools/firmware/vmxassist/head.S   Tue Aug 15 11:16:46 2006 +0100
@@ -114,8 +114,6 @@ _start:
 #ifdef TEST
        xorl    %edx, %edx
 #endif
-       movl    %edx, booting_cpu
-       movl    %ebx, booting_vector
 
        /* clear bss */
        cld
@@ -124,6 +122,9 @@ _start:
        movl    $_ebss, %ecx
        subl    %edi, %ecx
        rep     stosb
+
+       movl    %edx, booting_cpu
+       movl    %ebx, booting_vector
 
        /* make sure we are in a sane world */
        clts
diff -r d48842f924d0 -r 5de3bc3c6297 tools/firmware/vmxassist/vm86.c
--- a/tools/firmware/vmxassist/vm86.c   Tue Aug 15 11:13:04 2006 +0100
+++ b/tools/firmware/vmxassist/vm86.c   Tue Aug 15 11:16:46 2006 +0100
@@ -983,7 +983,9 @@ set_mode(struct regs *regs, enum vm86_mo
        case VM86_PROTECTED:
                if (mode == VM86_REAL_TO_PROTECTED) {
                        protected_mode(regs);
-                       break;
+//                     printf("<VM86_PROTECTED>\n");
+                       mode = newmode;
+                       return;
                } else
                        panic("unexpected protected mode transition");
                break;
@@ -1170,6 +1172,26 @@ inbyte(struct regs *regs, unsigned prefi
        return 1;
 }
 
+static void
+pushrm(struct regs *regs, int prefix, unsigned modrm)
+{
+       unsigned n = regs->eip;
+       unsigned addr;
+       unsigned data;
+
+       addr  = operand(prefix, regs, modrm);
+       
+       if (prefix & DATA32) {
+               data = read32(addr);
+               push32(regs, data);
+       } else {
+               data = read16(addr);
+               push16(regs, data);
+       }
+
+       TRACE((regs, (regs->eip - n) + 1, "push *0x%x", addr));
+}
+
 enum { OPC_INVALID, OPC_EMULATED };
 
 /*
@@ -1186,6 +1208,14 @@ opcode(struct regs *regs)
 
        for (;;) {
                switch ((opc = fetch8(regs))) {
+               case 0x07:
+                       if (prefix & DATA32)
+                               regs->ves = pop32(regs);
+                       else
+                               regs->ves = pop16(regs);
+                       TRACE((regs, regs->eip - eip, "pop %%es"));
+                       return OPC_EMULATED;
+
                case 0x0F: /* two byte opcode */
                        if (mode == VM86_PROTECTED)
                                goto invalid;
@@ -1288,6 +1318,22 @@ opcode(struct regs *regs)
                         return OPC_EMULATED;
 
                case 0x89: /* addr32 mov r16, r/m16 */
+                       if (mode == VM86_PROTECTED_TO_REAL) {
+                               unsigned modrm = fetch8(regs);
+                               unsigned addr = operand(prefix, regs, modrm);
+                               unsigned val, r = (modrm >> 3) & 7;
+                               
+                               if (prefix & DATA32) {
+                                       val = getreg16(regs, r);
+                                       write32(addr, val);
+                               } else {
+                                       val = getreg32(regs, r);
+                                       write16(addr, MASK16(val));
+                               }
+                               TRACE((regs, regs->eip - eip,
+                                       "mov %%%s, *0x%x", rnames[r], addr));
+                               return OPC_EMULATED;
+                       }
                case 0x8B: /* addr32 mov r/m16, r16 */
                        if (mode != VM86_REAL && mode != VM86_REAL_TO_PROTECTED)
                                goto invalid;
@@ -1324,6 +1370,37 @@ opcode(struct regs *regs)
                                regs->eflags = (regs->eflags & 0xFFFF0000L) |
                                                                pop16(regs);
                        regs->eflags |= EFLAGS_VM;
+                       return OPC_EMULATED;
+
+               case 0xA1: /* mov ax, r/m16 */ 
+                       {
+                               int addr, data;
+                               int seg = segment(prefix, regs, regs->vds);
+                               if (prefix & DATA32) {
+                                       addr = address(regs, seg, 
fetch32(regs));
+                                       data = read32(addr);
+                                       setreg32(regs, 0, data);
+                               } else {
+                                       addr = address(regs, seg, 
fetch16(regs));
+                                       data = read16(addr);
+                                       setreg16(regs, 0, data);
+                               }
+                               TRACE((regs, regs->eip - eip, "mov *0x%x, 
%%ax", addr));
+                       }
+                       return OPC_EMULATED;
+
+               case 0xBB: /* mov bx, imm16 */
+                       {
+                               int data;
+                               if (prefix & DATA32) {
+                                       data = fetch32(regs);
+                                       setreg32(regs, 3, data);
+                               } else {
+                                       data = fetch16(regs);
+                                       setreg16(regs, 3, data);
+                               }
+                               TRACE((regs, regs->eip - eip, "mov $0x%x, 
%%bx", data));
+                       }
                        return OPC_EMULATED;
 
                case 0xC6: /* addr32 movb $imm, r/m8 */
@@ -1380,21 +1457,25 @@ opcode(struct regs *regs)
                        goto invalid;
 
                case 0xFF: /* jmpl (indirect) */
-                       if ((mode == VM86_REAL_TO_PROTECTED) ||
-                           (mode == VM86_PROTECTED_TO_REAL)) {
-                               unsigned modrm = fetch8(regs);
-                               
+                       {
+                               unsigned modrm = fetch8(regs);
                                switch((modrm >> 3) & 7) {
-                               case 5:
-                                 jmpl_indirect(regs, prefix, modrm);
-                                 return OPC_INVALID;
+                               case 5: /* jmpl (indirect) */
+                                       if ((mode == VM86_REAL_TO_PROTECTED) ||
+                                           (mode == VM86_PROTECTED_TO_REAL)) {
+                                               jmpl_indirect(regs, prefix, 
modrm);
+                                               return OPC_INVALID;
+                                       }
+                                       goto invalid;
+
+                               case 6: /* push r/m16 */
+                                       pushrm(regs, prefix, modrm);
+                                       return OPC_EMULATED;
 
                                default:
-                                 break;
+                                       goto invalid;
                                }
-
                        }
-                       goto invalid;
 
                case 0xEB: /* short jump */
                        if ((mode == VM86_REAL_TO_PROTECTED) ||
diff -r d48842f924d0 -r 5de3bc3c6297 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Tue Aug 15 11:13:04 2006 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py   Tue Aug 15 11:16:46 2006 +0100
@@ -1272,12 +1272,9 @@ class XendDomainInfo:
             # repin domain vcpus if a restricted cpus list is provided
             # this is done prior to memory allocation to aide in memory
             # distribution for NUMA systems.
-            cpus = self.info['cpus']
-            if cpus is not None and len(cpus) > 0:
+            if self.info['cpus'] is not None and len(self.info['cpus']) > 0:
                 for v in range(0, self.info['max_vcpu_id']+1):
-                    # pincpu takes a list of ints
-                    cpu = [ int( cpus[v % len(cpus)] ) ]
-                    xc.vcpu_setaffinity(self.domid, v, cpu)
+                    xc.vcpu_setaffinity(self.domid, v, self.info['cpus'])
 
             # set domain maxmem in KiB
             xc.domain_setmaxmem(self.domid, self.info['maxmem'] * 1024)
diff -r d48842f924d0 -r 5de3bc3c6297 tools/xenmon/xenbaked.c
--- a/tools/xenmon/xenbaked.c   Tue Aug 15 11:13:04 2006 +0100
+++ b/tools/xenmon/xenbaked.c   Tue Aug 15 11:16:46 2006 +0100
@@ -444,14 +444,11 @@ struct t_rec **init_rec_ptrs(struct t_bu
  */
 unsigned int get_num_cpus(void)
 {
-    dom0_op_t op;
+    xc_physinfo_t physinfo;
     int xc_handle = xc_interface_open();
     int ret;
 
-    op.cmd = DOM0_PHYSINFO;
-    op.interface_version = DOM0_INTERFACE_VERSION;
-
-    ret = xc_dom0_op(xc_handle, &op);
+    ret = xc_physinfo(xc_handle, &physinfo);
 
     if ( ret != 0 )
     {
@@ -460,12 +457,12 @@ unsigned int get_num_cpus(void)
     }
 
     xc_interface_close(xc_handle);
-    opts.cpu_freq = (double)op.u.physinfo.cpu_khz/1000.0;
-
-    return (op.u.physinfo.threads_per_core *
-            op.u.physinfo.cores_per_socket *
-            op.u.physinfo.sockets_per_node *
-            op.u.physinfo.nr_nodes);
+    opts.cpu_freq = (double)physinfo.cpu_khz/1000.0;
+
+    return (physinfo.threads_per_core *
+            physinfo.cores_per_socket *
+            physinfo.sockets_per_node *
+            physinfo.nr_nodes);
 }
 
 
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/Makefile
--- a/xen/arch/powerpc/Makefile Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/Makefile Tue Aug 15 11:16:46 2006 +0100
@@ -49,7 +49,7 @@ PPC_C_WARNINGS += -Wundef -Wmissing-prot
 PPC_C_WARNINGS += -Wundef -Wmissing-prototypes -Wmissing-declarations
 CFLAGS += $(PPC_C_WARNINGS)
 
-LINK=0x3000000
+LINK=0x400000
 boot32_link_base = $(LINK)
 xen_link_offset  = 100
 xen_link_base    = $(patsubst %000,%$(xen_link_offset),$(LINK))
@@ -83,8 +83,10 @@ physdev.o: ../x86/physdev.c
 
 HDRS += $(wildcard *.h)
 
-CMDLINE = "xen"
-boot_of.o: CFLAGS += -DCMDLINE="\"$(CMDLINE)\""
+# The first token in the arguments will be silently dropped.
+IMAGENAME = xen
+CMDLINE = ""
+boot_of.o: CFLAGS += -DCMDLINE="\"$(IMAGENAME) $(CMDLINE)\""
 
 start.o: boot/start.S
        $(CC) $(CFLAGS) -D__ASSEMBLY__ -c $< -o $@
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/boot_of.c
--- a/xen/arch/powerpc/boot_of.c        Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/boot_of.c        Tue Aug 15 11:16:46 2006 +0100
@@ -13,7 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
- * Copyright (C) IBM Corp. 2005
+ * Copyright (C) IBM Corp. 2005, 2006
  *
  * Authors: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
  */
@@ -304,12 +304,11 @@ static int __init of_instance_to_path(in
 
 static int __init of_start_cpu(int cpu, u32 pc, u32 reg)
 {
-    int rets[1] = { OF_FAILURE };
-
-    if ( of_call("start-cpu", 3, 0, rets, cpu, pc, reg) == OF_FAILURE )
-        return OF_FAILURE;
-
-    return rets[0];
+    int ret;
+
+    ret = of_call("start-cpu", 3, 0, NULL, cpu, pc, reg);
+
+    return ret;
 }
 
 static void __init of_test(const char *of_method_name)
@@ -760,19 +759,30 @@ static int __init boot_of_serial(void *o
     if (n == OF_FAILURE) {
         of_panic("instance-to-package of /chosen/stdout: failed\n");
     }
-
-    /* prune this from the oftree */
-    rc = of_package_to_path(n, buf, sizeof(buf));
-    if (rc == OF_FAILURE) {
-        of_panic("package-to-path of /chosen/stdout: failed\n");
-    }
-    of_printf("Pruning from devtree: %s\n"
-              "  since Xen will be using it for console\n", buf);
-    rc = ofd_prune_path(oftree, buf);
-    if (rc < 0) {
-        of_panic("prune path \"%s\" failed\n", buf);
-    }
     
+    /* Prune all serial devices from the device tree, including the
+     * one pointed to by /chosen/stdout, because a guest domain can
+     * initialize them and in so doing corrupt our console output.
+     */
+    for (p = n; p > 0; p = of_getpeer(p)) {
+        char type[32];
+
+        rc = of_package_to_path(p, buf, sizeof(buf));
+        if (rc == OF_FAILURE)
+            of_panic("package-to-path failed\n");
+
+        rc = of_getprop(p, "device_type", type, sizeof (type));
+        if (rc == OF_FAILURE)
+            of_panic("fetching device type failed\n");
+
+        if (strcmp(type, "serial") != 0)
+            continue;
+
+        of_printf("pruning `%s' from devtree\n", buf);
+        rc = ofd_prune_path(oftree, buf);
+        if (rc < 0)
+            of_panic("prune of `%s' failed\n", buf);
+    }
 
     p = of_getparent(n);
     if (p == OF_FAILURE) {
@@ -799,7 +809,6 @@ static int __init boot_of_serial(void *o
     if (rc == OF_FAILURE) {
         of_panic("%s: no location for serial port\n", __func__);
     }
-    ns16550.io_base = val[1];
 
     ns16550.baud = BAUD_AUTO;
     ns16550.data_bits = 8;
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/domain.c
--- a/xen/arch/powerpc/domain.c Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/domain.c Tue Aug 15 11:16:46 2006 +0100
@@ -73,10 +73,9 @@ unsigned long hypercall_create_continuat
 
 int arch_domain_create(struct domain *d)
 {
-    struct page_info *rma;
     unsigned long rma_base;
-    unsigned long rma_size;
-    unsigned int rma_order;
+    unsigned long rma_sz;
+    uint htab_order;
 
     if (d->domain_id == IDLE_DOMAIN_ID) {
         d->shared_info = (void *)alloc_xenheap_page();
@@ -85,25 +84,21 @@ int arch_domain_create(struct domain *d)
         return 0;
     }
 
-    rma_order = cpu_rma_order();
-    rma_size = 1UL << rma_order << PAGE_SHIFT;
+    d->arch.rma_order = cpu_rma_order();
+    rma_sz = rma_size(d->arch.rma_order);
 
     /* allocate the real mode area */
-    d->max_pages = 1UL << rma_order;
-    rma = alloc_domheap_pages(d, rma_order, 0);
-    if (NULL == rma)
+    d->max_pages = 1UL << d->arch.rma_order;
+    d->tot_pages = 0;
+    d->arch.rma_page = alloc_domheap_pages(d, d->arch.rma_order, 0);
+    if (NULL == d->arch.rma_page)
         return 1;
-    rma_base = page_to_maddr(rma);
-
-    BUG_ON(rma_base & (rma_size-1)); /* check alignment */
-
-    d->arch.rma_base = rma_base;
-    d->arch.rma_size = rma_size;
-
-    printk("clearing RMO: 0x%lx[0x%lx]\n", rma_base, rma_size);
-    memset((void *)rma_base, 0, rma_size);
-
-    htab_alloc(d, LOG_DEFAULT_HTAB_BYTES);
+    rma_base = page_to_maddr(d->arch.rma_page);
+
+    BUG_ON(rma_base & (rma_sz - 1)); /* check alignment */
+
+    printk("clearing RMO: 0x%lx[0x%lx]\n", rma_base, rma_sz);
+    memset((void *)rma_base, 0, rma_sz);
 
     d->shared_info = (shared_info_t *)
         (rma_addr(&d->arch, RMA_SHARED_INFO) + rma_base);
@@ -111,12 +106,22 @@ int arch_domain_create(struct domain *d)
     d->arch.large_page_sizes = 1;
     d->arch.large_page_shift[0] = 24; /* 16 M for 970s */
 
+    /* FIXME: we need to the the maximum addressible memory for this
+     * domain to calculate this correctly. It should probably be set
+     * by the managment tools */
+    htab_order = d->arch.rma_order - 6; /* (1/64) */
+    if (test_bit(_DOMF_privileged, &d->domain_flags)) {
+        /* bump the htab size of privleged domains */
+        ++htab_order;
+    }
+    htab_alloc(d, htab_order);
+
     return 0;
 }
 
 void arch_domain_destroy(struct domain *d)
 {
-    unimplemented();
+    htab_free(d);
 }
 
 void machine_halt(void)
@@ -258,7 +263,7 @@ void sync_vcpu_execstate(struct vcpu *v)
 
 void domain_relinquish_resources(struct domain *d)
 {
-    /* nothing to do? */
+    free_domheap_pages(d->arch.rma_page, d->arch.rma_order);
 }
 
 void arch_dump_domain_info(struct domain *d)
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/domain_build.c
--- a/xen/arch/powerpc/domain_build.c   Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/domain_build.c   Tue Aug 15 11:16:46 2006 +0100
@@ -105,8 +105,8 @@ int construct_dom0(struct domain *d,
     struct domain_setup_info dsi;
     ulong dst;
     u64 *ofh_tree;
-    ulong rma_sz = d->arch.rma_size;
-    ulong rma = d->arch.rma_base;
+    ulong rma_sz = rma_size(d->arch.rma_order);
+    ulong rma = page_to_maddr(d->arch.rma_page);
     start_info_t *si;
     ulong eomem;
     int am64 = 1;
@@ -145,7 +145,7 @@ int construct_dom0(struct domain *d,
 
     /* By default DOM0 is allocated all available memory. */
     d->max_pages = ~0U;
-    d->tot_pages = (d->arch.rma_size >> PAGE_SHIFT);
+    d->tot_pages = 1UL << d->arch.rma_order;
 
     ASSERT( image_len < rma_sz );
 
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/htab.c
--- a/xen/arch/powerpc/htab.c   Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/htab.c   Tue Aug 15 11:16:46 2006 +0100
@@ -34,36 +34,35 @@ static ulong htab_calc_sdr1(ulong htab_a
     return (htab_addr | (sdr1_htabsize & SDR1_HTABSIZE_MASK));
 }
 
-void htab_alloc(struct domain *d, int log_htab_bytes)
+void htab_alloc(struct domain *d, uint order)
 {
     ulong htab_raddr;
+    ulong log_htab_bytes = order + PAGE_SHIFT;
     ulong htab_bytes = 1UL << log_htab_bytes;
 
     /* XXX use alloc_domheap_pages instead? */
-    htab_raddr = (ulong)alloc_xenheap_pages(log_htab_bytes - PAGE_SHIFT);
+    htab_raddr = (ulong)alloc_xenheap_pages(order);
     ASSERT(htab_raddr != 0);
     /* XXX check alignment guarantees */
-    ASSERT((htab_raddr & (htab_bytes-1)) == 0);
+    ASSERT((htab_raddr & (htab_bytes - 1)) == 0);
 
     /* XXX slow. move memset out to service partition? */
     memset((void *)htab_raddr, 0, htab_bytes);
 
+    d->arch.htab.order = order;
     d->arch.htab.log_num_ptes = log_htab_bytes - LOG_PTE_SIZE;
     d->arch.htab.sdr1 = htab_calc_sdr1(htab_raddr, log_htab_bytes);
     d->arch.htab.map = (union pte *)htab_raddr;
     d->arch.htab.shadow = xmalloc_array(ulong,
                                         1UL << d->arch.htab.log_num_ptes);
     ASSERT(d->arch.htab.shadow != NULL);
-
-    printf("%s: dom%x sdr1: %lx\n", __func__, d->domain_id, d->arch.htab.sdr1);
 }
 
 void htab_free(struct domain *d)
 {
     ulong htab_raddr = GET_HTAB(d);
 
-    free_xenheap_pages((void *)htab_raddr,
-                       (1UL << d->arch.htab.log_num_ptes) << LOG_PTE_SIZE);
+    free_xenheap_pages((void *)htab_raddr, d->arch.htab.order);
     xfree(d->arch.htab.shadow);
 }
 
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/mm.c
--- a/xen/arch/powerpc/mm.c     Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/mm.c     Tue Aug 15 11:16:46 2006 +0100
@@ -20,6 +20,7 @@
 
 #include <xen/config.h>
 #include <xen/mm.h>
+#include <xen/shadow.h>
 #include <xen/kernel.h>
 #include <xen/sched.h>
 #include <asm/misc.h>
@@ -108,8 +109,8 @@ extern void copy_page(void *dp, void *sp
 
 ulong pfn2mfn(struct domain *d, long pfn, int *type)
 {
-    ulong rma_base_mfn = d->arch.rma_base >> PAGE_SHIFT;
-    ulong rma_size_mfn = d->arch.rma_size >> PAGE_SHIFT;
+    ulong rma_base_mfn = page_to_mfn(d->arch.rma_page);
+    ulong rma_size_mfn = 1UL << d->arch.rma_order;
     ulong mfn;
     int t;
 
@@ -139,3 +140,18 @@ ulong pfn2mfn(struct domain *d, long pfn
 
     return mfn;
 }
+
+void guest_physmap_add_page(
+    struct domain *d, unsigned long gpfn, unsigned long mfn)
+{
+    panic("%s\n", __func__);
+}
+void guest_physmap_remove_page(
+    struct domain *d, unsigned long gpfn, unsigned long mfn)
+{
+    panic("%s\n", __func__);
+}
+void shadow_drop_references(
+    struct domain *d, struct page_info *page)
+{
+}
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/ofd_fixup.c
--- a/xen/arch/powerpc/ofd_fixup.c      Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/ofd_fixup.c      Tue Aug 15 11:16:46 2006 +0100
@@ -359,8 +359,8 @@ static ofdn_t ofd_memory_props(void *m, 
     ofdn_t n = -1;
     ulong start = 0;
     static char name[] = "memory";
-    ulong mem_size = d->arch.rma_size;
-    ulong chunk_size = d->arch.rma_size;
+    ulong mem_size = rma_size(d->arch.rma_order);
+    ulong chunk_size = rma_size(d->arch.rma_order);
 
     /* Remove all old memory props */
     do {
@@ -424,12 +424,12 @@ static ofdn_t ofd_xen_props(void *m, str
         ASSERT(xl < sizeof (xen));
         ofd_prop_add(m, n, "version", xen, xl + 1);
 
-        val[0] = (ulong)si - d->arch.rma_base;
+        val[0] = (ulong)si - page_to_maddr(d->arch.rma_page);
         val[1] = PAGE_SIZE;
         ofd_prop_add(m, n, "start-info", val, sizeof (val));
 
         val[1] =  RMA_LAST_DOM0 * PAGE_SIZE;
-        val[0] =  d->arch.rma_size - val[1];
+        val[0] =  rma_size(d->arch.rma_order) - val[1];
         ofd_prop_add(m, n, "reserved", val, sizeof (val));
 
         n = ofd_node_add(m, n, console, sizeof (console));
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/papr/xlate.c
--- a/xen/arch/powerpc/papr/xlate.c     Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/papr/xlate.c     Tue Aug 15 11:16:46 2006 +0100
@@ -258,8 +258,10 @@ static void h_enter(struct cpu_user_regs
         }
     }
 
+#ifdef DEBUG
     /* If the PTEG is full then no additional values are returned. */
     printk("%s: PTEG FULL\n", __func__);
+#endif
 
     regs->gprs[3] = H_PTEG_Full;
 }
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/powerpc64/ppc970.c
--- a/xen/arch/powerpc/powerpc64/ppc970.c       Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/powerpc64/ppc970.c       Tue Aug 15 11:16:46 2006 +0100
@@ -34,7 +34,8 @@ unsigned int cpu_rma_order(void)
 unsigned int cpu_rma_order(void)
 {
     /* XXX what about non-HV mode? */
-    return 14; /* 1<<14<<PAGE_SIZE = 64M */
+    uint rma_log_size = 6 + 20; /* 64M */
+    return rma_log_size - PAGE_SHIFT;
 }
 
 void cpu_initialize(void)
@@ -114,8 +115,8 @@ void cpu_init_vcpu(struct vcpu *v)
 {
     struct domain *d = v->domain;
     union hid4 hid4;
-    ulong rma_base = d->arch.rma_base;
-    ulong rma_size = d->arch.rma_size;
+    ulong rma_base = page_to_maddr(d->arch.rma_page);
+    ulong rma_size = rma_size(d->arch.rma_order);
 
     hid4.word = mfhid4();
 
diff -r d48842f924d0 -r 5de3bc3c6297 xen/arch/powerpc/setup.c
--- a/xen/arch/powerpc/setup.c  Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/arch/powerpc/setup.c  Tue Aug 15 11:16:46 2006 +0100
@@ -214,7 +214,11 @@ static void __init __start_xen(multiboot
     if ((mbi->flags & MBI_CMDLINE) && (mbi->cmdline != 0))
         cmdline_parse(__va((ulong)mbi->cmdline));
 
+    /* We initialise the serial devices very early so we can get debugging. */
+    ns16550.io_base = 0x3f8;
     ns16550_init(0, &ns16550);
+    ns16550.io_base = 0x2f8;
+    ns16550_init(1, &ns16550);
     serial_init_preirq();
 
     init_console();
@@ -273,11 +277,25 @@ static void __init __start_xen(multiboot
 
     printk("System RAM: %luMB (%lukB)\n", eomem >> 20, eomem >> 10);
 
+    /* top of memory */
     max_page = PFN_DOWN(ALIGN_DOWN(eomem, PAGE_SIZE));
     total_pages = max_page;
 
-    /* skip the exception handlers */
+    /* Architecturally the first 4 pages are exception hendlers, we
+     * will also be copying down some code there */
     heap_start = init_boot_allocator(4 << PAGE_SHIFT);
+
+    /* we give the first RMA to the hypervisor */
+    xenheap_phys_end = rma_size(cpu_rma_order());
+
+    /* allow everything else to be allocated */
+    init_boot_pages(xenheap_phys_end, eomem);
+    init_frametable();
+    end_boot_allocator();
+
+    /* Add memory between the beginning of the heap and the beginning
+     * of out text */
+    init_xenheap_pages(heap_start, (ulong)_start);
 
     /* move the modules to just after _end */
     if (modules_start) {
@@ -293,26 +311,21 @@ static void __init __start_xen(multiboot
                 modules_start + modules_size);
     }
 
+    /* the rest of the xenheap, starting at the end of modules */
+    init_xenheap_pages(freemem, xenheap_phys_end);
+
+
 #ifdef OF_DEBUG
     printk("ofdump:\n");
     /* make sure the OF devtree is good */
     ofd_walk((void *)oftree, OFD_ROOT, ofd_dump_props, OFD_DUMP_ALL);
 #endif
 
+    heap_size = xenheap_phys_end - heap_start;
+
+    printk("Xen heap: %luMB (%lukB)\n", heap_size >> 20, heap_size >> 10);
+
     percpu_init_areas();
-
-    /* mark all memory from modules onward as unused */
-    init_boot_pages(freemem, eomem);
-
-    init_frametable();
-    end_boot_allocator();
-
-    /* place the heap from after the allocator bitmap to _start */
-    xenheap_phys_end = (ulong)_start;
-    init_xenheap_pages(heap_start, xenheap_phys_end);
-    heap_size = xenheap_phys_end - heap_start;
-
-    printk("Xen heap: %luMB (%lukB)\n", heap_size >> 20, heap_size >> 10);
 
     cpu_initialize();
 
diff -r d48842f924d0 -r 5de3bc3c6297 xen/include/asm-powerpc/config.h
--- a/xen/include/asm-powerpc/config.h  Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/include/asm-powerpc/config.h  Tue Aug 15 11:16:46 2006 +0100
@@ -47,6 +47,7 @@ extern char __bss_start[];
 /* this should be per processor, but for now */
 #define CACHE_LINE_SIZE 128
 
+#define CONFIG_SHADOW 1
 #define CONFIG_GDB 1
 #define CONFIG_SMP 1
 #define CONFIG_PCI 1
diff -r d48842f924d0 -r 5de3bc3c6297 xen/include/asm-powerpc/domain.h
--- a/xen/include/asm-powerpc/domain.h  Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/include/asm-powerpc/domain.h  Tue Aug 15 11:16:46 2006 +0100
@@ -32,10 +32,11 @@
 
 struct arch_domain {
     struct domain_htab htab;
-    /* The RMO area is fixed to the domain and is accessible while the
+
+    /* The Real Mode area is fixed to the domain and is accessible while the
      * processor is in real mode */
-    ulong rma_base;
-    ulong rma_size;
+    struct page_info *rma_page;
+    uint rma_order;
 
     /* This is regular memory, only available thru translataion */
     ulong logical_base_pfn;
@@ -106,9 +107,11 @@ extern void load_float(struct vcpu *);
 #define RMA_CONSOLE 3
 #define RMA_LAST_DOMU 3
 
-static inline ulong rma_addr(struct arch_domain *d, int type)
+#define rma_size(rma_order) (1UL << ((rma_order) + PAGE_SHIFT))
+
+static inline ulong rma_addr(struct arch_domain *ad, int type)
 {
-    return d->rma_size - (type * PAGE_SIZE);
+    return rma_size(ad->rma_order) - (type * PAGE_SIZE);
 }
 
 #endif
diff -r d48842f924d0 -r 5de3bc3c6297 xen/include/asm-powerpc/grant_table.h
--- a/xen/include/asm-powerpc/grant_table.h     Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/include/asm-powerpc/grant_table.h     Tue Aug 15 11:16:46 2006 +0100
@@ -47,7 +47,7 @@ int destroy_grant_host_mapping(
 #define gnttab_shared_gmfn(d, t, i)                     \
     (mfn_to_gmfn(d, gnttab_shared_mfn(d, t, i)))
 
-#define gnttab_log_dirty(d, f) ((void )0)
+#define gnttab_log_dirty(d, f) mark_dirty((d), (f))
 
 static inline void gnttab_clear_flag(unsigned long nr, uint16_t *addr)
 {
diff -r d48842f924d0 -r 5de3bc3c6297 xen/include/asm-powerpc/htab.h
--- a/xen/include/asm-powerpc/htab.h    Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/include/asm-powerpc/htab.h    Tue Aug 15 11:16:46 2006 +0100
@@ -25,9 +25,6 @@
 #include <xen/types.h>
 
 /***** general PowerPC architecture limits ******/
-
-#define LOG_DEFAULT_HTAB_BYTES  20
-#define DEFAULT_HTAB_BYTES      (1UL << LOG_HTAB_BYTES)
 
 /* 256KB, from PowerPC Architecture specification */
 #define HTAB_MIN_LOG_SIZE 18
@@ -131,12 +128,13 @@ union ptel {
 
 struct domain_htab {
     ulong sdr1;
-    ulong log_num_ptes; /* log number of PTEs in HTAB. */
+    uint log_num_ptes;  /* log number of PTEs in HTAB. */
+    uint order;         /* order for freeing. */
     union pte *map;     /* access the htab like an array */
     ulong *shadow;      /* idx -> logical translation array */
 };
 
 struct domain;
-extern void htab_alloc(struct domain *d, int log_htab_bytes);
+extern void htab_alloc(struct domain *d, uint order);
 extern void htab_free(struct domain *d);
 #endif
diff -r d48842f924d0 -r 5de3bc3c6297 xen/include/asm-powerpc/mm.h
--- a/xen/include/asm-powerpc/mm.h      Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/include/asm-powerpc/mm.h      Tue Aug 15 11:16:46 2006 +0100
@@ -33,7 +33,7 @@
 #define memguard_unguard_range(_p,_l)    ((void)0)
 
 extern unsigned long xenheap_phys_end;
-#define IS_XEN_HEAP_FRAME(_pfn) (page_to_mfn(_pfn) < xenheap_phys_end)
+#define IS_XEN_HEAP_FRAME(_pfn) (page_to_maddr(_pfn) < xenheap_phys_end)
 
 /*
  * Per-page-frame information.
diff -r d48842f924d0 -r 5de3bc3c6297 xen/include/asm-powerpc/shadow.h
--- a/xen/include/asm-powerpc/shadow.h  Tue Aug 15 11:13:04 2006 +0100
+++ b/xen/include/asm-powerpc/shadow.h  Tue Aug 15 11:16:46 2006 +0100
@@ -23,7 +23,8 @@
 
 #include <xen/sched.h>
 
-#define shadow_mode_translate(_d) 1
+#define shadow_mode_translate(_d) (1)
+#define shadow_mode_refcounts(_d) (1)
 
 #define __translate_gpfn_to_mfn(_d, gpfn)              \
     ( (shadow_mode_translate(_d))                      \
@@ -41,5 +42,17 @@ translate_gpfn_to_mfn(struct domain *rd,
     trap();
     return 0;
 }
+extern void guest_physmap_add_page(
+    struct domain *d, unsigned long gpfn, unsigned long mfn);
 
+extern void guest_physmap_remove_page(
+    struct domain *d, unsigned long gpfn, unsigned long mfn);
+
+extern void shadow_drop_references(
+    struct domain *d, struct page_info *page);
+
+static inline void mark_dirty(struct domain *d, unsigned int mfn)
+{
+    return;
+}
 #endif

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

<Prev in Thread] Current Thread [Next in Thread>