[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] merge
# HG changeset patch # User awilliam@xxxxxxxxxxx # Node ID dfdb9cfc8b7969cb9ea4fd4995c68cdfdb3acdac # Parent 1d36cca98fc3710643483e5a5648b7ae317c735d # Parent 6526a91d55553b712cb210cbefb363e71b380679 merge diff -r 1d36cca98fc3 -r dfdb9cfc8b79 linux-2.6-xen-sparse/arch/ia64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Fri Feb 10 11:35:19 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Fri Feb 10 15:37:14 2006 @@ -61,6 +61,9 @@ #include <asm/system.h> #include <asm/unistd.h> #include <asm/system.h> +#ifdef CONFIG_XEN +#include <asm/hypervisor.h> +#endif #if defined(CONFIG_SMP) && (IA64_CPU_SIZE > PAGE_SIZE) # error "struct cpuinfo_ia64 too big!" @@ -240,6 +243,12 @@ rsvd_region[n].start = (unsigned long) ia64_imva((void *)KERNEL_START); rsvd_region[n].end = (unsigned long) ia64_imva(_end); n++; + +#ifdef CONFIG_XEN + rsvd_region[n].start = (unsigned long) (HYPERVISOR_shared_info->arch.start_info_pfn << PAGE_SHIFT); + rsvd_region[n].end = rsvd_region[n].start + PAGE_SIZE; + n++; +#endif #ifdef CONFIG_BLK_DEV_INITRD if (ia64_boot_param->initrd_start) { diff -r 1d36cca98fc3 -r dfdb9cfc8b79 linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c --- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c Fri Feb 10 11:35:19 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c Fri Feb 10 15:37:14 2006 @@ -106,8 +106,10 @@ BUG_ON(HYPERVISOR_event_channel_op(&op) != 0 ); evtchn = op.u.bind_virq.port; - if (!unbound_irq(evtchn)) - return -EINVAL; + if (!unbound_irq(evtchn)) { + evtchn = -EINVAL; + goto out; + } evtchns[evtchn].handler = handler; evtchns[evtchn].dev_id = dev_id; @@ -115,6 +117,7 @@ irq_info[evtchn] = mk_irq_info(IRQT_VIRQ, virq, evtchn); unmask_evtchn(evtchn); +out: spin_unlock(&irq_mapping_update_lock); return evtchn; } @@ -125,8 +128,10 @@ { spin_lock(&irq_mapping_update_lock); - if (!unbound_irq(evtchn)) - return -EINVAL; + if (!unbound_irq(evtchn)) { + evtchn = -EINVAL; + goto out; + } evtchns[evtchn].handler = handler; evtchns[evtchn].dev_id = dev_id; @@ -134,6 +139,7 @@ irq_info[evtchn] = mk_irq_info(IRQT_EVTCHN, 0, evtchn); unmask_evtchn(evtchn); +out: spin_unlock(&irq_mapping_update_lock); return evtchn; } @@ -158,7 +164,7 @@ spin_lock(&irq_mapping_update_lock); if (unbound_irq(irq)) - return; + goto out; op.cmd = EVTCHNOP_close; op.u.close.port = evtchn; @@ -179,6 +185,7 @@ evtchns[evtchn].handler = NULL; evtchns[evtchn].opened = 0; +out: spin_unlock(&irq_mapping_update_lock); } diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/arch/ia64/vmx/vmx_init.c --- a/xen/arch/ia64/vmx/vmx_init.c Fri Feb 10 11:35:19 2006 +++ b/xen/arch/ia64/vmx/vmx_init.c Fri Feb 10 15:37:14 2006 @@ -317,7 +317,7 @@ for (j = io_ranges[i].start; j < io_ranges[i].start + io_ranges[i].size; j += PAGE_SIZE) - map_domain_page(d, j, io_ranges[i].type); + assign_domain_page(d, j, io_ranges[i].type); } conf_nr = VMX_CONFIG_PAGES(d); @@ -334,14 +334,14 @@ for (i = 0; i < (end < MMIO_START ? end : MMIO_START); i += PAGE_SIZE, pgnr++) - map_domain_page(d, i, pgnr << PAGE_SHIFT); + assign_domain_page(d, i, pgnr << PAGE_SHIFT); /* Map normal memory beyond 4G */ if (unlikely(end > MMIO_START)) { start = 4 * MEM_G; end = start + (end - 3 * MEM_G); for (i = start; i < end; i += PAGE_SIZE, pgnr++) - map_domain_page(d, i, pgnr << PAGE_SHIFT); + assign_domain_page(d, i, pgnr << PAGE_SHIFT); } d->arch.max_pfn = end >> PAGE_SHIFT; @@ -356,7 +356,7 @@ /* Map guest firmware */ pgnr = page_to_mfn(page); for (i = GFW_START; i < GFW_START + GFW_SIZE; i += PAGE_SIZE, pgnr++) - map_domain_page(d, i, pgnr << PAGE_SHIFT); + assign_domain_page(d, i, pgnr << PAGE_SHIFT); if (unlikely((page = alloc_domheap_pages(d, 1, 0)) == NULL)) { printk("Could not allocate order=1 pages for vmx contig alloc\n"); @@ -365,9 +365,9 @@ /* Map for shared I/O page and xenstore */ pgnr = page_to_mfn(page); - map_domain_page(d, IO_PAGE_START, pgnr << PAGE_SHIFT); + assign_domain_page(d, IO_PAGE_START, pgnr << PAGE_SHIFT); pgnr++; - map_domain_page(d, STORE_PAGE_START, pgnr << PAGE_SHIFT); + assign_domain_page(d, STORE_PAGE_START, pgnr << PAGE_SHIFT); set_bit(ARCH_VMX_CONTIG_MEM, &v->arch.arch_vmx.flags); return 0; diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Fri Feb 10 11:35:19 2006 +++ b/xen/arch/ia64/xen/domain.c Fri Feb 10 15:37:14 2006 @@ -389,7 +389,7 @@ } /* allocate new page for domain and map it to the specified metaphysical addr */ -struct page * map_new_domain_page(struct domain *d, unsigned long mpaddr) +struct page * assign_new_domain_page(struct domain *d, unsigned long mpaddr) { struct mm_struct *mm = d->arch.mm; struct page *p = (struct page *)0; @@ -400,7 +400,7 @@ extern unsigned long vhpt_paddr, vhpt_pend; if (!mm->pgd) { - printk("map_new_domain_page: domain pgd must exist!\n"); + printk("assign_new_domain_page: domain pgd must exist!\n"); return(p); } pgd = pgd_offset(mm,mpaddr); @@ -428,21 +428,21 @@ if (p) memset(__va(page_to_maddr(p)),0,PAGE_SIZE); } if (unlikely(!p)) { -printf("map_new_domain_page: Can't alloc!!!! Aaaargh!\n"); +printf("assign_new_domain_page: Can't alloc!!!! Aaaargh!\n"); return(p); } if (unlikely(page_to_maddr(p) > vhpt_paddr && page_to_maddr(p) < vhpt_pend)) { - printf("map_new_domain_page: reassigned vhpt page %p!!\n",page_to_maddr(p)); + printf("assign_new_domain_page: reassigned vhpt page %p!!\n",page_to_maddr(p)); } set_pte(pte, pfn_pte(page_to_maddr(p) >> PAGE_SHIFT, __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX))); } - else printk("map_new_domain_page: mpaddr %lx already mapped!\n",mpaddr); + else printk("assign_new_domain_page: mpaddr %lx already mapped!\n",mpaddr); return p; } /* map a physical address to the specified metaphysical addr */ -void map_domain_page(struct domain *d, unsigned long mpaddr, unsigned long physaddr) +void assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned long physaddr) { struct mm_struct *mm = d->arch.mm; pgd_t *pgd; @@ -451,7 +451,7 @@ pte_t *pte; if (!mm->pgd) { - printk("map_domain_page: domain pgd must exist!\n"); + printk("assign_domain_page: domain pgd must exist!\n"); return; } pgd = pgd_offset(mm,mpaddr); @@ -472,11 +472,11 @@ set_pte(pte, pfn_pte(physaddr >> PAGE_SHIFT, __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX))); } - else printk("map_domain_page: mpaddr %lx already mapped!\n",mpaddr); + else printk("assign_domain_page: mpaddr %lx already mapped!\n",mpaddr); } #if 0 /* map a physical address with specified I/O flag */ -void map_domain_io_page(struct domain *d, unsigned long mpaddr, unsigned long flags) +void assign_domain_io_page(struct domain *d, unsigned long mpaddr, unsigned long flags) { struct mm_struct *mm = d->arch.mm; pgd_t *pgd; @@ -486,7 +486,7 @@ pte_t io_pte; if (!mm->pgd) { - printk("map_domain_page: domain pgd must exist!\n"); + printk("assign_domain_page: domain pgd must exist!\n"); return; } ASSERT(flags & GPFN_IO_MASK); @@ -509,7 +509,7 @@ pte_val(io_pte) = flags; set_pte(pte, io_pte); } - else printk("map_domain_page: mpaddr %lx already mapped!\n",mpaddr); + else printk("assign_domain_page: mpaddr %lx already mapped!\n",mpaddr); } #endif void mpafoo(unsigned long mpaddr) @@ -557,7 +557,7 @@ } /* if lookup fails and mpaddr is "legal", "create" the page */ if ((mpaddr >> PAGE_SHIFT) < d->max_pages) { - if (map_new_domain_page(d,mpaddr)) goto tryagain; + if (assign_new_domain_page(d,mpaddr)) goto tryagain; } printk("lookup_domain_mpa: bad mpa %p (> %p\n", mpaddr,d->max_pages<<PAGE_SHIFT); @@ -655,15 +655,9 @@ else #endif while (memsz > 0) { -#ifdef DOMU_AUTO_RESTART - pteval = lookup_domain_mpa(d,dom_mpaddr); - if (pteval) dom_imva = __va(pteval & _PFN_MASK); - else { printf("loaddomainelfimage: BAD!\n"); while(1); } -#else - p = map_new_domain_page(d,dom_mpaddr); + p = assign_new_domain_page(d,dom_mpaddr); if (unlikely(!p)) BUG(); dom_imva = __va(page_to_maddr(p)); -#endif if (filesz > 0) { if (filesz >= PAGE_SIZE) copy_memory(dom_imva,elfaddr,PAGE_SIZE); @@ -788,16 +782,15 @@ unsigned long pkern_entry; unsigned long pkern_end; unsigned long pinitrd_start = 0; + unsigned long pstart_info; unsigned long ret, progress = 0; //printf("construct_dom0: starting\n"); -#ifndef CLONE_DOMAIN0 /* Sanity! */ BUG_ON(d != dom0); BUG_ON(d->vcpu[0] == NULL); BUG_ON(test_bit(_VCPUF_initialised, &v->vcpu_flags)); -#endif memset(&dsi, 0, sizeof(struct domain_setup_info)); @@ -847,13 +840,18 @@ (PAGE_ALIGN(initrd_len) + 4*1024*1024); memcpy(__va(pinitrd_start),initrd_start,initrd_len); + pstart_info = PAGE_ALIGN(pinitrd_start + initrd_len); + } else { + pstart_info = PAGE_ALIGN(pkern_end); } printk("METAPHYSICAL MEMORY ARRANGEMENT:\n" " Kernel image: %lx->%lx\n" " Entry address: %lx\n" - " Init. ramdisk: %lx len %lx\n", - pkern_start, pkern_end, pkern_entry, pinitrd_start, initrd_len); + " Init. ramdisk: %lx len %lx\n" + " Start info.: %lx->%lx\n", + pkern_start, pkern_end, pkern_entry, pinitrd_start, initrd_len, + pstart_info, pstart_info + PAGE_SIZE); if ( (pkern_end - pkern_start) > (d->max_pages * PAGE_SIZE) ) { @@ -908,9 +906,9 @@ /* Set up start info area. */ - si = (start_info_t *)alloc_xenheap_page(); + d->shared_info->arch.start_info_pfn = pstart_info >> PAGE_SHIFT; + si = __va(pstart_info); memset(si, 0, PAGE_SIZE); - d->shared_info->arch.start_info_pfn = __pa(si) >> PAGE_SHIFT; sprintf(si->magic, "xen-%i.%i-ia64", XEN_VERSION, XEN_SUBVERSION); si->nr_pages = d->tot_pages; @@ -962,9 +960,6 @@ sync_split_caches(); // FIXME: Hack for keyboard input -#ifdef CLONE_DOMAIN0 -if (d == dom0) -#endif serial_input_init(); if (d == dom0) { VCPU(v, delivery_mask[0]) = -1L; @@ -977,65 +972,6 @@ return 0; } -// FIXME: When dom0 can construct domains, this goes away (or is rewritten) -int construct_domU(struct domain *d, - unsigned long image_start, unsigned long image_len, - unsigned long initrd_start, unsigned long initrd_len, - char *cmdline) -{ - int i, rc; - struct vcpu *v = d->vcpu[0]; - unsigned long pkern_entry; - -#ifndef DOMU_AUTO_RESTART - BUG_ON(test_bit(_VCPUF_initialised, &v->vcpu_flags)); -#endif - - printk("*** LOADING DOMAIN %d ***\n",d->domain_id); - - d->max_pages = dom0_size/PAGE_SIZE; // FIXME: use dom0 size - // FIXME: use domain0 command line - rc = parsedomainelfimage(image_start, image_len, &pkern_entry); - printk("parsedomainelfimage returns %d\n",rc); - if ( rc != 0 ) return rc; - - /* Mask all upcalls... */ - for ( i = 0; i < MAX_VIRT_CPUS; i++ ) - d->shared_info->vcpu_info[i].evtchn_upcall_mask = 1; - - /* Copy the OS image. */ - printk("calling loaddomainelfimage(%p,%p)\n",d,image_start); - loaddomainelfimage(d,image_start); - printk("loaddomainelfimage returns\n"); - - set_bit(_VCPUF_initialised, &v->vcpu_flags); - - printk("calling new_thread, entry=%p\n",pkern_entry); -#ifdef DOMU_AUTO_RESTART - v->domain->arch.image_start = image_start; - v->domain->arch.image_len = image_len; - v->domain->arch.entry = pkern_entry; -#endif - new_thread(v, pkern_entry, 0, 0); - printk("new_thread returns\n"); - sync_split_caches(); - __set_bit(0x30, VCPU(v, delivery_mask)); - - return 0; -} - -#ifdef DOMU_AUTO_RESTART -void reconstruct_domU(struct vcpu *v) -{ - /* re-copy the OS image to reset data values to original */ - printk("reconstruct_domU: restarting domain %d...\n", - v->domain->domain_id); - loaddomainelfimage(v->domain,v->domain->arch.image_start); - new_thread(v, v->domain->arch.entry, 0, 0); - sync_split_caches(); -} -#endif - void machine_restart(char * __unused) { if (platform_is_hp_ski()) dummy(); diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/arch/ia64/xen/hypercall.c --- a/xen/arch/ia64/xen/hypercall.c Fri Feb 10 11:35:19 2006 +++ b/xen/arch/ia64/xen/hypercall.c Fri Feb 10 15:37:14 2006 @@ -9,6 +9,7 @@ #include <xen/config.h> #include <xen/sched.h> #include <xen/hypercall.h> +#include <xen/multicall.h> #include <linux/efi.h> /* FOR EFI_UNIMPLEMENTED */ #include <asm/sal.h> /* FOR struct ia64_sal_retval */ @@ -22,6 +23,42 @@ unsigned long idle_when_pending = 0; unsigned long pal_halt_light_count = 0; + +hypercall_t ia64_hypercall_table[] = + { + (hypercall_t)do_ni_hypercall, /* do_set_trap_table */ /* 0 */ + (hypercall_t)do_ni_hypercall, /* do_mmu_update */ + (hypercall_t)do_ni_hypercall, /* do_set_gdt */ + (hypercall_t)do_ni_hypercall, /* do_stack_switch */ + (hypercall_t)do_ni_hypercall, /* do_set_callbacks */ + (hypercall_t)do_ni_hypercall, /* do_fpu_taskswitch */ /* 5 */ + (hypercall_t)do_ni_hypercall, /* do_sched_op */ + (hypercall_t)do_dom0_op, + (hypercall_t)do_ni_hypercall, /* do_set_debugreg */ + (hypercall_t)do_ni_hypercall, /* do_get_debugreg */ + (hypercall_t)do_ni_hypercall, /* do_update_descriptor */ /* 10 */ + (hypercall_t)do_ni_hypercall, /* do_ni_hypercall */ + (hypercall_t)do_memory_op, + (hypercall_t)do_multicall, + (hypercall_t)do_ni_hypercall, /* do_update_va_mapping */ + (hypercall_t)do_ni_hypercall, /* do_set_timer_op */ /* 15 */ + (hypercall_t)do_event_channel_op, + (hypercall_t)do_xen_version, + (hypercall_t)do_console_io, + (hypercall_t)do_ni_hypercall, /* do_physdev_op */ + (hypercall_t)do_grant_table_op, /* 20 */ + (hypercall_t)do_ni_hypercall, /* do_vm_assist */ + (hypercall_t)do_ni_hypercall, /* do_update_va_mapping_otherdomain */ + (hypercall_t)do_ni_hypercall, /* (x86 only) */ + (hypercall_t)do_ni_hypercall, /* do_vcpu_op */ + (hypercall_t)do_ni_hypercall, /* (x86_64 only) */ /* 25 */ + (hypercall_t)do_ni_hypercall, /* do_mmuext_op */ + (hypercall_t)do_ni_hypercall, /* do_acm_op */ + (hypercall_t)do_ni_hypercall, /* do_nmi_op */ + (hypercall_t)do_ni_hypercall, /* */ + (hypercall_t)do_ni_hypercall, /* */ /* 30 */ + (hypercall_t)do_ni_hypercall /* */ + }; int ia64_hypercall (struct pt_regs *regs) @@ -94,15 +131,8 @@ printf("(by dom0)\n "); (*efi.reset_system)(EFI_RESET_WARM,0,0,NULL); } -#ifdef DOMU_AUTO_RESTART - else { - reconstruct_domU(current); - return 0; // don't increment ip! - } -#else printf("(not supported for non-0 domain)\n"); regs->r8 = EFI_UNSUPPORTED; -#endif break; case FW_HYPERCALL_EFI_GET_TIME: tv = vcpu_get_gr(v,32); @@ -181,9 +211,13 @@ regs->r8 = do_xen_version(regs->r14, regs->r15); break; + case __HYPERVISOR_multicall: + regs->r8 = do_multicall(regs->r14, regs->r15); + break; + default: printf("unknown hypercall %x\n", regs->r2); - regs->r8 = (unsigned long)-1; + regs->r8 = do_ni_hypercall(); } return 1; } diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/arch/ia64/xen/xenmisc.c --- a/xen/arch/ia64/xen/xenmisc.c Fri Feb 10 11:35:19 2006 +++ b/xen/arch/ia64/xen/xenmisc.c Fri Feb 10 15:37:14 2006 @@ -168,7 +168,11 @@ void *pgtable_quicklist_alloc(void) { - return alloc_xenheap_pages(0); + void *p; + p = alloc_xenheap_pages(0); + if (p) + clear_page(p); + return p; } void pgtable_quicklist_free(void *pgtable_entry) diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/arch/ia64/xen/xensetup.c --- a/xen/arch/ia64/xen/xensetup.c Fri Feb 10 11:35:19 2006 +++ b/xen/arch/ia64/xen/xensetup.c Fri Feb 10 15:37:14 2006 @@ -31,9 +31,6 @@ cpumask_t cpu_present_map; -#ifdef CLONE_DOMAIN0 -struct domain *clones[CLONE_DOMAIN0]; -#endif extern unsigned long domain0_ready; int find_max_pfn (unsigned long, unsigned long, void *); @@ -342,16 +339,6 @@ printk("About to call domain_create()\n"); dom0 = domain_create(0, 0); -#ifdef CLONE_DOMAIN0 - { - int i; - for (i = 0; i < CLONE_DOMAIN0; i++) { - clones[i] = domain_create(i+1, 0); - if ( clones[i] == NULL ) - panic("Error creating domain0 clone %d\n",i); - } - } -#endif if ( dom0 == NULL ) panic("Error creating domain 0\n"); @@ -376,22 +363,6 @@ /* PIN domain0 on CPU 0. */ dom0->vcpu[0]->cpu_affinity = cpumask_of_cpu(0); -#ifdef CLONE_DOMAIN0 - { - int i; - dom0_memory_start = __va(ia64_boot_param->domain_start); - dom0_memory_size = ia64_boot_param->domain_size; - - for (i = 0; i < CLONE_DOMAIN0; i++) { - printk("CONSTRUCTING DOMAIN0 CLONE #%d\n",i+1); - if ( construct_domU(clones[i], dom0_memory_start, dom0_memory_size, - dom0_initrd_start,dom0_initrd_size, - 0) != 0) - panic("Could not set up DOM0 clone %d\n",i); - } - } -#endif - /* The stash space for the initial kernel image can now be freed up. */ init_domheap_pages(ia64_boot_param->domain_start, ia64_boot_param->domain_size); @@ -412,13 +383,6 @@ console_endboot(cmdline && strstr(cmdline, "tty0")); #endif -#ifdef CLONE_DOMAIN0 - { - int i; - for (i = 0; i < CLONE_DOMAIN0; i++) - domain_unpause_by_systemcontroller(clones[i]); - } -#endif domain0_ready = 1; local_irq_enable(); diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/include/asm-ia64/config.h --- a/xen/include/asm-ia64/config.h Fri Feb 10 11:35:19 2006 +++ b/xen/include/asm-ia64/config.h Fri Feb 10 15:37:14 2006 @@ -3,11 +3,8 @@ #undef USE_PAL_EMULATOR // control flags for turning on/off features under test -#undef CLONE_DOMAIN0 -//#define CLONE_DOMAIN0 1 #undef DOMU_BUILD_STAGING #define VHPT_GLOBAL -#define DOMU_AUTO_RESTART #undef DEBUG_PFMON @@ -215,9 +212,6 @@ // see include/asm-ia64/mm.h, handle remaining page_info uses until gone #define page_info page -// see common/memory.c -#define set_gpfn_from_mfn(x,y) do { } while (0) - // see common/keyhandler.c #define nop() asm volatile ("nop 0") diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/include/asm-ia64/domain.h --- a/xen/include/asm-ia64/domain.h Fri Feb 10 11:35:19 2006 +++ b/xen/include/asm-ia64/domain.h Fri Feb 10 15:37:14 2006 @@ -32,11 +32,6 @@ u64 xen_vastart; u64 xen_vaend; u64 shared_info_va; -#ifdef DOMU_AUTO_RESTART - u64 image_start; - u64 image_len; - u64 entry; -#endif unsigned long initrd_start; unsigned long initrd_len; char *cmdline; diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/include/asm-ia64/grant_table.h --- a/xen/include/asm-ia64/grant_table.h Fri Feb 10 11:35:19 2006 +++ b/xen/include/asm-ia64/grant_table.h Fri Feb 10 15:37:14 2006 @@ -17,7 +17,7 @@ #define gnttab_shared_gmfn(d, t, i) \ ( ((d) == dom0) ? \ ((virt_to_maddr((t)->shared) >> PAGE_SHIFT) + (i)) : \ - (map_domain_page((d), 1UL<<40, virt_to_maddr((t)->shared)), \ + (assign_domain_page((d), 1UL<<40, virt_to_maddr((t)->shared)), \ 1UL << (40 - PAGE_SHIFT)) \ ) diff -r 1d36cca98fc3 -r dfdb9cfc8b79 xen/include/asm-ia64/multicall.h --- a/xen/include/asm-ia64/multicall.h Fri Feb 10 11:35:19 2006 +++ b/xen/include/asm-ia64/multicall.h Fri Feb 10 15:37:14 2006 @@ -1,5 +1,27 @@ #ifndef __ASM_IA64_MULTICALL_H__ #define __ASM_IA64_MULTICALL_H__ -#define do_multicall_call(_call) BUG() +#include <public/xen.h> + +typedef unsigned long (*hypercall_t)( + unsigned long arg0, + unsigned long arg1, + unsigned long arg2, + unsigned long arg3, + unsigned long arg4, + unsigned long arg5); + +extern hypercall_t ia64_hypercall_table[]; + +static inline void do_multicall_call(multicall_entry_t *call) +{ + call->result = (*ia64_hypercall_table[call->op])( + call->args[0], + call->args[1], + call->args[2], + call->args[3], + call->args[4], + call->args[5]); +} + #endif /* __ASM_IA64_MULTICALL_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |