# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID c3a10094bfae99139c96aac904116ea54ecbe069
# Parent f46a34f4dea16dc107404aec8fbabc007506fe65
# Parent d5af6a21a324163b5371ce8733535ebee46156c5
merge
---
tools/libxc/xc_ppc_linux_build.c | 38 +++++++++++++------------------
xen/arch/powerpc/dom0_ops.c | 43 +++++++++++++++++++++++++-----------
xen/arch/powerpc/domain.c | 29 ++++++++++++++++++------
xen/arch/powerpc/powerpc64/ppc970.c | 7 +++++
xen/include/asm-powerpc/processor.h | 1
5 files changed, 75 insertions(+), 43 deletions(-)
diff -r f46a34f4dea1 -r c3a10094bfae tools/libxc/xc_ppc_linux_build.c
--- a/tools/libxc/xc_ppc_linux_build.c Fri Aug 04 17:25:29 2006 -0400
+++ b/tools/libxc/xc_ppc_linux_build.c Fri Aug 04 17:26:27 2006 -0400
@@ -37,11 +37,6 @@
#define MEMSIZE (64UL << 20)
#define INITRD_ADDR (24UL << 20)
-int verbose;
-#define VERBOSE(stuff, ...) \
- if (verbose) \
- stuff __VA_ARGS__;
-
#define ALIGN_UP(addr,size) (((addr)+((size)-1))&(~((size)-1)))
#define max(x,y) ({ \
@@ -56,7 +51,7 @@ static void *load_file(const char *path,
ssize_t size;
int fd;
- VERBOSE(printf("load_file(%s)\n", path));
+ DPRINTF("load_file(%s)\n", path);
fd = open(path, O_RDONLY);
if (fd < 0) {
@@ -114,7 +109,7 @@ static int init_boot_vcpu(
* we must make sure this register is 0 */
ctxt.user_regs.gprs[13] = 0;
- VERBOSE(printf("xc_vcpu_setvcpucontext:\n"
+ DPRINTF("xc_vcpu_setvcpucontext:\n"
" pc 0x%"PRIx64", msr 0x016%"PRIx64"\n"
" r1-5 %016"PRIx64" %016"PRIx64" %016"PRIx64" %016"PRIx64
" %016"PRIx64"\n",
@@ -123,7 +118,7 @@ static int init_boot_vcpu(
ctxt.user_regs.gprs[2],
ctxt.user_regs.gprs[3],
ctxt.user_regs.gprs[4],
- ctxt.user_regs.gprs[5]));
+ ctxt.user_regs.gprs[5]);
rc = xc_vcpu_setcontext(xc_handle, domid, 0, &ctxt);
if (rc < 0)
perror("setdomaininfo");
@@ -181,8 +176,7 @@ static int load_dtb(
goto out;
}
- VERBOSE(printf("copying device tree to 0x%lx[0x%lx]\n",
- dtb_addr, dtb_size));
+ DPRINTF("copying device tree to 0x%lx[0x%lx]\n", dtb_addr, dtb_size);
rc = install_image(xc_handle, domid, page_array, img, dtb_addr, dtb_size);
out:
@@ -241,7 +235,7 @@ static int load_kernel(
hack_kernel_img(kernel_img);
- VERBOSE(printf("probe_elf\n"));
+ DPRINTF("probe_elf\n");
rc = probe_elf(kernel_img, kernel_size, &load_funcs);
if (rc < 0) {
rc = -1;
@@ -249,22 +243,22 @@ static int load_kernel(
goto out;
}
- VERBOSE(printf("parseimage\n"));
+ DPRINTF("parseimage\n");
rc = (load_funcs.parseimage)(kernel_img, kernel_size, dsi);
if (rc < 0) {
rc = -1;
goto out;
}
- VERBOSE(printf("loadimage\n"));
+ DPRINTF("loadimage\n");
(load_funcs.loadimage)(kernel_img, kernel_size, xc_handle, domid,
page_array, dsi);
- VERBOSE(printf(" v_start %016"PRIx64"\n", dsi->v_start));
- VERBOSE(printf(" v_end %016"PRIx64"\n", dsi->v_end));
- VERBOSE(printf(" v_kernstart %016"PRIx64"\n", dsi->v_kernstart));
- VERBOSE(printf(" v_kernend %016"PRIx64"\n", dsi->v_kernend));
- VERBOSE(printf(" v_kernentry %016"PRIx64"\n", dsi->v_kernentry));
+ DPRINTF(" v_start %016"PRIx64"\n", dsi->v_start);
+ DPRINTF(" v_end %016"PRIx64"\n", dsi->v_end);
+ DPRINTF(" v_kernstart %016"PRIx64"\n", dsi->v_kernstart);
+ DPRINTF(" v_kernend %016"PRIx64"\n", dsi->v_kernend);
+ DPRINTF(" v_kernentry %016"PRIx64"\n", dsi->v_kernentry);
out:
free(kernel_img);
@@ -287,7 +281,7 @@ static int load_initrd(
if (initrd_img == NULL)
return -1;
- VERBOSE(printf("copying initrd to 0x%lx[0x%lx]\n", INITRD_ADDR, *len));
+ DPRINTF("copying initrd to 0x%lx[0x%lx]\n", INITRD_ADDR, *len);
if (install_image(xc_handle, domid, page_array, initrd_img, INITRD_ADDR,
*len))
goto out;
@@ -326,9 +320,9 @@ static int get_page_array(int xc_handle,
int nr_pages;
int rc;
- VERBOSE(printf("xc_get_tot_pages\n"));
+ DPRINTF("xc_get_tot_pages\n");
nr_pages = xc_get_tot_pages(xc_handle, domid);
- VERBOSE(printf(" 0x%x\n", nr_pages));
+ DPRINTF(" 0x%x\n", nr_pages);
*page_array = malloc(nr_pages * sizeof(xen_pfn_t));
if (*page_array == NULL) {
@@ -336,7 +330,7 @@ static int get_page_array(int xc_handle,
return -1;
}
- VERBOSE(printf("xc_get_pfn_list\n"));
+ DPRINTF("xc_get_pfn_list\n");
rc = xc_get_pfn_list(xc_handle, domid, *page_array, nr_pages);
if (rc != nr_pages) {
perror("Could not get the page frame list");
diff -r f46a34f4dea1 -r c3a10094bfae xen/arch/powerpc/dom0_ops.c
--- a/xen/arch/powerpc/dom0_ops.c Fri Aug 04 17:25:29 2006 -0400
+++ b/xen/arch/powerpc/dom0_ops.c Fri Aug 04 17:26:27 2006 -0400
@@ -40,23 +40,40 @@ long arch_do_dom0_op(struct dom0_op *op,
long ret = 0;
switch (op->cmd) {
- case DOM0_GETMEMLIST: {
- /* XXX 64M hackage */
- const int memsize = (64UL<<20);
- int domain_pfns = memsize>>12;
- int max_pfns = op->u.getmemlist.max_pfns;
- int domid = op->u.getmemlist.domain;
+ case DOM0_GETMEMLIST:
+ {
int i;
+ struct domain *d = find_domain_by_id(op->u.getmemlist.domain);
+ unsigned long max_pfns = op->u.getmemlist.max_pfns;
+ xen_pfn_t mfn;
+ struct list_head *list_ent;
- for (i = 0; (i < max_pfns) && (i < domain_pfns); i++) {
- xen_pfn_t mfn = (((domid + 1) * memsize) >> 12) + i;
- if (copy_to_guest_offset(op->u.getmemlist.buffer, i, &mfn, 1)) {
- ret = -EFAULT;
- break;
+ ret = -EINVAL;
+ if ( d != NULL )
+ {
+ ret = 0;
+
+ spin_lock(&d->page_alloc_lock);
+ list_ent = d->page_list.next;
+ for ( i = 0; (i < max_pfns) && (list_ent != &d->page_list); i++ )
+ {
+ mfn = page_to_mfn(list_entry(
+ list_ent, struct page_info, list));
+ if ( copy_to_guest_offset(op->u.getmemlist.buffer,
+ i, &mfn, 1) )
+ {
+ ret = -EFAULT;
+ break;
+ }
+ list_ent = mfn_to_page(mfn)->list.next;
}
+ spin_unlock(&d->page_alloc_lock);
+
+ op->u.getmemlist.num_pfns = i;
+ copy_to_guest(u_dom0_op, op, 1);
+
+ put_domain(d);
}
- op->u.getmemlist.num_pfns = i;
- copy_to_guest(u_dom0_op, op, 1);
}
break;
diff -r f46a34f4dea1 -r c3a10094bfae xen/arch/powerpc/domain.c
--- a/xen/arch/powerpc/domain.c Fri Aug 04 17:25:29 2006 -0400
+++ b/xen/arch/powerpc/domain.c Fri Aug 04 17:26:27 2006 -0400
@@ -73,6 +73,10 @@ 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;
if (d->domain_id == IDLE_DOMAIN_ID) {
d->shared_info = (void *)alloc_xenheap_page();
@@ -81,17 +85,28 @@ int arch_domain_create(struct domain *d)
return 0;
}
- /* XXX the hackage... hardcode 64M domains */
- d->arch.rma_base = (64<<20) * (d->domain_id + 1);
- d->arch.rma_size = (64<<20);
-
- printk("clearing RMO: 0x%lx[0x%lx]\n", d->arch.rma_base, d->arch.rma_size);
- memset((void*)d->arch.rma_base, 0, d->arch.rma_size);
+ rma_order = cpu_rma_order();
+ rma_size = 1UL << rma_order << PAGE_SHIFT;
+
+ /* allocate the real mode area */
+ d->max_pages = 1UL << rma_order;
+ rma = alloc_domheap_pages(d, rma_order, 0);
+ if (NULL == rma)
+ 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);
d->shared_info = (shared_info_t *)
- (rma_addr(&d->arch, RMA_SHARED_INFO) + d->arch.rma_base);
+ (rma_addr(&d->arch, RMA_SHARED_INFO) + rma_base);
d->arch.large_page_sizes = 1;
d->arch.large_page_shift[0] = 24; /* 16 M for 970s */
diff -r f46a34f4dea1 -r c3a10094bfae xen/arch/powerpc/powerpc64/ppc970.c
--- a/xen/arch/powerpc/powerpc64/ppc970.c Fri Aug 04 17:25:29 2006 -0400
+++ b/xen/arch/powerpc/powerpc64/ppc970.c Fri Aug 04 17:26:27 2006 -0400
@@ -30,6 +30,12 @@
#include <asm/powerpc64/ppc970-hid.h>
#undef SERIALIZE
+
+unsigned int cpu_rma_order(void)
+{
+ /* XXX what about non-HV mode? */
+ return 14; /* 1<<14<<PAGE_SIZE = 64M */
+}
void cpu_initialize(void)
{
@@ -102,7 +108,6 @@ void cpu_initialize(void)
mthid5(hid5.word);
__asm__ __volatile__("isync; slbia; isync" : : : "memory");
-
}
void cpu_init_vcpu(struct vcpu *v)
diff -r f46a34f4dea1 -r c3a10094bfae xen/include/asm-powerpc/processor.h
--- a/xen/include/asm-powerpc/processor.h Fri Aug 04 17:25:29 2006 -0400
+++ b/xen/include/asm-powerpc/processor.h Fri Aug 04 17:26:27 2006 -0400
@@ -39,6 +39,7 @@ struct cpu_user_regs;
struct cpu_user_regs;
extern void show_registers(struct cpu_user_regs *);
extern void show_execution_state(struct cpu_user_regs *);
+extern unsigned int cpu_rma_order(void);
extern void cpu_initialize(void);
extern void cpu_init_vcpu(struct vcpu *);
extern void save_cpu_sprs(struct vcpu *);
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|