diff options
-rw-r--r-- | .rootkeys | 1 | ||||
-rw-r--r-- | xen/arch/ia64/dom0_ops.c | 58 | ||||
-rw-r--r-- | xen/arch/ia64/domain.c | 220 | ||||
-rw-r--r-- | xen/arch/ia64/hypercall.c | 24 | ||||
-rw-r--r-- | xen/arch/ia64/patch/linux-2.6.11/uaccess.h | 22 | ||||
-rw-r--r-- | xen/arch/ia64/tools/mkbuildtree | 2 | ||||
-rw-r--r-- | xen/arch/ia64/vcpu.c | 6 | ||||
-rw-r--r-- | xen/arch/ia64/xenmisc.c | 8 | ||||
-rw-r--r-- | xen/include/asm-ia64/config.h | 5 | ||||
-rw-r--r-- | xen/include/asm-ia64/domain.h | 3 | ||||
-rw-r--r-- | xen/include/public/arch-ia64.h | 11 |
11 files changed, 204 insertions, 156 deletions
@@ -1140,6 +1140,7 @@ 425ae516juUB257qrwUdsL9AsswrqQ xen/arch/ia64/patch/linux-2.6.11/time.c 425ae5167zQn7zYcgKtDUDX2v-e8mw xen/arch/ia64/patch/linux-2.6.11/tlb.c 425ae5162bIl2Dgd19x-FceB4L9oGw xen/arch/ia64/patch/linux-2.6.11/types.h +42ae01f01KDfSgVQnscwJ0psRmEaCw xen/arch/ia64/patch/linux-2.6.11/uaccess.h 425ae516cFUNY2jHD46bujcF5NJheA xen/arch/ia64/patch/linux-2.6.11/unaligned.c 421098b39QFMC-1t1r38CA7NxAYBPA xen/arch/ia64/patch/linux-2.6.7/bootmem.h 421098b3SIA1vZX9fFUjo1T3o_jMCQ xen/arch/ia64/patch/linux-2.6.7/current.h diff --git a/xen/arch/ia64/dom0_ops.c b/xen/arch/ia64/dom0_ops.c index e0b48080bc..c1b1d5c241 100644 --- a/xen/arch/ia64/dom0_ops.c +++ b/xen/arch/ia64/dom0_ops.c @@ -18,14 +18,6 @@ #include <xen/console.h> #include <public/sched_ctl.h> -#define TRC_DOM0OP_ENTER_BASE 0x00020000 -#define TRC_DOM0OP_LEAVE_BASE 0x00030000 - -static int msr_cpu_mask; -static unsigned long msr_addr; -static unsigned long msr_lo; -static unsigned long msr_hi; - long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) { long ret = 0; @@ -35,6 +27,49 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) switch ( op->cmd ) { + /* + * NOTE: DOM0_GETMEMLIST has somewhat different semantics on IA64 - + * it actually allocates and maps pages. + */ + case DOM0_GETMEMLIST: + { + unsigned long i; + struct domain *d = find_domain_by_id(op->u.getmemlist.domain); + unsigned long start_page = op->u.getmemlist.max_pfns >> 32; + unsigned long nr_pages = op->u.getmemlist.max_pfns & 0xffffffff; + unsigned long pfn; + unsigned long *buffer = op->u.getmemlist.buffer; + struct page *page; + + ret = -EINVAL; + if ( d != NULL ) + { + ret = 0; + + for ( i = start_page; i < (start_page + nr_pages); i++ ) + { + page = map_new_domain_page(d, i << PAGE_SHIFT); + if ( page == NULL ) + { + ret = -ENOMEM; + break; + } + pfn = page_to_pfn(page); + if ( put_user(pfn, buffer) ) + { + ret = -EFAULT; + break; + } + buffer++; + } + + op->u.getmemlist.num_pfns = i - start_page; + copy_to_user(u_dom0_op, op, sizeof(*op)); + + put_domain(d); + } + } + break; default: ret = -ENOSYS; @@ -43,10 +78,3 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) return ret; } - -void arch_getdomaininfo_ctxt(struct domain *d, struct vcpu_guest_context *c) -{ - int i; - - dummy(); -} diff --git a/xen/arch/ia64/domain.c b/xen/arch/ia64/domain.c index 869396ed06..939173df50 100644 --- a/xen/arch/ia64/domain.c +++ b/xen/arch/ia64/domain.c @@ -76,7 +76,7 @@ extern unsigned long dom_fw_setup(struct domain *, char *, int); /* this belongs in include/asm, but there doesn't seem to be a suitable place */ void free_perdomain_pt(struct domain *d) { - dummy(); + printf("free_perdomain_pt: not implemented\n"); //free_page((unsigned long)d->mm.perdomain_pt); } @@ -166,12 +166,34 @@ void arch_free_vcpu_struct(struct vcpu *v) free_xenheap_pages(v, KERNEL_STACK_SIZE_ORDER); } +static void init_switch_stack(struct vcpu *v) +{ + struct pt_regs *regs = (struct pt_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1; + struct switch_stack *sw = (struct switch_stack *) regs - 1; + extern void ia64_ret_from_clone; + + memset(sw, 0, sizeof(struct switch_stack) + sizeof(struct pt_regs)); + sw->ar_bspstore = (unsigned long)v + IA64_RBS_OFFSET; + sw->b0 = (unsigned long) &ia64_ret_from_clone; + sw->ar_fpsr = FPSR_DEFAULT; + v->arch._thread.ksp = (unsigned long) sw - 16; + // stay on kernel stack because may get interrupts! + // ia64_ret_from_clone (which b0 gets in new_thread) switches + // to user stack + v->arch._thread.on_ustack = 0; + memset(v->arch._thread.fph,0,sizeof(struct ia64_fpreg)*96); +} + #ifdef CONFIG_VTI void arch_do_createdomain(struct vcpu *v) { struct domain *d = v->domain; struct thread_info *ti = alloc_thread_info(v); + /* Clear thread_info to clear some important fields, like preempt_count */ + memset(ti, 0, sizeof(struct thread_info)); + init_switch_stack(v); + /* If domain is VMX domain, shared info area is created * by domain and then domain notifies HV by specific hypercall. * If domain is xenolinux, shared info area is created by @@ -194,9 +216,6 @@ void arch_do_createdomain(struct vcpu *v) } memset(v->vcpu_info, 0, PAGE_SIZE); - /* Clear thread_info to clear some important fields, like preempt_count */ - memset(ti, 0, sizeof(struct thread_info)); - /* Allocate per-domain vTLB and vhpt */ v->arch.vtlb = init_domain_tlb(v); @@ -212,37 +231,37 @@ void arch_do_createdomain(struct vcpu *v) d->xen_vaend = 0xf300000000000000; d->arch.breakimm = 0x1000; - // stay on kernel stack because may get interrupts! - // ia64_ret_from_clone (which b0 gets in new_thread) switches - // to user stack - v->arch._thread.on_ustack = 0; + d->arch.mm = xmalloc(struct mm_struct); + if (unlikely(!d->arch.mm)) { + printk("Can't allocate mm_struct for domain %d\n",d->domain_id); + return -ENOMEM; + } + memset(d->arch.mm, 0, sizeof(*d->arch.mm)); + d->arch.mm->pgd = pgd_alloc(d->arch.mm); + if (unlikely(!d->arch.mm->pgd)) { + printk("Can't allocate pgd for domain %d\n",d->domain_id); + return -ENOMEM; + } +} } #else // CONFIG_VTI void arch_do_createdomain(struct vcpu *v) { struct domain *d = v->domain; + struct thread_info *ti = alloc_thread_info(v); + + /* Clear thread_info to clear some important fields, like preempt_count */ + memset(ti, 0, sizeof(struct thread_info)); + init_switch_stack(v); d->shared_info = (void *)alloc_xenheap_page(); - v->vcpu_info = (void *)alloc_xenheap_page(); - if (!v->vcpu_info) { + if (!d->shared_info) { printk("ERROR/HALTING: CAN'T ALLOC PAGE\n"); while (1); } - memset(v->vcpu_info, 0, PAGE_SIZE); - /* pin mapping */ - // FIXME: Does this belong here? Or do only at domain switch time? -#if 0 - // this is now done in ia64_new_rr7 - { - /* WARNING: following must be inlined to avoid nested fault */ - unsigned long psr = ia64_clear_ic(); - ia64_itr(0x2, IA64_TR_SHARED_INFO, SHAREDINFO_ADDR, - pte_val(pfn_pte(ia64_tpa(d->shared_info) >> PAGE_SHIFT, PAGE_KERNEL)), - PAGE_SHIFT); - ia64_set_psr(psr); - ia64_srlz_i(); - } -#endif + memset(d->shared_info, 0, PAGE_SIZE); + v->vcpu_info = &(d->shared_info->vcpu_data[0]); + d->max_pages = (128*1024*1024)/PAGE_SIZE; // 128MB default // FIXME if ((d->arch.metaphysical_rr0 = allocate_metaphysical_rr0()) == -1UL) BUG(); @@ -258,33 +277,63 @@ void arch_do_createdomain(struct vcpu *v) d->shared_info_va = 0xf100000000000000; d->arch.breakimm = 0x1000; v->arch.breakimm = d->arch.breakimm; - // stay on kernel stack because may get interrupts! - // ia64_ret_from_clone (which b0 gets in new_thread) switches - // to user stack - v->arch._thread.on_ustack = 0; + + d->arch.mm = xmalloc(struct mm_struct); + if (unlikely(!d->arch.mm)) { + printk("Can't allocate mm_struct for domain %d\n",d->domain_id); + return -ENOMEM; + } + memset(d->arch.mm, 0, sizeof(*d->arch.mm)); + d->arch.mm->pgd = pgd_alloc(d->arch.mm); + if (unlikely(!d->arch.mm->pgd)) { + printk("Can't allocate pgd for domain %d\n",d->domain_id); + return -ENOMEM; + } } #endif // CONFIG_VTI -void arch_do_boot_vcpu(struct vcpu *v) +void arch_getdomaininfo_ctxt(struct vcpu *v, struct vcpu_guest_context *c) { - return; + struct pt_regs *regs = (struct pt_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1; + + printf("arch_getdomaininfo_ctxt\n"); + c->regs = *regs; + c->vcpu = v->vcpu_info->arch; + c->shared = v->domain->shared_info->arch; } int arch_set_info_guest(struct vcpu *v, struct vcpu_guest_context *c) { - dummy(); - return 1; + struct pt_regs *regs = (struct pt_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1; + + printf("arch_set_info_guest\n"); + *regs = c->regs; + regs->cr_ipsr = IA64_PSR_IT|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_IC|IA64_PSR_I|IA64_PSR_DFH|IA64_PSR_BN|IA64_PSR_SP|IA64_PSR_DI; + regs->cr_ipsr |= 2UL << IA64_PSR_CPL0_BIT; + regs->ar_rsc |= (2 << 2); /* force PL2/3 */ + + v->vcpu_info->arch = c->vcpu; + init_all_rr(v); + + // this should be in userspace + regs->r28 = dom_fw_setup(v->domain,"nomca nosmp xencons=ttyS console=ttyS0",256L); //FIXME + v->vcpu_info->arch.banknum = 1; + v->vcpu_info->arch.metaphysical_mode = 1; + + v->domain->shared_info->arch = c->shared; + return 0; } -int arch_final_setup_guest(struct vcpu *v, struct vcpu_guest_context *c) +void arch_do_boot_vcpu(struct vcpu *v) { - dummy(); - return 1; + printf("arch_do_boot_vcpu: not implemented\n"); + return; } void domain_relinquish_resources(struct domain *d) { - dummy(); + /* FIXME */ + printf("domain_relinquish_resources: not implemented\n"); } #ifdef CONFIG_VTI @@ -294,10 +343,8 @@ void new_thread(struct vcpu *v, unsigned long start_info) { struct domain *d = v->domain; - struct switch_stack *sw; struct xen_regs *regs; struct ia64_boot_param *bp; - extern char ia64_ret_from_clone; extern char saved_command_line[]; //char *dom0_cmdline = "BOOT_IMAGE=scsi0:\EFI\redhat\xenlinux nomca root=/dev/sdb1 ro"; @@ -305,11 +352,8 @@ void new_thread(struct vcpu *v, #ifdef CONFIG_DOMAIN0_CONTIGUOUS if (d == dom0) start_pc += dom0_start; #endif - regs = (struct xen_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1; - sw = (struct switch_stack *) regs - 1; - /* Sanity Clear */ - memset(sw, 0, sizeof(struct xen_regs) + sizeof(struct switch_stack)); + regs = (struct pt_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1; if (VMX_DOMAIN(v)) { /* dt/rt/it:1;i/ic:1, si:1, vm/bn:1, ac:1 */ regs->cr_ipsr = 0x501008826008; /* Need to be expanded as macro */ @@ -320,34 +364,23 @@ void new_thread(struct vcpu *v, regs->cr_ipsr |= 2UL << IA64_PSR_CPL0_BIT; // domain runs at PL2 } regs->cr_iip = start_pc; - regs->ar_rsc = 0x0; - regs->cr_ifs = 0x0; - regs->ar_fpsr = sw->ar_fpsr = FPSR_DEFAULT; - sw->ar_bspstore = (unsigned long)v + IA64_RBS_OFFSET; - printf("new_thread: v=%p, regs=%p, sw=%p, new_rbs=%p, IA64_STK_OFFSET=%p, &r8=%p\n", - v,regs,sw,sw->ar_bspstore,IA64_STK_OFFSET,®s->r8); - printf("iip:0x%lx,ipsr:0x%lx\n", regs->cr_iip, regs->cr_ipsr); - - sw->b0 = (unsigned long) &ia64_ret_from_clone; - v->arch._thread.ksp = (unsigned long) sw - 16; - printk("new_thread, about to call init_all_rr\n"); - if (VMX_DOMAIN(v)) { + regs->cr_ifs = 0; /* why? - matthewc */ + regs->ar_fpsr = FPSR_DEFAULT; + if (VMX_DOMAIN(ed)) { vmx_init_all_rr(v); } else init_all_rr(v); - // set up boot parameters (and fake firmware) - printk("new_thread, about to call dom_fw_setup\n"); + /* should this be regs->r28 in the non-VMX case? - matthewc */ VMX_VPD(v,vgr[12]) = dom_fw_setup(d,saved_command_line,256L); //FIXME - printk("new_thread, done with dom_fw_setup\n"); - if (VMX_DOMAIN(v)) { /* Virtual processor context setup */ VMX_VPD(v, vpsr) = IA64_PSR_BN; VPD_CR(v, dcr) = 0; } else { - // don't forget to set this! v->vcpu_info->arch.banknum = 1; + /* v->vcpu_info->arch.metaphysical_mode = 1; why not? - matthewc */ } + /* d->shared_info->arch.flags = (d == dom0) ? (SIF_INITDOMAIN|SIF_PRIVILEGED|SIF_BLK_BE_DOMAIN|SIF_NET_BE_DOMAIN|SIF_USB_BE_DOMAIN) : 0; shared_info not set yet? */ } #else // CONFIG_VTI @@ -359,54 +392,27 @@ void new_thread(struct vcpu *v, unsigned long start_info) { struct domain *d = v->domain; - struct switch_stack *sw; struct pt_regs *regs; - unsigned long new_rbs; struct ia64_boot_param *bp; - extern char ia64_ret_from_clone; extern char saved_command_line[]; #ifdef CONFIG_DOMAIN0_CONTIGUOUS if (d == dom0) start_pc += dom0_start; #endif + regs = (struct pt_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1; - sw = (struct switch_stack *) regs - 1; - memset(sw,0,sizeof(struct switch_stack)+sizeof(struct pt_regs)); - new_rbs = (unsigned long) v + IA64_RBS_OFFSET; regs->cr_ipsr = ia64_getreg(_IA64_REG_PSR) | IA64_PSR_BITS_TO_SET | IA64_PSR_BN & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_RI | IA64_PSR_IS); regs->cr_ipsr |= 2UL << IA64_PSR_CPL0_BIT; // domain runs at PL2 regs->cr_iip = start_pc; - regs->ar_rsc = 0; /* lazy mode */ - regs->ar_rnat = 0; - regs->ar_fpsr = sw->ar_fpsr = FPSR_DEFAULT; - regs->loadrs = 0; - //regs->r8 = current->mm->dumpable; /* set "don't zap registers" flag */ - //regs->r8 = 0x01234567890abcdef; // FIXME: temp marker - //regs->r12 = ((unsigned long) regs - 16); /* 16 byte scratch */ regs->cr_ifs = 1UL << 63; - regs->pr = 0; - sw->pr = 0; - regs->ar_pfs = 0; - sw->caller_unat = 0; - sw->ar_pfs = 0; - sw->ar_bspstore = new_rbs; - //regs->r13 = (unsigned long) v; -printf("new_thread: v=%p, start_pc=%p, regs=%p, sw=%p, new_rbs=%p, IA64_STK_OFFSET=%p, &r8=%p\n", -v,start_pc,regs,sw,new_rbs,IA64_STK_OFFSET,®s->r8); - sw->b0 = (unsigned long) &ia64_ret_from_clone; - v->arch._thread.ksp = (unsigned long) sw - 16; - //v->thread_info->flags = 0; -printk("new_thread, about to call init_all_rr\n"); + regs->ar_fpsr = FPSR_DEFAULT; init_all_rr(v); - // set up boot parameters (and fake firmware) -printk("new_thread, about to call dom_fw_setup\n"); regs->r28 = dom_fw_setup(d,saved_command_line,256L); //FIXME -printk("new_thread, done with dom_fw_setup\n"); - // don't forget to set this! v->vcpu_info->arch.banknum = 1; - memset(v->arch._thread.fph,0,sizeof(struct ia64_fpreg)*96); + v->vcpu_info->arch.metaphysical_mode = 1; + d->shared_info->arch.flags = (d == dom0) ? (SIF_INITDOMAIN|SIF_PRIVILEGED|SIF_BLK_BE_DOMAIN|SIF_NET_BE_DOMAIN|SIF_USB_BE_DOMAIN) : 0; } #endif // CONFIG_VTI @@ -1037,21 +1043,6 @@ int construct_dom0(struct domain *d, strcpy(d->name,"Domain0"); #endif - // prepare domain0 pagetable (maps METAphysical to physical) - // following is roughly mm_init() in linux/kernel/fork.c - d->arch.mm = xmalloc(struct mm_struct); - if (unlikely(!d->arch.mm)) { - printk("Can't allocate mm_struct for domain0\n"); - return -ENOMEM; - } - memset(d->arch.mm, 0, sizeof(*d->arch.mm)); - d->arch.mm->pgd = pgd_alloc(d->arch.mm); - if (unlikely(!d->arch.mm->pgd)) { - printk("Can't allocate pgd for domain0\n"); - return -ENOMEM; - } - - /* Mask all upcalls... */ for ( i = 0; i < MAX_VIRT_CPUS; i++ ) d->shared_info->vcpu_data[i].evtchn_upcall_mask = 1; @@ -1146,19 +1137,6 @@ int construct_domU(struct domain *d, printk("parsedomainelfimage returns %d\n",rc); if ( rc != 0 ) return rc; - d->arch.mm = xmalloc(struct mm_struct); - if (unlikely(!d->arch.mm)) { - printk("Can't allocate mm_struct for domain %d\n",d->domain_id); - return -ENOMEM; - } - memset(d->arch.mm, 0, sizeof(*d->arch.mm)); - d->arch.mm->pgd = pgd_alloc(d->arch.mm); - if (unlikely(!d->arch.mm->pgd)) { - printk("Can't allocate pgd for domain %d\n",d->domain_id); - return -ENOMEM; - } - - /* Mask all upcalls... */ for ( i = 0; i < MAX_VIRT_CPUS; i++ ) d->shared_info->vcpu_data[i].evtchn_upcall_mask = 1; @@ -1231,10 +1209,10 @@ void machine_halt(void) while(1); } -void dummy(void) +void dummy_called(char *function) { if (platform_is_hp_ski()) asm("break 0;;"); - printf("dummy called: spinning....\n"); + printf("dummy called in %s: spinning....\n", function); while(1); } diff --git a/xen/arch/ia64/hypercall.c b/xen/arch/ia64/hypercall.c index 0fcc6f7cf8..64947ac59c 100644 --- a/xen/arch/ia64/hypercall.c +++ b/xen/arch/ia64/hypercall.c @@ -19,8 +19,6 @@ extern unsigned long translate_domain_mpaddr(unsigned long); extern struct ia64_sal_retval pal_emulator_static(UINT64); extern struct ia64_sal_retval sal_emulator(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64); -void fooefi(void) {} - int ia64_hypercall (struct pt_regs *regs) { @@ -122,6 +120,28 @@ ia64_hypercall (struct pt_regs *regs) case 0xfffb: // test dummy hypercall regs->r8 = domU_staging_read_8(vcpu_get_gr(v,32)); break; + + case __HYPERVISOR_dom0_op: + regs->r8 = do_dom0_op(regs->r14); + break; + + case __HYPERVISOR_dom_mem_op: + /* regs->r8 = do_dom_mem_op(regs->r14, regs->r15, regs->r16, regs->r17, regs->r18); */ + /* we don't handle reservations; just return success */ + regs->r8 = regs->r16; + break; + + case __HYPERVISOR_event_channel_op: + regs->r8 = do_event_channel_op(regs->r14); + break; + + case __HYPERVISOR_console_io: + regs->r8 = do_console_io(regs->r14, regs->r15, regs->r16); + break; + + default: + printf("unknown hypercall %x\n", regs->r2); + regs->r8 = (unsigned long)-1; } return 1; } diff --git a/xen/arch/ia64/patch/linux-2.6.11/uaccess.h b/xen/arch/ia64/patch/linux-2.6.11/uaccess.h new file mode 100644 index 0000000000..def5aaac47 --- /dev/null +++ b/xen/arch/ia64/patch/linux-2.6.11/uaccess.h @@ -0,0 +1,22 @@ +--- ../../linux-2.6.11/include/asm-ia64/uaccess.h 2005-06-06 10:36:23.000000000 -0600 ++++ include/asm-ia64/uaccess.h 2005-06-10 18:08:06.000000000 -0600 +@@ -60,6 +60,11 @@ + * address TASK_SIZE is never valid. We also need to make sure that the address doesn't + * point inside the virtually mapped linear page table. + */ ++#ifdef XEN ++/* VT-i reserves bit 60 for the VMM; guest addresses have bit 60 = bit 59 */ ++#define IS_VMM_ADDRESS(addr) ((((addr) >> 60) ^ ((addr) >> 59)) & 1) ++#define __access_ok(addr, size, segment) (!IS_VMM_ADDRESS((unsigned long)(addr))) ++#else + #define __access_ok(addr, size, segment) \ + ({ \ + __chk_user_ptr(addr); \ +@@ -67,6 +72,7 @@ + && ((segment).seg == KERNEL_DS.seg \ + || likely(REGION_OFFSET((unsigned long) (addr)) < RGN_MAP_LIMIT))); \ + }) ++#endif + #define access_ok(type, addr, size) __access_ok((addr), (size), get_fs()) + + static inline int diff --git a/xen/arch/ia64/tools/mkbuildtree b/xen/arch/ia64/tools/mkbuildtree index 5964c836c8..18d0c72c67 100644 --- a/xen/arch/ia64/tools/mkbuildtree +++ b/xen/arch/ia64/tools/mkbuildtree @@ -259,7 +259,7 @@ softlink include/asm-ia64/string.h include/asm-ia64/string.h softlink include/asm-ia64/thread_info.h include/asm-ia64/thread_info.h softlink include/asm-ia64/timex.h include/asm-ia64/timex.h softlink include/asm-ia64/topology.h include/asm-ia64/topology.h -softlink include/asm-ia64/uaccess.h include/asm-ia64/uaccess.h +cp_patch include/asm-ia64/uaccess.h include/asm-ia64/uaccess.h uaccess.h softlink include/asm-ia64/unaligned.h include/asm-ia64/unaligned.h softlink include/asm-ia64/unistd.h include/asm-ia64/unistd.h softlink include/asm-ia64/unwind.h include/asm-ia64/unwind.h diff --git a/xen/arch/ia64/vcpu.c b/xen/arch/ia64/vcpu.c index b55e5b6bd7..9ba20cd11e 100644 --- a/xen/arch/ia64/vcpu.c +++ b/xen/arch/ia64/vcpu.c @@ -539,7 +539,7 @@ void vcpu_pend_interrupt(VCPU *vcpu, UINT64 vector) } else #endif // CONFIG_VTI { - if (!test_bit(vector,PSCB(vcpu,delivery_mask))) return; + /* if (!test_bit(vector,PSCB(vcpu,delivery_mask))) return; */ if (test_bit(vector,PSCBX(vcpu,irr))) { //printf("vcpu_pend_interrupt: overrun\n"); } @@ -569,10 +569,10 @@ UINT64 vcpu_check_pending_interrupts(VCPU *vcpu) UINT64 *p, *q, *r, bits, bitnum, mask, i, vector; p = &PSCBX(vcpu,irr[3]); - q = &PSCB(vcpu,delivery_mask[3]); + /* q = &PSCB(vcpu,delivery_mask[3]); */ r = &PSCBX(vcpu,insvc[3]); for (i = 3; ; p--, q--, r--, i--) { - bits = *p & *q; + bits = *p /* & *q */; if (bits) break; // got a potential interrupt if (*r) { // nothing in this word which is pending+inservice diff --git a/xen/arch/ia64/xenmisc.c b/xen/arch/ia64/xenmisc.c index bb9f83019a..6703b397ab 100644 --- a/xen/arch/ia64/xenmisc.c +++ b/xen/arch/ia64/xenmisc.c @@ -63,13 +63,7 @@ void sync_lazy_execstate_mask(cpumask_t mask) {} void sync_lazy_execstate_all(void) {} int grant_table_create(struct domain *d) { return 0; } -void grant_table_destroy(struct domain *d) -{ - printf("grant_table_destroy: domain_destruct not tested!!!\n"); - printf("grant_table_destroy: ensure atomic_* calls work in domain_destruct!!\n"); - dummy(); - return; -} +void grant_table_destroy(struct domain *d) { return; } struct pt_regs *guest_cpu_user_regs(void) { return ia64_task_regs(current); } diff --git a/xen/include/asm-ia64/config.h b/xen/include/asm-ia64/config.h index 442d49a382..9df0d907aa 100644 --- a/xen/include/asm-ia64/config.h +++ b/xen/include/asm-ia64/config.h @@ -177,8 +177,7 @@ void sort_main_extable(void); // see include/asm-x86/atomic.h (different from standard linux) #define _atomic_set(v,i) (((v).counter) = (i)) #define _atomic_read(v) ((v).counter) -// FIXME following needs work -#define atomic_compareandswap(old, new, v) old +#define atomic_compareandswap(old, new, v) ((atomic_t){ cmpxchg(v, _atomic_read(old), _atomic_read(new)) }) // see include/asm-ia64/mm.h, handle remaining pfn_info uses until gone #define pfn_info page @@ -227,6 +226,8 @@ struct screen_info { }; #define FORCE_CRASH() asm("break 0;;"); +#define dummy() dummy_called(__FUNCTION__) + // these declarations got moved at some point, find a better place for them extern int ht_per_core; diff --git a/xen/include/asm-ia64/domain.h b/xen/include/asm-ia64/domain.h index 0f0e37895b..83d2542a73 100644 --- a/xen/include/asm-ia64/domain.h +++ b/xen/include/asm-ia64/domain.h @@ -11,9 +11,6 @@ extern void arch_do_createdomain(struct vcpu *); -extern int arch_final_setup_guestos( - struct vcpu *, struct vcpu_guest_context *); - extern void domain_relinquish_resources(struct domain *); #ifdef CONFIG_VTI diff --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h index ec00554959..6f0c499531 100644 --- a/xen/include/public/arch-ia64.h +++ b/xen/include/public/arch-ia64.h @@ -64,18 +64,25 @@ typedef struct { unsigned long krs[8]; // kernel registers unsigned long pkrs[8]; // protection key registers unsigned long tmp[8]; // temp registers (e.g. for hyperprivops) -//} PACKED arch_shared_info_t; +//} PACKED arch_vcpu_info_t; } arch_vcpu_info_t; // DON'T PACK typedef struct { + int evtchn_vector; + int domain_controller_evtchn; + unsigned int flags; +//} PACKED arch_shared_info_t; } arch_shared_info_t; // DON'T PACK /* * The following is all CPU context. Note that the i387_ctxt block is filled * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used. */ +#include <asm/ptrace.h> typedef struct vcpu_guest_context { - //unsigned long flags; + struct pt_regs regs; + arch_vcpu_info_t vcpu; + arch_shared_info_t shared; } PACKED vcpu_guest_context_t; #endif /* !__ASSEMBLY__ */ |