Hi,
this a just for review and comments. The purpose is not to use
DOM0_SETVPUCONTEXT to initialiaze a domain.
This is the first step for save&restore.
[This patch also contains warning cleanup, it will be separated of course].
Tristan.
diff -r 303e1b6bf727 linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c Sun May 21
07:49:46 2006 -0600
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c Tue May 23
14:44:22 2006 +0200
@@ -25,7 +25,6 @@ int xen_init(void)
return -1;
xen_start_info = __va(s->arch.start_info_pfn << PAGE_SHIFT);
- xen_start_info->flags = s->arch.flags;
printk("Running on Xen! start_info_pfn=0x%lx nr_pages=%ld flags=0x%x\n",
s->arch.start_info_pfn, xen_start_info->nr_pages,
xen_start_info->flags);
diff -r 303e1b6bf727 tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c Sun May 21 07:49:46 2006 -0600
+++ b/tools/libxc/xc_linux_build.c Tue May 23 14:44:22 2006 +0200
@@ -2,6 +2,7 @@
* xc_linux_build.c
*/
+#include <stddef.h>
#include "xg_private.h"
#include "xc_private.h"
#include <xenctrl.h>
@@ -471,6 +472,9 @@ static int setup_guest(int xc_handle,
unsigned long v_end;
unsigned long start_page, pgnr;
start_info_t *start_info;
+ unsigned long start_info_mpa;
+ struct ia64_boot_param *bp;
+ DECLARE_DOM0_OP;
int rc;
rc = probeimageformat(image, image_size, &load_funcs);
@@ -536,10 +540,11 @@ static int setup_guest(int xc_handle,
*store_mfn = page_array[1];
*console_mfn = page_array[2];
+ start_info_mpa = (nr_pages - 3) << PAGE_SHIFT;
printf("start_info: 0x%lx at 0x%lx, "
"store_mfn: 0x%lx at 0x%lx, "
"console_mfn: 0x%lx at 0x%lx\n",
- page_array[0], nr_pages,
+ page_array[0], nr_pages - 3,
*store_mfn, nr_pages - 2,
*console_mfn, nr_pages - 1);
@@ -554,21 +559,31 @@ static int setup_guest(int xc_handle,
start_info->console_mfn = nr_pages - 1;
start_info->console_evtchn = console_evtchn;
start_info->nr_pages = nr_pages; // FIXME?: nr_pages - 2 ????
+
+ /* Build firmware. */
+ op.u.firmware_setup.domain = (domid_t)dom;
+ op.u.firmware_setup.bp = start_info_mpa + sizeof (start_info_t);
+ op.u.firmware_setup.hypercall_imm = 0x1000;
+ op.u.firmware_setup.sys_pgnr = 3;
+ op.u.firmware_setup.start_info_pfn = nr_pages - 3; /* metaphysical */
+
+ op.cmd = DOM0_FIRMWARE_SETUP;
+ if ( xc_dom0_op(xc_handle, &op) )
+ goto error_out;
+ bp = (struct ia64_boot_param *)(start_info + 1);
+ bp->command_line = start_info_mpa + offsetof(start_info_t, cmd_line);
+ if ( cmdline != NULL )
+ {
+ strncpy((char *)start_info->cmd_line, cmdline, MAX_GUEST_CMDLINE);
+ start_info->cmd_line[MAX_GUEST_CMDLINE - 1] = 0;
+ printf ("cmd_line=%s\n", cmdline);
+ }
if ( initrd->len != 0 )
{
- ctxt->initrd.start = vinitrd_start;
- ctxt->initrd.size = initrd->len;
- }
- else
- {
- ctxt->initrd.start = 0;
- ctxt->initrd.size = 0;
- }
- if ( cmdline != NULL )
- {
- strncpy((char *)ctxt->cmdline, cmdline, IA64_COMMAND_LINE_SIZE);
- ctxt->cmdline[IA64_COMMAND_LINE_SIZE-1] = '\0';
- }
+ bp->initrd_start = vinitrd_start;
+ bp->initrd_size = initrd->len;
+ }
+ ctxt->regs.r28 = start_info_mpa + sizeof (start_info_t);
munmap(start_info, PAGE_SIZE);
free(page_array);
@@ -1106,8 +1121,6 @@ static int xc_linux_build_internal(int x
#ifdef __ia64__
/* based on new_thread in xen/arch/ia64/domain.c */
ctxt->flags = 0;
- ctxt->shared.flags = flags;
- ctxt->shared.start_info_pfn = nr_pages - 3; /* metaphysical */
ctxt->regs.cr_ipsr = 0; /* all necessary bits filled by hypervisor */
ctxt->regs.cr_iip = vkern_entry;
ctxt->regs.cr_ifs = 1UL << 63;
@@ -1115,7 +1128,6 @@ static int xc_linux_build_internal(int x
/* currently done by hypervisor, should move here */
/* ctxt->regs.r28 = dom_fw_setup(); */
ctxt->privregs = 0;
- ctxt->sys_pgnr = 3;
i = 0; /* silence unused variable warning */
#else /* x86 */
/*
diff -r 303e1b6bf727 xen/arch/ia64/Rules.mk
--- a/xen/arch/ia64/Rules.mk Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/Rules.mk Tue May 23 14:44:22 2006 +0200
@@ -40,7 +40,7 @@ CFLAGS += -DCONFIG_XEN_IA64_DOM0_VP
CFLAGS += -DCONFIG_XEN_IA64_DOM0_VP
endif
ifeq ($(no_warns),y)
-CFLAGS += -Wa,--fatal-warnings
+CFLAGS += -Wa,--fatal-warnings -Werror -Wno-uninitialized
endif
LDFLAGS := -g
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/iosapic.c
--- a/xen/arch/ia64/linux-xen/iosapic.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/iosapic.c Tue May 23 14:44:22 2006 +0200
@@ -1112,12 +1112,14 @@ map_iosapic_to_node(unsigned int gsi_bas
}
#endif
+#ifndef XEN
static int __init iosapic_enable_kmalloc (void)
{
iosapic_kmalloc_ok = 1;
return 0;
}
core_initcall (iosapic_enable_kmalloc);
+#endif
#ifdef XEN
/* nop for now */
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/irq_ia64.c
--- a/xen/arch/ia64/linux-xen/irq_ia64.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/irq_ia64.c Tue May 23 14:44:22 2006 +0200
@@ -225,7 +225,7 @@ extern irqreturn_t handle_IPI (int irq,
extern irqreturn_t handle_IPI (int irq, void *dev_id, struct pt_regs *regs);
static struct irqaction ipi_irqaction = {
- .handler = handle_IPI,
+ .handler = (void (*)(int,void*,struct cpu_user_regs*))handle_IPI,
#ifndef XEN
.flags = SA_INTERRUPT,
#endif
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/sal.c
--- a/xen/arch/ia64/linux-xen/sal.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/sal.c Tue May 23 14:44:22 2006 +0200
@@ -229,7 +229,7 @@ ia64_sal_init (struct ia64_sal_systab *s
return;
}
- if (strncmp(systab->signature, "SST_", 4) != 0)
+ if (strncmp((char*)systab->signature, "SST_", 4) != 0)
printk(KERN_ERR "bad signature in system table!");
check_versions(systab);
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/smpboot.c
--- a/xen/arch/ia64/linux-xen/smpboot.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/smpboot.c Tue May 23 14:44:22 2006 +0200
@@ -197,7 +197,7 @@ sync_master (void *arg)
* negative that it is behind.
*/
static inline long
-get_delta (long *rt, long *master)
+get_delta (unsigned long *rt, unsigned long *master)
{
unsigned long best_t0 = 0, best_t1 = ~0UL, best_tm = 0;
unsigned long tcenter, t0, t1, tm;
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/time.c
--- a/xen/arch/ia64/linux-xen/time.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/time.c Tue May 23 14:44:22 2006 +0200
@@ -158,7 +158,7 @@ ia64_init_itm (void)
{
unsigned long platform_base_freq, itc_freq;
struct pal_freq_ratio itc_ratio, proc_ratio;
- long status, platform_base_drift, itc_drift;
+ unsigned long status, platform_base_drift, itc_drift;
/*
* According to SAL v2.6, we need to use a SAL call to determine the
platform base
@@ -197,7 +197,7 @@ ia64_init_itm (void)
itc_freq = (platform_base_freq*itc_ratio.num)/itc_ratio.den;
local_cpu_data->itm_delta = (itc_freq + HZ/2) / HZ;
- printk(KERN_DEBUG "CPU %d: base freq=%lu.%03luMHz, ITC ratio=%lu/%lu, "
+ printk(KERN_DEBUG "CPU %d: base freq=%lu.%03luMHz, ITC ratio=%u/%u, "
"ITC freq=%lu.%03luMHz", smp_processor_id(),
platform_base_freq / 1000000, (platform_base_freq / 1000) % 1000,
itc_ratio.num, itc_ratio.den, itc_freq / 1000000, (itc_freq /
1000) % 1000);
diff -r 303e1b6bf727 xen/arch/ia64/vmx/pal_emul.c
--- a/xen/arch/ia64/vmx/pal_emul.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/vmx/pal_emul.c Tue May 23 14:44:22 2006 +0200
@@ -196,6 +196,10 @@ pal_debug_info(VCPU *vcpu){
static struct ia64_pal_retval
pal_fixed_addr(VCPU *vcpu){
+ struct ia64_pal_retval result;
+
+ result.status= -1; //unimplemented
+ return result;
}
static struct ia64_pal_retval
diff -r 303e1b6bf727 xen/arch/ia64/vmx/vmx_hypercall.c
--- a/xen/arch/ia64/vmx/vmx_hypercall.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c Tue May 23 14:44:22 2006 +0200
@@ -36,7 +36,6 @@
#include <xen/domain.h>
extern long do_sched_op_compat(int cmd, unsigned long arg);
-extern unsigned long domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
void hyper_not_support(void)
{
diff -r 303e1b6bf727 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c Tue May 23 14:44:22 2006 +0200
@@ -338,7 +338,7 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
}
if(vec == 1) type = ISIDE_TLB;
else if(vec == 2) type = DSIDE_TLB;
- else panic_domain(regs,"wrong vec:%0xlx\n",vec);
+ else panic_domain(regs,"wrong vec:0x%lx\n",vec);
// prepare_if_physical_mode(v);
diff -r 303e1b6bf727 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/xen/dom0_ops.c Tue May 23 14:44:22 2006 +0200
@@ -19,6 +19,10 @@
#include <xen/guest_access.h>
#include <public/sched_ctl.h>
#include <asm/vmx.h>
+#include <asm/dom_fw.h>
+
+void build_physmap_table(struct domain *d);
+
extern unsigned long total_pages;
long arch_do_dom0_op(dom0_op_t *op, XEN_GUEST_HANDLE(dom0_op_t) u_dom0_op)
{
@@ -225,6 +229,25 @@ long arch_do_dom0_op(dom0_op_t *op, XEN_
}
break;
+ case DOM0_FIRMWARE_SETUP:
+ {
+ dom0_firmware_setup_t *fs = &op->u.firmware_setup;
+ struct domain *d = find_domain_by_id(op->u.getmemlist.domain);
+
+ if ( d == NULL) {
+ ret = -EINVAL;
+ break;
+ }
+ if (!d->arch.physmap_built)
+ build_physmap_table(d);
+ d->arch.breakimm = fs->hypercall_imm;
+ d->arch.sys_pgnr = fs->sys_pgnr;
+ d->shared_info->arch.start_info_pfn = fs->start_info_pfn;
+ dom_fw_setup (d, fs->bp);
+ printf ("dom_firmware_setup: bp=%lx\n", fs->bp);
+ }
+ break;
+
default:
printf("arch_do_dom0_op: unrecognized dom0 op: %d!!!\n",op->cmd);
ret = -ENOSYS;
diff -r 303e1b6bf727 xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/xen/dom_fw.c Tue May 23 14:44:22 2006 +0200
@@ -21,16 +21,15 @@
#include <asm/dom_fw.h>
#include <public/sched.h>
-static struct ia64_boot_param *dom_fw_init(struct domain *, const char
*,int,char *,int);
-extern unsigned long domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
+static void dom_fw_init(struct domain *, struct ia64_boot_param *,char *,int);
extern struct domain *dom0;
extern unsigned long dom0_start;
extern unsigned long running_on_sim;
-unsigned long dom_fw_base_mpa = -1;
-unsigned long imva_fw_base = -1;
+static unsigned long dom_fw_base_mpa = -1;
+static unsigned long imva_fw_base = -1;
// return domain (meta)physical address for a given imva
// this function is a call-back from dom_fw_init
@@ -92,22 +91,20 @@ static void dom_fw_pal_hypercall_patch(s
build_pal_hypercall_bundles(imva, d->arch.breakimm,
FW_HYPERCALL_PAL_CALL);
}
-
-// FIXME: This is really a hack: Forcing the boot parameter block
-// at domain mpaddr 0 page, then grabbing only the low bits of the
-// Xen imva, which is the offset into the page
-unsigned long dom_fw_setup(struct domain *d, const char *args, int arglen)
+void dom_fw_setup(struct domain *d, unsigned long bp_mpa)
{
struct ia64_boot_param *bp;
dom_fw_base_mpa = 0;
#ifndef CONFIG_XEN_IA64_DOM0_VP
if (d == dom0) dom_fw_base_mpa += dom0_start;
+ if (d == dom0) bp_mpa += dom0_start;
#endif
ASSIGN_NEW_DOMAIN_PAGE_IF_DOM0(d, dom_fw_base_mpa);
- imva_fw_base = domain_mpa_to_imva(d, dom_fw_base_mpa);
- bp = dom_fw_init(d, args, arglen, (char *) imva_fw_base, PAGE_SIZE);
- return dom_pa((unsigned long) bp);
+ imva_fw_base = (unsigned long) domain_mpa_to_imva(d, dom_fw_base_mpa);
+ ASSIGN_NEW_DOMAIN_PAGE_IF_DOM0(d, bp_mpa);
+ bp = domain_mpa_to_imva(d, bp_mpa);
+ dom_fw_init(d, bp, (char *) imva_fw_base, PAGE_SIZE);
}
@@ -762,8 +759,8 @@ efi_mdt_cmp(const void *a, const void *b
return 0;
}
-static struct ia64_boot_param *
-dom_fw_init (struct domain *d, const char *args, int arglen, char *fw_mem, int
fw_mem_size)
+static void
+dom_fw_init (struct domain *d, struct ia64_boot_param *bp, char *fw_mem, int
fw_mem_size)
{
efi_system_table_t *efi_systab;
efi_runtime_services_t *efi_runtime;
@@ -772,10 +769,9 @@ dom_fw_init (struct domain *d, const cha
struct ia64_sal_desc_entry_point *sal_ed;
struct ia64_sal_desc_ap_wakeup *sal_wakeup;
efi_memory_desc_t *efi_memmap, *md;
- struct ia64_boot_param *bp;
unsigned long *pfn;
unsigned char checksum = 0;
- char *cp, *cmd_line, *fw_vendor;
+ char *cp, *fw_vendor;
int i = 0;
unsigned long maxmem = (d->max_pages - d->arch.sys_pgnr) * PAGE_SIZE;
#ifdef CONFIG_XEN_IA64_DOM0_VP
@@ -813,27 +809,16 @@ dom_fw_init (struct domain *d, const cha
sal_ed = (void *) cp; cp += sizeof(*sal_ed);
sal_wakeup = (void *) cp; cp += sizeof(*sal_wakeup);
efi_memmap = (void *) cp; cp += NUM_MEM_DESCS*sizeof(*efi_memmap);
- bp = (void *) cp; cp += sizeof(*bp);
pfn = (void *) cp; cp += NFUNCPTRS * 2 * sizeof(pfn);
- cmd_line = (void *) cp;
/* Initialise for EFI_SET_VIRTUAL_ADDRESS_MAP emulation */
d->arch.efi_runtime = efi_runtime;
-
- if (args) {
- if (arglen >= 1024)
- arglen = 1023;
- memcpy(cmd_line, args, arglen);
- } else {
- arglen = 0;
- }
- cmd_line[arglen] = '\0';
memset(efi_systab, 0, sizeof(efi_systab));
efi_systab->hdr.signature = EFI_SYSTEM_TABLE_SIGNATURE;
efi_systab->hdr.revision = EFI_SYSTEM_TABLE_REVISION;
efi_systab->hdr.headersize = sizeof(efi_systab->hdr);
- cp = fw_vendor = &cmd_line[arglen] + (2-(arglen&1)); // round to 16-bit
boundary
+ fw_vendor = cp;
#define FW_VENDOR
"X\0e\0n\0/\0i\0a\0\066\0\064\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
cp += sizeof(FW_VENDOR) + (8-((unsigned long)cp & 7)); // round to
64-bit boundary
@@ -1032,12 +1017,13 @@ dom_fw_init (struct domain *d, const cha
bp->efi_memmap_size = i * sizeof(efi_memory_desc_t);
bp->efi_memdesc_size = sizeof(efi_memory_desc_t);
bp->efi_memdesc_version = EFI_MEMDESC_VERSION;
- bp->command_line = dom_pa((unsigned long) cmd_line);
+ bp->command_line = 0; // dom_pa((unsigned long) cmd_line);
bp->console_info.num_cols = 80;
bp->console_info.num_rows = 25;
bp->console_info.orig_x = 0;
bp->console_info.orig_y = 24;
bp->fpswa = 0;
+#if 0
if (d == dom0) {
// XXX CONFIG_XEN_IA64_DOM0_VP
// initrd_start address is hard coded in start_kernel()
@@ -1051,5 +1037,5 @@ dom_fw_init (struct domain *d, const cha
}
printf(" initrd start 0x%lx", bp->initrd_start);
printf(" initrd size 0x%lx\n", bp->initrd_size);
- return bp;
-}
+#endif
+}
diff -r 303e1b6bf727 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/xen/domain.c Tue May 23 14:44:22 2006 +0200
@@ -61,6 +61,8 @@ unsigned long dom0_size = 512*1024*1024;
unsigned long dom0_size = 512*1024*1024;
unsigned long dom0_align = 64*1024*1024;
+extern char dom0_command_line[];
+
/* dom0_max_vcpus: maximum number of VCPUs to create for dom0. */
static unsigned int dom0_max_vcpus = 1;
integer_param("dom0_max_vcpus", dom0_max_vcpus);
@@ -260,7 +262,9 @@ void arch_getdomaininfo_ctxt(struct vcpu
void arch_getdomaininfo_ctxt(struct vcpu *v, struct vcpu_guest_context *c)
{
c->regs = *vcpu_regs (v);
+#if 0
c->shared = v->domain->shared_info->arch;
+#endif
}
int arch_set_info_guest(struct vcpu *v, struct vcpu_guest_context *c)
@@ -284,6 +288,7 @@ int arch_set_info_guest(struct vcpu *v,
build_physmap_table(d);
*regs = c->regs;
+#if 0
if (v == d->vcpu[0]) {
/* Only for first vcpu. */
d->arch.sys_pgnr = c->sys_pgnr;
@@ -296,6 +301,7 @@ int arch_set_info_guest(struct vcpu *v,
during mmap/unmap operation. However be conservative. */
domain_cache_flush (d, 1);
}
+#endif
new_thread(v, regs->cr_iip, 0, 0);
if ( c->privregs && copy_from_user(v->arch.privregs,
@@ -499,12 +505,13 @@ void new_thread(struct vcpu *v,
unsigned long start_stack,
unsigned long start_info)
{
+#if 0
struct domain *d = v->domain;
+#endif
struct pt_regs *regs;
- extern char dom0_command_line[];
#ifdef CONFIG_DOMAIN0_CONTIGUOUS
- if (d == dom0 && v->vcpu_id == 0) start_pc += dom0_start;
+ if (v->domain == dom0 && v->vcpu_id == 0) start_pc += dom0_start;
#endif
regs = vcpu_regs (v);
@@ -524,14 +531,17 @@ void new_thread(struct vcpu *v,
if (VMX_DOMAIN(v)) {
vmx_init_all_rr(v);
+#if 0
if (d == dom0)
regs->r28 = dom_fw_setup(d,dom0_command_line,
COMMAND_LINE_SIZE);
+#endif
/* Virtual processor context setup */
VCPU(v, vpsr) = IA64_PSR_BN;
VCPU(v, dcr) = 0;
} else {
init_all_rr(v);
+#if 0
if (v->vcpu_id == 0) {
/* Build the firmware. */
if (d == dom0)
@@ -553,9 +563,8 @@ void new_thread(struct vcpu *v,
regs->r28 = dom_fw_setup (d, cmdline, len);
}
- d->shared_info->arch.flags = (d == dom0) ?
- (SIF_INITDOMAIN|SIF_PRIVILEGED) : 0;
}
+#endif
regs->ar_rsc |= (2 << 2); /* force PL2/3 */
VCPU(v, banknum) = 1;
VCPU(v, metaphysical_mode) = 1;
@@ -1421,7 +1430,7 @@ void domain_cache_flush (struct domain *
// FIXME: ONLY USE FOR DOMAIN PAGE_SIZE == PAGE_SIZE
#if 1
-unsigned long domain_mpa_to_imva(struct domain *d, unsigned long mpaddr)
+void * domain_mpa_to_imva(struct domain *d, unsigned long mpaddr)
{
unsigned long pte = lookup_domain_mpa(d,mpaddr);
unsigned long imva;
@@ -1429,10 +1438,10 @@ unsigned long domain_mpa_to_imva(struct
pte &= _PAGE_PPN_MASK;
imva = (unsigned long) __va(pte);
imva |= mpaddr & ~PAGE_MASK;
- return(imva);
+ return (void*)imva;
}
#else
-unsigned long domain_mpa_to_imva(struct domain *d, unsigned long mpaddr)
+void *domain_mpa_to_imva(struct domain *d, unsigned long mpaddr)
{
unsigned long imva = __gpa_to_mpa(d, mpaddr);
@@ -1615,6 +1624,8 @@ int construct_dom0(struct domain *d,
unsigned long pkern_end;
unsigned long pinitrd_start = 0;
unsigned long pstart_info;
+ unsigned long bp_mpa;
+ struct ia64_boot_param *bp;
struct page_info *start_info_page;
#ifdef VALIDATE_VT
@@ -1774,6 +1785,8 @@ int construct_dom0(struct domain *d,
memset(si, 0, PAGE_SIZE);
sprintf(si->magic, "xen-%i.%i-ia64", XEN_VERSION, XEN_SUBVERSION);
si->nr_pages = max_pages;
+ si->flags = SIF_INITDOMAIN|SIF_PRIVILEGED;
+ d->shared_info->arch.flags = si->flags;
/* Give up the VGA console if DOM0 is configured to grab it. */
if (cmdline != NULL)
@@ -1788,7 +1801,26 @@ int construct_dom0(struct domain *d,
set_bit(_VCPUF_initialised, &v->vcpu_flags);
+ /* Build firmware. */
+ bp_mpa = pstart_info + sizeof (struct start_info);
+ dom_fw_setup (d, bp_mpa);
+
+ /* Fill boot param. */
+ strncpy ((char *)si->cmd_line,
+ dom0_command_line, sizeof (si->cmd_line));
+ si->cmd_line[sizeof(si->cmd_line)-1] = 0;
+
+ bp = (struct ia64_boot_param *)(si + 1);
+ bp->command_line = pstart_info + offsetof (start_info_t, cmd_line);
+
+ bp->initrd_start = (dom0_start+dom0_size) -
+ (PAGE_ALIGN(ia64_boot_param->initrd_size) + 4*1024*1024);
+ bp->initrd_size = ia64_boot_param->initrd_size;
+
new_thread(v, pkern_entry, 0, 0);
+
+ vcpu_regs(v)->r28 = bp_mpa;
+
physdev_init_dom0(d);
// dom0 doesn't need build_physmap_table()
diff -r 303e1b6bf727 xen/arch/ia64/xen/efi_emul.c
--- a/xen/arch/ia64/xen/efi_emul.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/xen/efi_emul.c Tue May 23 14:44:22 2006 +0200
@@ -24,7 +24,6 @@
#include <public/sched.h>
extern unsigned long translate_domain_mpaddr(unsigned long);
-extern unsigned long domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
// given a current domain (virtual or metaphysical) address, return the
virtual address
static unsigned long
diff -r 303e1b6bf727 xen/include/asm-ia64/dom_fw.h
--- a/xen/include/asm-ia64/dom_fw.h Sun May 21 07:49:46 2006 -0600
+++ b/xen/include/asm-ia64/dom_fw.h Tue May 23 14:44:22 2006 +0200
@@ -142,7 +142,7 @@ extern struct ia64_pal_retval xen_pal_em
extern struct ia64_pal_retval xen_pal_emulator(UINT64, u64, u64, u64);
extern struct sal_ret_values sal_emulator (long index, unsigned long in1,
unsigned long in2, unsigned long in3, unsigned long in4, unsigned long in5,
unsigned long in6, unsigned long in7);
extern struct ia64_pal_retval pal_emulator_static (unsigned long);
-extern unsigned long dom_fw_setup (struct domain *, const char *, int);
+extern void dom_fw_setup (struct domain *, unsigned long bp_mpa);
extern efi_status_t efi_emulator (struct pt_regs *regs, unsigned long *fault);
extern void build_pal_hypercall_bundles(unsigned long *imva, unsigned long
brkimm, unsigned long hypnum);
diff -r 303e1b6bf727 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h Sun May 21 07:49:46 2006 -0600
+++ b/xen/include/asm-ia64/domain.h Tue May 23 14:44:22 2006 +0200
@@ -115,6 +115,9 @@ void __assign_domain_page(struct domain
void __assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned
long physaddr);
void assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned long
physaddr);
void assign_domain_io_page(struct domain *d, unsigned long mpaddr, unsigned
long flags);
+
+extern void *domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
+
#ifdef CONFIG_XEN_IA64_DOM0_VP
unsigned long assign_domain_mmio_page(struct domain *d, unsigned long mpaddr,
unsigned long size);
unsigned long assign_domain_mach_page(struct domain *d, unsigned long mpaddr,
unsigned long size);
diff -r 303e1b6bf727 xen/include/asm-ia64/linux-xen/asm/system.h
--- a/xen/include/asm-ia64/linux-xen/asm/system.h Sun May 21 07:49:46
2006 -0600
+++ b/xen/include/asm-ia64/linux-xen/asm/system.h Tue May 23 14:44:22
2006 +0200
@@ -42,6 +42,7 @@ struct pci_vector_struct {
__u32 irq; /* IRQ assigned */
};
+#ifndef XEN
extern struct ia64_boot_param {
__u64 command_line; /* physical address of command line
arguments */
__u64 efi_systab; /* physical address of EFI system table
*/
@@ -63,6 +64,9 @@ extern struct ia64_boot_param {
__u64 domain_size; /* how big is the boot domain */
} *ia64_boot_param;
+#else
+extern struct ia64_boot_param *ia64_boot_param;
+#endif
/*
* Macros to force memory ordering. In these descriptions, "previous"
diff -r 303e1b6bf727 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h Sun May 21 07:49:46 2006 -0600
+++ b/xen/include/public/arch-ia64.h Tue May 23 14:44:22 2006 +0200
@@ -298,17 +298,21 @@ typedef mapped_regs_t vpd_t;
typedef mapped_regs_t vpd_t;
typedef struct {
+#if 1
unsigned int flags;
+#endif
unsigned long start_info_pfn;
/* Interrupt vector for event channel. */
int evtchn_vector;
} arch_shared_info_t;
+#if 0
typedef struct {
unsigned long start;
unsigned long size;
} arch_initrd_info_t;
+#endif
#define IA64_COMMAND_LINE_SIZE 512
typedef struct vcpu_guest_context {
@@ -318,16 +322,40 @@ typedef struct vcpu_guest_context {
unsigned long flags; /* VGCF_* flags */
unsigned long pt_base; /* PMT table base */
unsigned long share_io_pg; /* Shared page for I/O emulation */
+#if 0
unsigned long sys_pgnr; /* System pages out of domain memory */
+#endif
unsigned long vm_assist; /* VMASST_TYPE_* bitmap, now none on IPF */
cpu_user_regs_t regs;
mapped_regs_t *privregs;
+#if 0
arch_shared_info_t shared;
arch_initrd_info_t initrd;
char cmdline[IA64_COMMAND_LINE_SIZE];
+#endif
} vcpu_guest_context_t;
DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
+
+struct ia64_boot_param {
+ unsigned long command_line; /* physical address of command
line. */
+ unsigned long efi_systab; /* physical address of EFI
system table */
+ unsigned long efi_memmap; /* physical address of EFI
memory map */
+ unsigned long efi_memmap_size; /* size of EFI memory map */
+ unsigned long efi_memdesc_size; /* size of an EFI memory map descriptor
*/
+ unsigned int efi_memdesc_version; /* memory descriptor version */
+ struct {
+ unsigned short num_cols; /* number of columns on console
*/
+ unsigned short num_rows; /* number of rows on console */
+ unsigned short orig_x; /* cursor's x position */
+ unsigned short orig_y; /* cursor's y position */
+ } console_info;
+ unsigned long fpswa; /* physical address of the fpswa
interface */
+ unsigned long initrd_start;
+ unsigned long initrd_size;
+ unsigned long domain_start; /* virtual address where dom0 begins */
+ unsigned long domain_size; /* how big is the boot domain */
+};
// dom0 vp op
#define __HYPERVISOR_ia64_dom0vp_op __HYPERVISOR_arch_0
diff -r 303e1b6bf727 xen/include/public/dom0_ops.h
--- a/xen/include/public/dom0_ops.h Sun May 21 07:49:46 2006 -0600
+++ b/xen/include/public/dom0_ops.h Tue May 23 14:44:22 2006 +0200
@@ -473,6 +473,16 @@ typedef struct dom0_hypercall_init {
unsigned long mfn; /* machine frame to be initialised */
} dom0_hypercall_init_t;
DEFINE_XEN_GUEST_HANDLE(dom0_hypercall_init_t);
+
+#define DOM0_FIRMWARE_SETUP 49
+typedef struct dom0_firmware_setup {
+ domid_t domain; /* domain to be affected */
+ unsigned long bp; /* mpaddr of boot param area */
+ unsigned long start_info_pfn; /* pfn of start_info */
+ unsigned long sys_pgnr; /* number of system page */
+ unsigned int hypercall_imm; /* IIM for hypercall */
+} dom0_firmware_setup_t;
+DEFINE_XEN_GUEST_HANDLE(dom0_firmware_setup_t);
typedef struct dom0_op {
uint32_t cmd;
@@ -515,6 +525,7 @@ typedef struct dom0_op {
struct dom0_irq_permission irq_permission;
struct dom0_iomem_permission iomem_permission;
struct dom0_hypercall_init hypercall_init;
+ struct dom0_firmware_setup firmware_setup;
uint8_t pad[128];
} u;
} dom0_op_t;
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|