# HG changeset patch # User gingold@virtu10 # Node ID 7d6a939ea78b4f8521784dd720f9854cc7b849d1 # Parent c52d826282cc89657fb247bf9608f7f9a7db40e7 Cleanup in domain.c. Signed-off-by: Tristan Gingold diff -r c52d826282cc -r 7d6a939ea78b xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Thu Jun 15 12:16:15 2006 +0200 +++ b/xen/arch/ia64/xen/domain.c Thu Jun 15 13:22:21 2006 +0200 @@ -70,13 +70,9 @@ static unsigned int dom0_max_vcpus = 1; static unsigned int dom0_max_vcpus = 1; integer_param("dom0_max_vcpus", dom0_max_vcpus); -// initialized by arch/ia64/setup.c:find_initrd() -unsigned long initrd_start = 0, initrd_end = 0; extern unsigned long running_on_sim; extern char dom0_command_line[]; - -#define IS_XEN_ADDRESS(d,a) ((a >= d->xen_vastart) && (a <= d->xen_vaend)) /* FIXME: where these declarations should be there ? */ extern void serial_input_init(void); @@ -297,8 +293,6 @@ int arch_domain_create(struct domain *d) int arch_domain_create(struct domain *d) { // the following will eventually need to be negotiated dynamically - d->xen_vastart = XEN_START_ADDR; - d->xen_vaend = XEN_END_ADDR; d->arch.shared_info_va = SHAREDINFO_ADDR; d->arch.breakimm = 0x1000; seqlock_init(&d->arch.vtlb_lock); @@ -527,40 +521,20 @@ int elf_sanity_check(Elf_Ehdr *ehdr) return 1; } -static void copy_memory(void *dst, void *src, int size) -{ - int remain; - - if (IS_XEN_ADDRESS(dom0,(unsigned long) src)) { - memcpy(dst,src,size); - } - else { - printf("About to call __copy_from_user(%p,%p,%d)\n", - dst,src,size); - while ((remain = __copy_from_user(dst,src,size)) != 0) { - printf("incomplete user copy, %d remain of %d\n", - remain,size); - dst += size - remain; src += size - remain; - size -= remain; - } - } -} - static void loaddomainelfimage(struct domain *d, unsigned long image_start) { char *elfbase = (char *) image_start; - //Elf_Ehdr *ehdr = (Elf_Ehdr *)image_start; Elf_Ehdr ehdr; Elf_Phdr phdr; int h, filesz, memsz; unsigned long elfaddr, dom_mpaddr, dom_imva; struct page_info *p; - copy_memory(&ehdr, (void *) image_start, sizeof(Elf_Ehdr)); + memcpy(&ehdr, (void *) image_start, sizeof(Elf_Ehdr)); for ( h = 0; h < ehdr.e_phnum; h++ ) { - copy_memory(&phdr, - elfbase + ehdr.e_phoff + (h*ehdr.e_phentsize), - sizeof(Elf_Phdr)); + memcpy(&phdr, + elfbase + ehdr.e_phoff + (h*ehdr.e_phentsize), + sizeof(Elf_Phdr)); if ((phdr.p_type != PT_LOAD)) continue; @@ -575,7 +549,7 @@ static void loaddomainelfimage(struct do if (dom_mpaddr+memsz>dom0_size) panic("Dom0 doesn't fit in memory space!\n"); dom_imva = __va_ul(dom_mpaddr + dom0_start); - copy_memory((void *)dom_imva, (void *)elfaddr, filesz); + memcpy((void *)dom_imva, (void *)elfaddr, filesz); if (memsz > filesz) memset((void *)dom_imva+filesz, 0, memsz-filesz); @@ -593,13 +567,13 @@ static void loaddomainelfimage(struct do dom_imva = __va_ul(page_to_maddr(p)); if (filesz > 0) { if (filesz >= PAGE_SIZE) - copy_memory((void *) dom_imva, - (void *) elfaddr, - PAGE_SIZE); + memcpy((void *) dom_imva, + (void *) elfaddr, + PAGE_SIZE); else { // copy partial page - copy_memory((void *) dom_imva, - (void *) elfaddr, filesz); + memcpy((void *) dom_imva, + (void *) elfaddr, filesz); // zero the rest of page memset((void *) dom_imva+filesz, 0, PAGE_SIZE-filesz); @@ -625,6 +599,30 @@ static void loaddomainelfimage(struct do void alloc_dom0(void) { + + /* Check dom0 size. */ + if (dom0_size < 4 * 1024 * 1024) { + panic("dom0_mem is too small, boot aborted" + " (try e.g. dom0_mem=256M or dom0_mem=65536K)\n"); + } + + /* Check dom0 align. */ + if ((dom0_align - 1) & dom0_align) { /* not a power of two */ + panic("dom0_align (%lx) must be power of two, boot aborted" + " (try e.g. dom0_align=256M or dom0_align=65536K)\n", + dom0_align); + } + if (dom0_align < PAGE_SIZE) { + panic("dom0_align must be >= %ld, boot aborted" + " (try e.g. dom0_align=256M or dom0_align=65536K)\n", + PAGE_SIZE); + } + if (dom0_size % dom0_align) { + dom0_size = (dom0_size / dom0_align + 1) * dom0_align; + printf("dom0_size rounded up to %ld, due to dom0_align=%lx\n", + dom0_size,dom0_align); + } + if (running_on_sim) { dom0_size = 128*1024*1024; //FIXME: Should be configurable } @@ -666,7 +664,6 @@ static void physdev_init_dom0(struct dom BUG(); } -static unsigned int vmx_dom0 = 0; int construct_dom0(struct domain *d, unsigned long image_start, unsigned long image_len, unsigned long initrd_start, unsigned long initrd_len, @@ -689,6 +686,7 @@ int construct_dom0(struct domain *d, struct page_info *start_info_page; #ifdef VALIDATE_VT + unsigned int vmx_dom0 = 0; unsigned long mfn; struct page_info *page = NULL; #endif @@ -851,12 +849,15 @@ int construct_dom0(struct domain *d, if (cmdline != NULL) console_endboot(strstr(cmdline, "tty0") != NULL); + printk("Dom0: 0x%lx\n", (u64)dom0); + +#ifdef VALIDATE_VT /* VMX specific construction for Dom0, if hardware supports VMX * and Dom0 is unmodified image */ - printk("Dom0: 0x%lx, domain: 0x%lx\n", (u64)dom0, (u64)d); if (vmx_dom0) vmx_final_setup_guest(v); +#endif set_bit(_VCPUF_initialised, &v->vcpu_flags); @@ -897,11 +898,6 @@ void dummy_called(char *function) if (running_on_sim) asm("break 0;;"); printf("dummy called in %s: spinning....\n", function); while(1); -} - -void domain_pend_keyboard_interrupt(int irq) -{ - vcpu_pend_interrupt(dom0->vcpu[0],irq); } void sync_vcpu_execstate(struct vcpu *v) @@ -912,53 +908,15 @@ void sync_vcpu_execstate(struct vcpu *v) // FIXME SMP: Anything else needed here for SMP? } -// FIXME: It would be nice to print out a nice error message for bad -// values of these boot-time parameters, but it seems we are too early -// in the boot and attempts to print freeze the system? -#define abort(x...) do {} while(0) -#define warn(x...) do {} while(0) - static void parse_dom0_mem(char *s) { - unsigned long bytes = parse_size_and_unit(s); - - if (dom0_size < 4 * 1024 * 1024) { - abort("parse_dom0_mem: too small, boot aborted" - " (try e.g. dom0_mem=256M or dom0_mem=65536K)\n"); - } - if (dom0_size % dom0_align) { - dom0_size = ((dom0_size / dom0_align) + 1) * dom0_align; - warn("parse_dom0_mem: dom0_size rounded up from" - " %lx to %lx bytes, due to dom0_align=%lx\n", - bytes,dom0_size,dom0_align); - } - else dom0_size = bytes; + dom0_size = parse_size_and_unit(s); } custom_param("dom0_mem", parse_dom0_mem); static void parse_dom0_align(char *s) { - unsigned long bytes = parse_size_and_unit(s); - - if ((bytes - 1) ^ bytes) { /* not a power of two */ - abort("parse_dom0_align: dom0_align must be power of two, " - "boot aborted" - " (try e.g. dom0_align=256M or dom0_align=65536K)\n"); - } - else if (bytes < PAGE_SIZE) { - abort("parse_dom0_align: dom0_align must be >= %ld, " - "boot aborted" - " (try e.g. dom0_align=256M or dom0_align=65536K)\n", - PAGE_SIZE); - } - else dom0_align = bytes; - if (dom0_size % dom0_align) { - dom0_size = (dom0_size / dom0_align + 1) * dom0_align; - warn("parse_dom0_align: dom0_size rounded up from" - " %ld to %ld bytes, due to dom0_align=%lx\n", - bytes,dom0_size,dom0_align); - } + dom0_align = parse_size_and_unit(s); } custom_param("dom0_align", parse_dom0_align); - diff -r c52d826282cc -r 7d6a939ea78b xen/arch/ia64/xen/irq.c --- a/xen/arch/ia64/xen/irq.c Thu Jun 15 12:16:15 2006 +0200 +++ b/xen/arch/ia64/xen/irq.c Thu Jun 15 13:22:21 2006 +0200 @@ -618,10 +618,9 @@ void process_soft_irq(void) } // this is a temporary hack until real console input is implemented -extern void domain_pend_keyboard_interrupt(int irq); void guest_forward_keyboard_input(int irq, void *nada, struct pt_regs *regs) { - domain_pend_keyboard_interrupt(irq); + vcpu_pend_interrupt(dom0->vcpu[0],irq); } void serial_input_init(void) diff -r c52d826282cc -r 7d6a939ea78b xen/include/asm-ia64/domain.h --- a/xen/include/asm-ia64/domain.h Thu Jun 15 12:16:15 2006 +0200 +++ b/xen/include/asm-ia64/domain.h Thu Jun 15 13:22:21 2006 +0200 @@ -64,8 +64,6 @@ struct arch_domain { /* SAL return point. */ unsigned long sal_return_addr; - u64 xen_vastart; - u64 xen_vaend; u64 shared_info_va; unsigned long initrd_start; unsigned long initrd_len; @@ -80,8 +78,6 @@ struct arch_domain { // protect v->itlb, v->dtlb and vhpt seqlock_t vtlb_lock ____cacheline_aligned_in_smp; }; -#define xen_vastart arch.xen_vastart -#define xen_vaend arch.xen_vaend #define INT_ENABLE_OFFSET(v) \ (sizeof(vcpu_info_t) * (v)->vcpu_id + \ offsetof(vcpu_info_t, evtchn_upcall_mask))