[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] merge
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID eeac4fdf02ed4c2aec9793517ea441fe538ee326 # Parent 7edd64c8bb36c9d0c30f3e7a5a79f75501f2e280 # Parent 385ddb11971dc36eea9d07ebcd1635c8153cc86d merge diff -r 7edd64c8bb36 -r eeac4fdf02ed linux-2.6-xen-sparse/arch/ia64/Kconfig --- a/linux-2.6-xen-sparse/arch/ia64/Kconfig Thu Mar 2 09:59:34 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/Kconfig Thu Mar 2 10:00:49 2006 @@ -75,6 +75,11 @@ default y config XEN_BLKDEV_FRONTEND + depends on XEN + bool + default y + +config XEN_BLKDEV_BACKEND depends on XEN bool default y @@ -495,6 +500,7 @@ config KPROBES bool "Kprobes (EXPERIMENTAL)" + depends on EXPERIMENTAL && MODULES help Kprobes allows you to trap at almost any kernel address and execute a callback function. register_kprobe() establishes diff -r 7edd64c8bb36 -r eeac4fdf02ed linux-2.6-xen-sparse/arch/ia64/kernel/head.S --- a/linux-2.6-xen-sparse/arch/ia64/kernel/head.S Thu Mar 2 09:59:34 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/head.S Thu Mar 2 10:00:49 2006 @@ -363,6 +363,12 @@ ;; (isBP) st8 [r2]=r28 // save the address of the boot param area passed by the bootloader +#ifdef CONFIG_XEN + // Note: isBP is used by the subprogram. + br.call.sptk.many rp=early_xen_setup + ;; +#endif + #ifdef CONFIG_SMP (isAP) br.call.sptk.many rp=start_secondary .ret0: @@ -371,10 +377,6 @@ // This is executed by the bootstrap processor (bsp) only: -#ifdef CONFIG_XEN - br.call.sptk.many rp=early_xen_setup - ;; -#endif #ifdef CONFIG_IA64_FW_EMU // initialize PAL & SAL emulator: br.call.sptk.many rp=sys_fw_init diff -r 7edd64c8bb36 -r eeac4fdf02ed linux-2.6-xen-sparse/arch/ia64/kernel/sal.c --- a/linux-2.6-xen-sparse/arch/ia64/kernel/sal.c Thu Mar 2 09:59:34 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/sal.c Thu Mar 2 10:00:49 2006 @@ -336,8 +336,10 @@ p += SAL_DESC_SIZE(*p); } +#ifdef CONFIG_XEN if (!running_on_xen) - check_sal_cache_flush(); +#endif + check_sal_cache_flush(); } int diff -r 7edd64c8bb36 -r eeac4fdf02ed linux-2.6-xen-sparse/arch/ia64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Thu Mar 2 09:59:34 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Thu Mar 2 10:00:49 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!" @@ -243,6 +246,14 @@ rsvd_region[n].end = (unsigned long) ia64_imva(_end); n++; +#ifdef CONFIG_XEN + if (running_on_xen) { + rsvd_region[n].start = (unsigned long)__va((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) { rsvd_region[n].start = (unsigned long)__va(ia64_boot_param->initrd_start); @@ -260,6 +271,7 @@ n++; num_rsvd_regions = n; + BUG_ON(IA64_MAX_RSVD_REGIONS + 1 < n); sort_regions(rsvd_region, num_rsvd_regions); } diff -r 7edd64c8bb36 -r eeac4fdf02ed 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 Thu Mar 2 09:59:34 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c Thu Mar 2 10:00:49 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 7edd64c8bb36 -r eeac4fdf02ed linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S --- a/linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S Thu Mar 2 09:59:34 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S Thu Mar 2 10:00:49 2006 @@ -14,20 +14,22 @@ running_on_xen: data4 0 +#define isBP p3 // are we the Bootstrap Processor? + .text GLOBAL_ENTRY(early_xen_setup) - mov r8=cr.dcr;; - extr.u r8=r8,63,1 - movl r9=running_on_xen;; - st4 [r9]=r8;; + mov r8=cr.dcr +(isBP) movl r9=running_on_xen;; + extr.u r8=r8,63,1;; cmp.ne p7,p0=r8,r0;; +(isBP) st4 [r9]=r8 (p7) movl r10=xen_ivt;; (p7) mov cr.iva=r10 br.ret.sptk.many rp;; -END(xen_init) +END(early_xen_setup) GLOBAL_ENTRY(is_running_on_xen) movl r9=running_on_xen;; - ld4 r8=[r9];; + ld4 r8=[r9] br.ret.sptk.many rp;; END(is_running_on_xen) diff -r 7edd64c8bb36 -r eeac4fdf02ed linux-2.6-xen-sparse/include/asm-ia64/hypercall.h --- a/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Thu Mar 2 09:59:34 2006 +++ b/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Thu Mar 2 10:00:49 2006 @@ -37,8 +37,6 @@ #include <asm/page.h> #define virt_to_machine(v) __pa(v) #define machine_to_virt(m) __va(m) -//#define virt_to_mfn(v) (__pa(v) >> 14) -//#define mfn_to_virt(m) (__va(m << 14)) #define virt_to_mfn(v) ((__pa(v)) >> PAGE_SHIFT) #define mfn_to_virt(m) (__va((m) << PAGE_SHIFT)) @@ -46,455 +44,210 @@ * Assembler stubs for hyper-calls. */ -#if 0 -static inline int -HYPERVISOR_set_trap_table( - trap_info_t *table) -{ -#if 0 - int ret; - unsigned long ignore; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ignore) - : "0" (__HYPERVISOR_set_trap_table), "1" (table) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_mmu_update( - mmu_update_t *req, int count, int *success_count, domid_t domid) -{ -#if 0 - int ret; - unsigned long ign1, ign2, ign3, ign4; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) - : "0" (__HYPERVISOR_mmu_update), "1" (req), "2" (count), - "3" (success_count), "4" (domid) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_mmuext_op( - struct mmuext_op *op, int count, int *success_count, domid_t domid) -{ -#if 0 - int ret; - unsigned long ign1, ign2, ign3, ign4; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) - : "0" (__HYPERVISOR_mmuext_op), "1" (op), "2" (count), - "3" (success_count), "4" (domid) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_set_gdt( - unsigned long *frame_list, int entries) -{ -#if 0 - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_set_gdt), "1" (frame_list), "2" (entries) - : "memory" ); - - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_stack_switch( - unsigned long ss, unsigned long esp) -{ -#if 0 - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_stack_switch), "1" (ss), "2" (esp) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_set_callbacks( - unsigned long event_selector, unsigned long event_address, - unsigned long failsafe_selector, unsigned long failsafe_address) -{ -#if 0 - int ret; - unsigned long ign1, ign2, ign3, ign4; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) - : "0" (__HYPERVISOR_set_callbacks), "1" (event_selector), - "2" (event_address), "3" (failsafe_selector), "4" (failsafe_address) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_fpu_taskswitch( - int set) -{ -#if 0 - int ret; - unsigned long ign; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_fpu_taskswitch), "1" (set) - : "memory" ); - - return ret; -#endif - return 1; -} +#define _hypercall0(type, name) \ +({ \ + long __res; \ + __asm__ __volatile__ (";;\n" \ + "mov r2=%1\n" \ + "break 0x1000 ;;\n" \ + "mov %0=r8 ;;\n" \ + : "=r" (__res) \ + : "i" (__HYPERVISOR_##name) \ + : "r2","r8", \ + "memory" ); \ + (type)__res; \ +}) + +#define _hypercall1(type, name, a1) \ +({ \ + long __res; \ + __asm__ __volatile__ (";;\n" \ + "mov r14=%2\n" \ + "mov r2=%1\n" \ + "break 0x1000 ;;\n" \ + "mov %0=r8 ;;\n" \ + : "=r" (__res) \ + : "i" (__HYPERVISOR_##name), \ + "r" ((unsigned long)(a1)) \ + : "r14","r2","r8", \ + "memory" ); \ + (type)__res; \ +}) + +#define _hypercall2(type, name, a1, a2) \ +({ \ + long __res; \ + __asm__ __volatile__ (";;\n" \ + "mov r14=%2\n" \ + "mov r15=%3\n" \ + "mov r2=%1\n" \ + "break 0x1000 ;;\n" \ + "mov %0=r8 ;;\n" \ + : "=r" (__res) \ + : "i" (__HYPERVISOR_##name), \ + "r" ((unsigned long)(a1)), \ + "r" ((unsigned long)(a2)) \ + : "r14","r15","r2","r8", \ + "memory" ); \ + (type)__res; \ +}) + +#define _hypercall3(type, name, a1, a2, a3) \ +({ \ + long __res; \ + __asm__ __volatile__ (";;\n" \ + "mov r14=%2\n" \ + "mov r15=%3\n" \ + "mov r16=%4\n" \ + "mov r2=%1\n" \ + "break 0x1000 ;;\n" \ + "mov %0=r8 ;;\n" \ + : "=r" (__res) \ + : "i" (__HYPERVISOR_##name), \ + "r" ((unsigned long)(a1)), \ + "r" ((unsigned long)(a2)), \ + "r" ((unsigned long)(a3)) \ + : "r14","r15","r16","r2","r8", \ + "memory" ); \ + (type)__res; \ +}) + +#define _hypercall4(type, name, a1, a2, a3, a4) \ +({ \ + long __res; \ + __asm__ __volatile__ (";;\n" \ + "mov r14=%2\n" \ + "mov r15=%3\n" \ + "mov r16=%4\n" \ + "mov r17=%5\n" \ + "mov r2=%1\n" \ + "break 0x1000 ;;\n" \ + "mov %0=r8 ;;\n" \ + : "=r" (__res) \ + : "i" (__HYPERVISOR_##name), \ + "r" ((unsigned long)(a1)), \ + "r" ((unsigned long)(a2)), \ + "r" ((unsigned long)(a3)), \ + "r" ((unsigned long)(a4)) \ + : "r14","r15","r16","r2","r8", \ + "r17","memory" ); \ + (type)__res; \ +}) + +#define _hypercall5(type, name, a1, a2, a3, a4, a5) \ +({ \ + long __res; \ + __asm__ __volatile__ (";;\n" \ + "mov r14=%2\n" \ + "mov r15=%3\n" \ + "mov r16=%4\n" \ + "mov r17=%5\n" \ + "mov r18=%6\n" \ + "mov r2=%1\n" \ + "break 0x1000 ;;\n" \ + "mov %0=r8 ;;\n" \ + : "=r" (__res) \ + : "i" (__HYPERVISOR_##name), \ + "r" ((unsigned long)(a1)), \ + "r" ((unsigned long)(a2)), \ + "r" ((unsigned long)(a3)), \ + "r" ((unsigned long)(a4)), \ + "r" ((unsigned long)(a5)) \ + : "r14","r15","r16","r2","r8", \ + "r17","r18","memory" ); \ + (type)__res; \ +}) static inline int HYPERVISOR_sched_op( int cmd, unsigned long arg) { - return 1; -} - -static inline int -HYPERVISOR_suspend( - unsigned long srec) -{ - return 1; + return _hypercall2(int, sched_op, cmd, arg); } static inline long HYPERVISOR_set_timer_op( u64 timeout) { -#if 0 - int ret; unsigned long timeout_hi = (unsigned long)(timeout>>32); unsigned long timeout_lo = (unsigned long)timeout; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_lo), "c" (timeout_hi) - : "memory"); - - return ret; -#endif - return 1; + return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi); } static inline int HYPERVISOR_dom0_op( dom0_op_t *dom0_op) { -#if 0 - int ret; - unsigned long ign1; - dom0_op->interface_version = DOM0_INTERFACE_VERSION; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1) - : "0" (__HYPERVISOR_dom0_op), "1" (dom0_op) - : "memory"); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_set_debugreg( - int reg, unsigned long value) -{ -#if 0 - int ret; - unsigned long ign1, ign2; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_set_debugreg), "1" (reg), "2" (value) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline unsigned long -HYPERVISOR_get_debugreg( - int reg) -{ -#if 0 - unsigned long ret; - unsigned long ign; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_get_debugreg), "1" (reg) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_update_descriptor( - unsigned long ma, unsigned long word1, unsigned long word2) -{ -#if 0 - int ret; - unsigned long ign1, ign2, ign3; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) - : "0" (__HYPERVISOR_update_descriptor), "1" (ma), "2" (word1), - "3" (word2) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_set_fast_trap( - int idx) -{ -#if 0 - int ret; - unsigned long ign; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_set_fast_trap), "1" (idx) - : "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_dom_mem_op( - unsigned int op, unsigned long *extent_list, - unsigned long nr_extents, unsigned int extent_order) -{ -#if 0 - int ret; - unsigned long ign1, ign2, ign3, ign4, ign5; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4), - "=D" (ign5) - : "0" (__HYPERVISOR_dom_mem_op), "1" (op), "2" (extent_list), - "3" (nr_extents), "4" (extent_order), "5" (DOMID_SELF) - : "memory" ); - - return ret; -#endif - return 1; + return _hypercall1(int, dom0_op, dom0_op); } static inline int HYPERVISOR_multicall( void *call_list, int nr_calls) { -#if 0 - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_multicall), "1" (call_list), "2" (nr_calls) - : "memory" ); - - return ret; -#endif - return 1; -} -#endif - -static inline int -HYPERVISOR_update_va_mapping( - unsigned long va, pte_t new_val, unsigned long flags) -{ - /* no-op */ - return 1; + return _hypercall2(int, multicall, call_list, nr_calls); } static inline int HYPERVISOR_memory_op( unsigned int cmd, void *arg) { - int ret; - __asm__ __volatile__ ( ";; mov r14=%2 ; mov r15=%3 ; mov r2=%1 ; break 0x1000 ;; mov %0=r8 ;;" - : "=r" (ret) - : "i" (__HYPERVISOR_memory_op), "r"(cmd), "r"(arg) - : "r14","r15","r2","r8","memory" ); - return ret; + return _hypercall2(int, memory_op, cmd, arg); } static inline int HYPERVISOR_event_channel_op( void *op) { - int ret; - __asm__ __volatile__ ( ";; mov r14=%2 ; mov r2=%1 ; break 0x1000 ;; mov %0=r8 ;;" - : "=r" (ret) - : "i" (__HYPERVISOR_event_channel_op), "r"(op) - : "r14","r2","r8","memory" ); - return ret; -} - -#if 0 + return _hypercall1(int, event_channel_op, op); +} + static inline int HYPERVISOR_xen_version( - int cmd) -{ -#if 0 - int ret; - unsigned long ignore; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ignore) - : "0" (__HYPERVISOR_xen_version), "1" (cmd) - : "memory" ); - - return ret; -#endif - return 1; -} -#endif + int cmd, void *arg) +{ + return _hypercall2(int, xen_version, cmd, arg); +} static inline int HYPERVISOR_console_io( int cmd, int count, char *str) { - int ret; - __asm__ __volatile__ ( ";; mov r14=%2 ; mov r15=%3 ; mov r16=%4 ; mov r2=%1 ; break 0x1000 ;; mov %0=r8 ;;" - : "=r" (ret) - : "i" (__HYPERVISOR_console_io), "r"(cmd), "r"(count), "r"(str) - : "r14","r15","r16","r2","r8","memory" ); - return ret; -} - -#if 0 + return _hypercall3(int, console_io, cmd, count, str); +} + static inline int HYPERVISOR_physdev_op( void *physdev_op) { -#if 0 - int ret; - unsigned long ign; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_physdev_op), "1" (physdev_op) - : "memory" ); - - return ret; -#endif - return 1; -} -#endif + return _hypercall1(int, physdev_op, physdev_op); +} static inline int HYPERVISOR_grant_table_op( unsigned int cmd, void *uop, unsigned int count) { - int ret; - __asm__ __volatile__ ( ";; mov r14=%2 ; mov r15=%3 ; mov r16=%4 ; mov r2=%1 ; break 0x1000 ;; mov %0=r8 ;;" - : "=r" (ret) - : "i" (__HYPERVISOR_grant_table_op), "r"(cmd), "r"(uop), "r"(count) - : "r14","r15","r16","r2","r8","memory" ); - return ret; -} - -#if 0 -static inline int -HYPERVISOR_update_va_mapping_otherdomain( - unsigned long va, pte_t new_val, unsigned long flags, domid_t domid) -{ -#if 0 - int ret; - unsigned long ign1, ign2, ign3, ign4; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) - : "0" (__HYPERVISOR_update_va_mapping_otherdomain), - "1" (va), "2" ((new_val).pte_low), "3" (flags), "4" (domid) : - "memory" ); - - return ret; -#endif - return 1; -} - -static inline int -HYPERVISOR_vm_assist( - unsigned int cmd, unsigned int type) -{ -#if 0 - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_vm_assist), "1" (cmd), "2" (type) - : "memory" ); - - return ret; -#endif - return 1; -} - -#endif + return _hypercall3(int, grant_table_op, cmd, uop, count); +} + +static inline int +HYPERVISOR_vcpu_op( + int cmd, int vcpuid, void *extra_args) +{ + return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args); +} + +static inline int +HYPERVISOR_suspend( + unsigned long srec) +{ + return _hypercall3(int, sched_op, SCHEDOP_shutdown, + SHUTDOWN_suspend, srec); +} + +extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs); +static inline void exit_idle(void) {} +#define do_IRQ(irq, regs) __do_IRQ((irq), (regs)) #endif /* __HYPERCALL_H__ */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/asm-xsi-offsets.c --- a/xen/arch/ia64/asm-xsi-offsets.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/asm-xsi-offsets.c Thu Mar 2 10:00:49 2006 @@ -84,8 +84,6 @@ DEFINE(XSI_PEND, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, pending_interruption))); DEFINE(XSI_INCOMPL_REGFR_OFS, offsetof(mapped_regs_t, incomplete_regframe)); DEFINE(XSI_INCOMPL_REGFR, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, incomplete_regframe))); - DEFINE(XSI_DELIV_MASK0_OFS, offsetof(mapped_regs_t, delivery_mask[0])); - DEFINE(XSI_DELIV_MASK0, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, delivery_mask[0]))); DEFINE(XSI_METAPHYS_OFS, offsetof(mapped_regs_t, metaphysical_mode)); DEFINE(XSI_METAPHYS, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, metaphysical_mode))); diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux-xen/README.origin --- a/xen/arch/ia64/linux-xen/README.origin Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux-xen/README.origin Thu Mar 2 10:00:49 2006 @@ -5,19 +5,24 @@ # (e.g. with #ifdef XEN or XEN in a comment) so that they can be # easily updated to future versions of the corresponding Linux files. -efi.c -> linux/arch/ia64/kernel/efi.c -entry.h -> linux/arch/ia64/kernel/entry.h -entry.S -> linux/arch/ia64/kernel/entry.S -hpsim_ssc.h -> linux/arch/ia64/hp/sim/hpsim_ssc.h -irq_ia64.c -> linux/arch/ia64/kernel/irq_ia64.c -minstate.h -> linux/arch/ia64/kernel/minstate.h -mm_contig.c -> linux/arch/ia64/mm/contig.c -pal.S -> linux/arch/ia64/kernel/pal.S -sal.c -> linux/arch/ia64/kernel/sal.c -setup.c -> linux/arch/ia64/kernel/setup.c -smp.c -> linux/arch/ia64/kernel/smp.c -smpboot.c -> linux/arch/ia64/kernel/smpboot.c -sort.c -> linux/lib/sort.c -time.c -> linux/arch/ia64/kernel/time.c -tlb.c -> linux/arch/ia64/mm/tlb.c -unaligned.c -> linux/arch/ia64/kernel/unaligned.c +efi.c -> linux/arch/ia64/kernel/efi.c +entry.h -> linux/arch/ia64/kernel/entry.h +entry.S -> linux/arch/ia64/kernel/entry.S +head.S -> linux/arch/ia64/kernel/head.S +hpsim_ssc.h -> linux/arch/ia64/hp/sim/hpsim_ssc.h +irq_ia64.c -> linux/arch/ia64/kernel/irq_ia64.c +minstate.h -> linux/arch/ia64/kernel/minstate.h +mm_contig.c -> linux/arch/ia64/mm/contig.c +pal.S -> linux/arch/ia64/kernel/pal.S +process-linux-xen.c -> linux/arch/ia64/kernel/process.c +sal.c -> linux/arch/ia64/kernel/sal.c +setup.c -> linux/arch/ia64/kernel/setup.c +smp.c -> linux/arch/ia64/kernel/smp.c +smpboot.c -> linux/arch/ia64/kernel/smpboot.c +sort.c -> linux/lib/sort.c +time.c -> linux/arch/ia64/kernel/time.c +tlb.c -> linux/arch/ia64/mm/tlb.c +unaligned.c -> linux/arch/ia64/kernel/unaligned.c +unwind.c -> linux/arch/ia64/kernel/unwind.c +unwind_decoder.c -> linux/arch/ia64/kernel/unwind_decoder.c +unwind_i.h -> linux/arch/ia64/kernel/unwind_i.h diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux-xen/efi.c --- a/xen/arch/ia64/linux-xen/efi.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux-xen/efi.c Thu Mar 2 10:00:49 2006 @@ -534,32 +534,9 @@ { #ifdef XEN u64 psr; - static unsigned long last_rr7 = 0; - unsigned long current_rr7 = ia64_get_rr(7L<<61); - - // this routine is called only once in Linux but may be called - // multiple times in Xen. However, we only need to flush and - // reset itr[IA64_TR_PALCODE] if rr7 changes if (!pal_vaddr) { pal_vaddr = efi_get_pal_addr (); - last_rr7 = current_rr7; - } - else if (last_rr7 == current_rr7) return; - else { - last_rr7 = current_rr7; - printk("efi_map_pal_code,remapping pal w/rr7=%lx\n",last_rr7); - } - - printf("efi_map_pal_code: about to ia64_ptr(%d,%p,%p)\n", - 0x1, GRANULEROUNDDOWN((unsigned long) pal_vaddr), - IA64_GRANULE_SHIFT); - ia64_ptr(0x1, GRANULEROUNDDOWN((unsigned long) pal_vaddr), - IA64_GRANULE_SHIFT); - ia64_srlz_i(); - printf("efi_map_pal_code: about to ia64_itr(%p,%p,%p,%p,%p)\n", - 0x1, IA64_TR_PALCODE, GRANULEROUNDDOWN((unsigned long) pal_vaddr), - pte_val(pfn_pte(__pa(pal_vaddr) >> PAGE_SHIFT, PAGE_KERNEL)), - IA64_GRANULE_SHIFT); + } #else void *pal_vaddr = efi_get_pal_addr (); u64 psr; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux-xen/irq_ia64.c --- a/xen/arch/ia64/linux-xen/irq_ia64.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux-xen/irq_ia64.c Thu Mar 2 10:00:49 2006 @@ -169,7 +169,7 @@ * handler needs to be able to wait for further keyboard interrupts, which can't * come through until ia64_eoi() has been done. */ - xen_irq_exit(regs); + irq_exit(); } #ifdef CONFIG_HOTPLUG_CPU diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux-xen/minstate.h --- a/xen/arch/ia64/linux-xen/minstate.h Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux-xen/minstate.h Thu Mar 2 10:00:49 2006 @@ -175,7 +175,7 @@ ;; \ .mem.offset 0,0; st8.spill [r16]=r13,16; \ .mem.offset 8,0; st8.spill [r17]=r21,16; /* save ar.fpsr */ \ - /* XEN mov r13=IA64_KR(CURRENT); /* establish `current' */ \ + /* XEN mov r13=IA64_KR(CURRENT);*/ /* establish `current' */ \ MINSTATE_GET_CURRENT(r13); /* XEN establish `current' */ \ ;; \ .mem.offset 0,0; st8.spill [r16]=r15,16; \ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux-xen/setup.c --- a/xen/arch/ia64/linux-xen/setup.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux-xen/setup.c Thu Mar 2 10:00:49 2006 @@ -94,6 +94,10 @@ EXPORT_SYMBOL(io_space); unsigned int num_io_spaces; +#ifdef XEN +extern void early_cmdline_parse(char **); +#endif + /* * "flush_icache_range()" needs to know what processor dependent stride size to use * when it makes i-cache(s) coherent with d-caches. @@ -500,6 +504,7 @@ paging_init(); } +#ifndef XEN /* * Display cpu info for all cpu's. */ @@ -611,14 +616,13 @@ { } -#ifndef XEN struct seq_operations cpuinfo_op = { .start = c_start, .next = c_next, .stop = c_stop, .show = show_cpuinfo }; -#endif +#endif /* XEN */ void identify_cpu (struct cpuinfo_ia64 *c) diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux-xen/unaligned.c --- a/xen/arch/ia64/linux-xen/unaligned.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux-xen/unaligned.c Thu Mar 2 10:00:49 2006 @@ -216,6 +216,7 @@ RPT(r28), RPT(r29), RPT(r30), RPT(r31) }; +#ifndef XEN static u16 fr_info[32]={ 0, /* constant : WE SHOULD NEVER GET THIS */ 0, /* constant : WE SHOULD NEVER GET THIS */ @@ -285,6 +286,7 @@ } # undef F } +#endif /* XEN */ static inline unsigned long rotate_reg (unsigned long sor, unsigned long rrb, unsigned long reg) @@ -299,12 +301,11 @@ void set_rse_reg (struct pt_regs *regs, unsigned long r1, unsigned long val, unsigned long nat) { - struct switch_stack *sw = (struct switch_stack *) regs - 1; - unsigned long *bsp, *bspstore, *addr, *rnat_addr, *ubs_end; + unsigned long *bsp, *bspstore, *addr, *rnat_addr; unsigned long *kbs = (void *) current + IA64_RBS_OFFSET; - unsigned long rnats, nat_mask; + unsigned long nat_mask; unsigned long old_rsc,new_rsc; - unsigned long on_kbs,rnat; + unsigned long rnat; long sof = (regs->cr_ifs) & 0x7f; long sor = 8 * ((regs->cr_ifs >> 14) & 0xf); long rrb_gr = (regs->cr_ifs >> 18) & 0x7f; @@ -323,7 +324,7 @@ new_rsc=old_rsc&(~0x3); ia64_set_rsc(new_rsc); - bspstore = ia64_get_bspstore(); + bspstore = (unsigned long*)ia64_get_bspstore(); bsp =kbs + (regs->loadrs >> 19);//16+3 addr = ia64_rse_skip_regs(bsp, -sof + ridx); @@ -335,7 +336,7 @@ ia64_flushrs (); ia64_mf (); *addr = val; - bspstore = ia64_get_bspstore(); + bspstore = (unsigned long*)ia64_get_bspstore(); rnat = ia64_get_rnat (); if(bspstore < rnat_addr){ rnat=rnat&(~nat_mask); @@ -362,13 +363,11 @@ static void -get_rse_reg (struct pt_regs *regs, unsigned long r1, unsigned long *val, unsigned long *nat) -{ - struct switch_stack *sw = (struct switch_stack *) regs - 1; - unsigned long *bsp, *addr, *rnat_addr, *ubs_end, *bspstore; +get_rse_reg (struct pt_regs *regs, unsigned long r1, unsigned long *val, int*nat) +{ + unsigned long *bsp, *addr, *rnat_addr, *bspstore; unsigned long *kbs = (void *) current + IA64_RBS_OFFSET; - unsigned long rnats, nat_mask; - unsigned long on_kbs; + unsigned long nat_mask; unsigned long old_rsc, new_rsc; long sof = (regs->cr_ifs) & 0x7f; long sor = 8 * ((regs->cr_ifs >> 14) & 0xf); @@ -388,7 +387,7 @@ new_rsc=old_rsc&(~(0x3)); ia64_set_rsc(new_rsc); - bspstore = ia64_get_bspstore(); + bspstore = (unsigned long*)ia64_get_bspstore(); bsp =kbs + (regs->loadrs >> 19); //16+3; addr = ia64_rse_skip_regs(bsp, -sof + ridx); @@ -399,14 +398,14 @@ ia64_flushrs (); ia64_mf (); - bspstore = ia64_get_bspstore(); + bspstore = (unsigned long*)ia64_get_bspstore(); } *val=*addr; if(nat){ if(bspstore < rnat_addr){ - *nat=!!(ia64_get_rnat()&nat_mask); + *nat=(int)!!(ia64_get_rnat()&nat_mask); }else{ - *nat = !!((*rnat_addr)&nat_mask); + *nat = (int)!!((*rnat_addr)&nat_mask); } ia64_set_rsc(old_rsc); } @@ -634,6 +633,7 @@ return rotate_reg(96, rrb_fr, (regnum - IA64_FIRST_ROTATING_FR)); } +#ifndef XEN static void setfpreg (unsigned long regnum, struct ia64_fpreg *fpval, struct pt_regs *regs) { @@ -682,6 +682,7 @@ regs->cr_ipsr |= IA64_PSR_MFL; } } +#endif /* XEN */ /* * Those 2 inline functions generate the spilled versions of the constant floating point @@ -699,6 +700,7 @@ ia64_stf_spill(final, 1); } +#ifndef XEN static void getfpreg (unsigned long regnum, struct ia64_fpreg *fpval, struct pt_regs *regs) { @@ -748,6 +750,7 @@ } } } +#endif /* XEN */ #ifdef XEN @@ -803,6 +806,7 @@ *nat = (*unat >> (addr >> 3 & 0x3f)) & 0x1UL; } +#ifndef XEN static void emulate_load_updates (update_t type, load_store_t ld, struct pt_regs *regs, unsigned long ifa) { @@ -1078,6 +1082,7 @@ return 0; } +#endif /* XEN */ /* * floating point operations sizes in bytes @@ -1153,6 +1158,7 @@ ia64_stfd(final, 6); } +#ifndef XEN static int emulate_load_floatpair (unsigned long ifa, load_store_t ld, struct pt_regs *regs) { @@ -1437,6 +1443,7 @@ return 0; } +#endif /* XEN */ void ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux-xen/unwind.c --- a/xen/arch/ia64/linux-xen/unwind.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux-xen/unwind.c Thu Mar 2 10:00:49 2006 @@ -484,7 +484,8 @@ } else if (regnum <= 15) { if (regnum <= 11) { pt = get_scratch_regs(info); - addr = &pt->f6 + (regnum - 6); + //XXX struct ia64_fpreg and struct pt_fpreg are same. + addr = (struct ia64_fpreg*)(&pt->f6 + (regnum - 6)); } else addr = &info->sw->f12 + (regnum - 12); diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux/README.origin --- a/xen/arch/ia64/linux/README.origin Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux/README.origin Thu Mar 2 10:00:49 2006 @@ -5,14 +5,15 @@ the instructions in the README there. cmdline.c -> linux/lib/cmdline.c -efi_stub.S -> linux/arch/ia64/efi_stub.S +efi_stub.S -> linux/arch/ia64/kernel/efi_stub.S extable.c -> linux/arch/ia64/mm/extable.c hpsim.S -> linux/arch/ia64/hp/sim/hpsim.S ia64_ksyms.c -> linux/arch/ia64/kernel/ia64_ksyms.c +irq_lsapic.c -> linux/arch/ia64/kernel/irq_lsapic.c linuxextable.c -> linux/kernel/extable.c machvec.c -> linux/arch/ia64/kernel/machvec.c patch.c -> linux/arch/ia64/kernel/patch.c -pcdp.h -> drivers/firmware/pcdp.h +pcdp.h -> linux/drivers/firmware/pcdp.h bitop.c -> linux/arch/ia64/lib/bitop.c clear_page.S -> linux/arch/ia64/lib/clear_page.S diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux/cmdline.c --- a/xen/arch/ia64/linux/cmdline.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux/cmdline.c Thu Mar 2 10:00:49 2006 @@ -15,6 +15,7 @@ #include <linux/module.h> #include <linux/kernel.h> #include <linux/string.h> +#include <xen/lib.h> /** diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/linux/linuxextable.c --- a/xen/arch/ia64/linux/linuxextable.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/linux/linuxextable.c Thu Mar 2 10:00:49 2006 @@ -19,6 +19,10 @@ #include <linux/init.h> #include <asm/uaccess.h> #include <asm/sections.h> + +extern void *search_module_extables(unsigned long addr); +extern void *__module_text_address(unsigned long addr); +extern void *module_text_address(unsigned long addr); extern struct exception_table_entry __start___ex_table[]; extern struct exception_table_entry __stop___ex_table[]; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/mm.c --- a/xen/arch/ia64/vmx/mm.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/mm.c Thu Mar 2 10:00:49 2006 @@ -106,17 +106,18 @@ u64 mfn, gpfn; VCPU *vcpu; mmu_update_t req; - ia64_rr rr; + /* ia64_rr rr; */ thash_cb_t *hcb; - thash_data_t entry={0},*ovl; + /* thash_data_t entry={0},*ovl; */ vcpu = current; - search_section_t sections; + /* search_section_t sections; */ hcb = vmx_vcpu_get_vtlb(vcpu); for ( i = 0; i < count; i++ ) { copy_from_user(&req, ureqs, sizeof(req)); cmd = req.ptr&3; req.ptr &= ~3; +/* if(cmd ==MMU_NORMAL_PT_UPDATE){ entry.page_flags = req.val; entry.locked = 1; @@ -133,10 +134,12 @@ if (ovl) { // generate MCA. panic("Tlb conflict!!"); - return; + return -1; } - thash_purge_and_insert(hcb, &entry); - }else if(cmd == MMU_MACHPHYS_UPDATE){ + thash_purge_and_insert(hcb, &entry, req.ptr); + }else + */ + if(cmd == MMU_MACHPHYS_UPDATE){ mfn = req.ptr >>PAGE_SHIFT; gpfn = req.val; set_machinetophys(mfn,gpfn); diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/mmio.c --- a/xen/arch/ia64/vmx/mmio.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/mmio.c Thu Mar 2 10:00:49 2006 @@ -32,6 +32,7 @@ #include <public/hvm/ioreq.h> #include <asm/mm.h> #include <asm/vmx.h> +#include <public/event_channel.h> /* struct mmio_list *lookup_mmio(u64 gpa, struct mmio_list *mio_base) @@ -135,7 +136,6 @@ struct vcpu *v = current; vcpu_iodata_t *vio; ioreq_t *p; - unsigned long addr; vio = get_vio(v->domain, v->vcpu_id); if (vio == 0) { @@ -168,7 +168,6 @@ struct vcpu *v = current; vcpu_iodata_t *vio; ioreq_t *p; - unsigned long addr; vio = get_vio(v->domain, v->vcpu_id); if (vio == 0) { @@ -406,7 +405,7 @@ { REGS *regs; IA64_BUNDLE bundle; - int slot, dir, inst_type; + int slot, dir=0, inst_type; size_t size; u64 data, value,post_update, slot1a, slot1b, temp; INST64 inst; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/pal_emul.c --- a/xen/arch/ia64/vmx/pal_emul.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/pal_emul.c Thu Mar 2 10:00:49 2006 @@ -19,6 +19,7 @@ */ #include <asm/vmx_vcpu.h> +#include <asm/pal.h> static void get_pal_parameters (VCPU *vcpu, UINT64 *gr29, @@ -180,10 +181,18 @@ static struct ia64_pal_retval pal_freq_base(VCPU *vcpu){ + struct ia64_pal_retval result; + + PAL_CALL(result,PAL_FREQ_BASE, 0, 0, 0); + return result; } static struct ia64_pal_retval pal_freq_ratios(VCPU *vcpu){ + struct ia64_pal_retval result; + + PAL_CALL(result,PAL_FREQ_RATIOS, 0, 0, 0); + return result; } static struct ia64_pal_retval @@ -229,7 +238,6 @@ static struct ia64_pal_retval pal_vm_page_size(VCPU *vcpu){ } - void pal_emul( VCPU *vcpu) { UINT64 gr28; @@ -266,9 +274,17 @@ case PAL_CACHE_WRITE: result = pal_cache_write (vcpu); break; - + case PAL_PLATFORM_ADDR: result = pal_platform_addr (vcpu); + break; + + case PAL_FREQ_RATIOS: + result = pal_freq_ratios (vcpu); + break; + + case PAL_FREQ_BASE: + result = pal_freq_base (vcpu); break; default: diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vlsapic.c --- a/xen/arch/ia64/vmx/vlsapic.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vlsapic.c Thu Mar 2 10:00:49 2006 @@ -47,6 +47,9 @@ /* * Update the checked last_itc. */ + +extern void vmx_reflect_interruption(UINT64 ifa,UINT64 isr,UINT64 iim, + UINT64 vector,REGS *regs); static void update_last_itc(vtime_t *vtm, uint64_t cur_itc) { vtm->last_itc = cur_itc; @@ -483,7 +486,7 @@ if (vector & ~0xff) { DPRINTK("vmx_vcpu_pend_interrupt: bad vector\n"); - return; + return -1; } local_irq_save(spsr); ret = test_and_set_bit(vector, &VCPU(vcpu, irr[0])); @@ -572,12 +575,13 @@ VLSAPIC_INSVC(vcpu,vec>>6) &= ~(1UL <<(vec&63)); local_irq_restore(spsr); VCPU(vcpu, eoi)=0; // overwrite the data - vmx_check_pending_irq(vcpu); + vcpu->arch.irq_new_pending=1; +// vmx_check_pending_irq(vcpu); } uint64_t guest_read_vivr(VCPU *vcpu) { - int vec, next, h_inservice; + int vec, h_inservice; uint64_t spsr; local_irq_save(spsr); @@ -609,7 +613,7 @@ vmx_reflect_interruption(0,isr,0, 12, regs); // EXT IRQ } -vhpi_detection(VCPU *vcpu) +void vhpi_detection(VCPU *vcpu) { uint64_t threshold,vhpi; tpr_t vtpr; @@ -626,7 +630,7 @@ } } -vmx_vexirq(VCPU *vcpu) +void vmx_vexirq(VCPU *vcpu) { static uint64_t vexirq_count=0; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmmu.c --- a/xen/arch/ia64/vmx/vmmu.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmmu.c Thu Mar 2 10:00:49 2006 @@ -31,39 +31,26 @@ #include <asm/hw_irq.h> #include <asm/vmx_pal_vsa.h> #include <asm/kregs.h> - -/* - * Architecture ppn is in 4KB unit while XEN - * page may be different(1<<PAGE_SHIFT). - */ -static inline u64 arch_ppn_to_xen_ppn(u64 appn) -{ - return (appn << ARCH_PAGE_SHIFT) >> PAGE_SHIFT; -} - -static inline u64 xen_ppn_to_arch_ppn(u64 xppn) -{ - return (xppn << PAGE_SHIFT) >> ARCH_PAGE_SHIFT; -} - +#include <xen/irq.h> /* * Get the machine page frame number in 16KB unit * Input: * d: */ -u64 get_mfn(domid_t domid, u64 gpfn, u64 pages) -{ - struct domain *d; - u64 i, xen_gppn, xen_mppn, mpfn; - +u64 get_mfn(struct domain *d, u64 gpfn) +{ +// struct domain *d; + u64 xen_gppn, xen_mppn, mpfn; +/* if ( domid == DOMID_SELF ) { d = current->domain; } else { d = find_domain_by_id(domid); } - xen_gppn = arch_ppn_to_xen_ppn(gpfn); + */ + xen_gppn = arch_to_xen_ppn(gpfn); xen_mppn = gmfn_to_mfn(d, xen_gppn); /* for (i=0; i<pages; i++) { @@ -72,8 +59,8 @@ } } */ - mpfn= xen_ppn_to_arch_ppn(xen_mppn); - mpfn = mpfn | (((1UL <<(PAGE_SHIFT-12))-1)&gpfn); + mpfn= xen_to_arch_ppn(xen_mppn); + mpfn = mpfn | (((1UL <<(PAGE_SHIFT-ARCH_PAGE_SHIFT))-1)&gpfn); return mpfn; } @@ -141,66 +128,67 @@ #endif } -static thash_cb_t *init_domain_vhpt(struct vcpu *d) -{ - struct page_info *page; - void *vbase,*vcur; - vhpt_special *vs; +static thash_cb_t *init_domain_vhpt(struct vcpu *d, void *vbase, void *vcur) +{ +// struct page_info *page; thash_cb_t *vhpt; PTA pta_value; - - page = alloc_domheap_pages (NULL, VCPU_TLB_ORDER, 0); +/* + page = alloc_domheap_pages (NULL, VCPU_VHPT_ORDER, 0); if ( page == NULL ) { panic("No enough contiguous memory for init_domain_mm\n"); } vbase = page_to_virt(page); printk("Allocate domain vhpt at 0x%lx\n", (u64)vbase); - memset(vbase, 0, VCPU_TLB_SIZE); - vcur = (void*)((u64)vbase + VCPU_TLB_SIZE); + memset(vbase, 0, VCPU_VHPT_SIZE); + */ +// vcur = (void*)((u64)vbase + VCPU_VHPT_SIZE); vcur -= sizeof (thash_cb_t); vhpt = vcur; vhpt->ht = THASH_VHPT; vhpt->vcpu = d; - vhpt->hash_func = machine_thash; - vcur -= sizeof (vhpt_special); - vs = vcur; +// vhpt->hash_func = machine_thash; +// vcur -= sizeof (vhpt_special); +// vs = vcur; /* Setup guest pta */ pta_value.val = 0; pta_value.ve = 1; pta_value.vf = 1; - pta_value.size = VCPU_TLB_SHIFT - 1; /* 2M */ + pta_value.size = VCPU_VHPT_SHIFT - 1; /* 16M*/ pta_value.base = ((u64)vbase) >> PTA_BASE_SHIFT; d->arch.arch_vmx.mpta = pta_value.val; - - vhpt->vs = vs; - vhpt->vs->get_mfn = get_mfn; - vhpt->vs->tag_func = machine_ttag; + +// vhpt->vs = vs; +// vhpt->vs->get_mfn = __gpfn_to_mfn_foreign; +// vhpt->vs->tag_func = machine_ttag; vhpt->hash = vbase; - vhpt->hash_sz = VCPU_TLB_SIZE/2; - vhpt->cch_buf = (u64)vbase + vhpt->hash_sz; + vhpt->hash_sz = VCPU_VHPT_SIZE/2; + vhpt->cch_buf = (void *)(vbase + vhpt->hash_sz); vhpt->cch_sz = (u64)vcur - (u64)vhpt->cch_buf; - vhpt->recycle_notifier = recycle_message; - thash_init(vhpt,VCPU_TLB_SHIFT-1); +// vhpt->recycle_notifier = recycle_message; + thash_init(vhpt,VCPU_VHPT_SHIFT-1); return vhpt; } + thash_cb_t *init_domain_tlb(struct vcpu *d) { struct page_info *page; - void *vbase,*vcur; + void *vbase, *vhptbase, *vcur; tlb_special_t *ts; thash_cb_t *tlb; - page = alloc_domheap_pages (NULL, VCPU_TLB_ORDER, 0); + page = alloc_domheap_pages (NULL, VCPU_VHPT_ORDER, 0); if ( page == NULL ) { panic("No enough contiguous memory for init_domain_mm\n"); } - vbase = page_to_virt(page); - printk("Allocate domain tlb at 0x%lx\n", (u64)vbase); - memset(vbase, 0, VCPU_TLB_SIZE); - vcur = (void*)((u64)vbase + VCPU_TLB_SIZE); + vhptbase = page_to_virt(page); + memset(vhptbase, 0, VCPU_VHPT_SIZE); + printk("Allocate domain tlb&vhpt at 0x%lx\n", (u64)vhptbase); + vbase =vhptbase + VCPU_VHPT_SIZE - VCPU_VTLB_SIZE; + vcur = (void*)((u64)vbase + VCPU_VTLB_SIZE); vcur -= sizeof (thash_cb_t); tlb = vcur; tlb->ht = THASH_TLB; @@ -208,14 +196,14 @@ vcur -= sizeof (tlb_special_t); ts = vcur; tlb->ts = ts; - tlb->ts->vhpt = init_domain_vhpt(d); - tlb->hash_func = machine_thash; + tlb->ts->vhpt = init_domain_vhpt(d,vhptbase,vbase); +// tlb->hash_func = machine_thash; tlb->hash = vbase; - tlb->hash_sz = VCPU_TLB_SIZE/2; - tlb->cch_buf = (u64)vbase + tlb->hash_sz; + tlb->hash_sz = VCPU_VTLB_SIZE/2; + tlb->cch_buf = (void *)(vbase + tlb->hash_sz); tlb->cch_sz = (u64)vcur - (u64)tlb->cch_buf; - tlb->recycle_notifier = recycle_message; - thash_init(tlb,VCPU_TLB_SHIFT-1); +// tlb->recycle_notifier = recycle_message; + thash_init(tlb,VCPU_VTLB_SHIFT-1); return tlb; } @@ -249,13 +237,14 @@ u64 psr; thash_data_t mtlb; unsigned int cl = tlb->cl; - + unsigned long mtlb_ppn; mtlb.ifa = tlb->vadr; mtlb.itir = tlb->itir & ~ITIR_RV_MASK; //vmx_vcpu_get_rr(d, mtlb.ifa, &vrr.value); mtlb.page_flags = tlb->page_flags & ~PAGE_FLAGS_RV_MASK; - mtlb.ppn = get_mfn(DOMID_SELF,tlb->ppn, 1); - if (mtlb.ppn == INVALID_MFN) + mtlb.ppn = get_mfn(d->domain,tlb->ppn); + mtlb_ppn=mtlb.ppn; + if (mtlb_ppn == INVALID_MFN) panic("Machine tlb insert with invalid mfn number.\n"); psr = ia64_clear_ic(); @@ -287,44 +276,33 @@ // ia64_srlz_i(); // return; } - -u64 machine_thash(PTA pta, u64 va) -{ - u64 saved_pta; - u64 hash_addr, tag; - unsigned long psr; - struct vcpu *v = current; - ia64_rr vrr; - - saved_pta = ia64_getreg(_IA64_REG_CR_PTA); - psr = ia64_clear_ic(); - ia64_setreg(_IA64_REG_CR_PTA, pta.val); - hash_addr = ia64_thash(va); - ia64_setreg(_IA64_REG_CR_PTA, saved_pta); - ia64_set_psr(psr); - ia64_srlz_i(); - return hash_addr; -} - -u64 machine_ttag(PTA pta, u64 va) -{ -// u64 saved_pta; -// u64 hash_addr, tag; -// u64 psr; -// struct vcpu *v = current; - -// saved_pta = ia64_getreg(_IA64_REG_CR_PTA); -// psr = ia64_clear_ic(); -// ia64_setreg(_IA64_REG_CR_PTA, pta.val); -// tag = ia64_ttag(va); +/* +u64 machine_thash(u64 va) +{ + return ia64_thash(va); +} + +u64 machine_ttag(u64 va) +{ return ia64_ttag(va); -// ia64_setreg(_IA64_REG_CR_PTA, saved_pta); -// ia64_set_psr(psr); -// ia64_srlz_i(); -// return tag; -} - - +} +*/ +thash_data_t * vsa_thash(PTA vpta, u64 va, u64 vrr, u64 *tag) +{ + u64 index,pfn,rid,pfn_bits; + pfn_bits = vpta.size-5-8; + pfn = REGION_OFFSET(va)>>_REGION_PAGE_SIZE(vrr); + rid = _REGION_ID(vrr); + index = ((rid&0xff)<<pfn_bits)|(pfn&((1UL<<pfn_bits)-1)); + *tag = ((rid>>8)&0xffff) | ((pfn >>pfn_bits)<<16); + return (thash_data_t *)((vpta.base<<PTA_BASE_SHIFT)+(index<<5)); +// return ia64_call_vsa(PAL_VPS_THASH,va,vrr,vpta,0,0,0,0); +} + +//u64 vsa_ttag(u64 va, u64 vrr) +//{ +// return ia64_call_vsa(PAL_VPS_TTAG,va,vrr,0,0,0,0,0); +//} int vhpt_enabled(VCPU *vcpu, uint64_t vadr, vhpt_ref_t ref) { @@ -371,11 +349,12 @@ * num: number of dword (8byts) to read. */ int -fetch_code(VCPU *vcpu, u64 gip, u64 *code) -{ - u64 gpip; // guest physical IP - u64 mpa; +fetch_code(VCPU *vcpu, u64 gip, u64 *code1, u64 *code2) +{ + u64 gpip=0; // guest physical IP + u64 *vpa; thash_data_t *tlb; + thash_cb_t *hcb; ia64_rr vrr; u64 mfn; @@ -384,19 +363,26 @@ } else { vmx_vcpu_get_rr(vcpu, gip, &vrr.rrval); - tlb = vtlb_lookup_ex (vmx_vcpu_get_vtlb(vcpu), - vrr.rid, gip, ISIDE_TLB ); + hcb = vmx_vcpu_get_vtlb(vcpu); + tlb = vtlb_lookup_ex (hcb, vrr.rid, gip, ISIDE_TLB ); if( tlb == NULL ) - tlb = vtlb_lookup_ex (vmx_vcpu_get_vtlb(vcpu), + tlb = vtlb_lookup_ex (hcb, vrr.rid, gip, DSIDE_TLB ); - if ( tlb == NULL ) panic("No entry found in ITLB and DTLB\n"); - gpip = (tlb->ppn << 12) | ( gip & (PSIZE(tlb->ps)-1) ); - } - mfn = gmfn_to_mfn(vcpu->domain, gpip >>PAGE_SHIFT); - if ( mfn == INVALID_MFN ) return 0; - - mpa = (gpip & (PAGE_SIZE-1)) | (mfn<<PAGE_SHIFT); - *code = *(u64*)__va(mpa); + if (tlb) + gpip = (tlb->ppn << 12) | ( gip & (PSIZE(tlb->ps)-1) ); + } + if( gpip){ + mfn = gmfn_to_mfn(vcpu->domain, gpip >>PAGE_SHIFT); + if( mfn == INVALID_MFN ) panic("fetch_code: invalid memory\n"); + vpa =(u64 *)__va( (gip & (PAGE_SIZE-1)) | (mfn<<PAGE_SHIFT)); + }else{ + tlb = vhpt_lookup(gip); + if( tlb == NULL) + panic("No entry found in ITLB and DTLB\n"); + vpa =(u64 *)__va((tlb->ppn>>(PAGE_SHIFT-ARCH_PAGE_SHIFT)<<PAGE_SHIFT)|(gip&(PAGE_SIZE-1))); + } + *code1 = *vpa++; + *code2 = *vpa; return 1; } @@ -414,19 +400,19 @@ data.vadr=PAGEALIGN(ifa,data.ps); data.tc = 1; data.cl=ISIDE_TLB; - vmx_vcpu_get_rr(vcpu, ifa, &vrr); + vmx_vcpu_get_rr(vcpu, ifa, (UINT64 *)&vrr); data.rid = vrr.rid; sections.tr = 1; sections.tc = 0; - ovl = thash_find_overlap(hcb, &data, sections); + ovl = vtr_find_overlap(hcb, &data, ISIDE_TLB); while (ovl) { // generate MCA. panic("Tlb conflict!!"); - return; - } - thash_purge_and_insert(hcb, &data); + return IA64_FAULT; + } + thash_purge_and_insert(hcb, &data, ifa); return IA64_NO_FAULT; } @@ -447,24 +433,26 @@ data.vadr=PAGEALIGN(ifa,data.ps); data.tc = 1; data.cl=DSIDE_TLB; - vmx_vcpu_get_rr(vcpu, ifa, &vrr); + vmx_vcpu_get_rr(vcpu, ifa,(UINT64 *)&vrr); data.rid = vrr.rid; sections.tr = 1; sections.tc = 0; - ovl = thash_find_overlap(hcb, &data, sections); + ovl = vtr_find_overlap(hcb, &data, DSIDE_TLB); if (ovl) { // generate MCA. panic("Tlb conflict!!"); - return; - } - thash_purge_and_insert(hcb, &data); + return IA64_FAULT; + } + thash_purge_and_insert(hcb, &data, ifa); return IA64_NO_FAULT; } /* * Return TRUE/FALSE for success of lock operation */ + +/* int vmx_lock_guest_dtc (VCPU *vcpu, UINT64 va, int lock) { @@ -478,6 +466,9 @@ preferred_size = PSIZE(vrr.ps); return thash_lock_tc(hcb, va, preferred_size, vrr.rid, DSIDE_TLB, lock); } + */ + + IA64FAULT vmx_vcpu_itr_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa, UINT64 idx) { @@ -486,6 +477,7 @@ thash_cb_t *hcb; search_section_t sections; ia64_rr vrr; + /* u64 mfn,psr; */ hcb = vmx_vcpu_get_vtlb(vcpu); data.page_flags=pte & ~PAGE_FLAGS_RV_MASK; @@ -493,21 +485,38 @@ data.vadr=PAGEALIGN(ifa,data.ps); data.tc = 0; data.cl=ISIDE_TLB; - vmx_vcpu_get_rr(vcpu, ifa, &vrr); + vmx_vcpu_get_rr(vcpu, ifa, (UINT64 *)&vrr); data.rid = vrr.rid; sections.tr = 1; sections.tc = 0; - ovl = thash_find_overlap(hcb, &data, sections); + + ovl = vtr_find_overlap(hcb, &data, ISIDE_TLB); if (ovl) { // generate MCA. panic("Tlb conflict!!"); - return; + return IA64_FAULT; } sections.tr = 0; sections.tc = 1; thash_purge_entries(hcb, &data, sections); +/* if((idx==IA64_TR_KERNEL)&&(data.ps == KERNEL_TR_PAGE_SHIFT)){ + data.contiguous=1; + } + */ thash_tr_insert(hcb, &data, ifa, idx); +/* + if((idx==IA64_TR_KERNEL)&&(data.ps == KERNEL_TR_PAGE_SHIFT)){ + mfn = __gpfn_to_mfn_foreign(vcpu->domain,arch_to_xen_ppn(data.ppn)); + data.page_flags=pte&~PAGE_FLAGS_RV_MASK; + data.ppn = xen_to_arch_ppn(mfn); + psr = ia64_clear_ic(); + ia64_itr(0x1, IA64_ITR_GUEST_KERNEL, data.vadr, data.page_flags, data.ps); + ia64_set_psr(psr); // restore psr + ia64_srlz_i(); +// return IA64_NO_FAULT; + } +*/ return IA64_NO_FAULT; } @@ -518,7 +527,7 @@ thash_cb_t *hcb; search_section_t sections; ia64_rr vrr; - + /* u64 mfn,psr; */ hcb = vmx_vcpu_get_vtlb(vcpu); data.page_flags=pte & ~PAGE_FLAGS_RV_MASK; @@ -526,21 +535,39 @@ data.vadr=PAGEALIGN(ifa,data.ps); data.tc = 0; data.cl=DSIDE_TLB; - vmx_vcpu_get_rr(vcpu, ifa, &vrr); + vmx_vcpu_get_rr(vcpu, ifa,(UINT64 *)&vrr); data.rid = vrr.rid; sections.tr = 1; sections.tc = 0; - ovl = thash_find_overlap(hcb, &data, sections); + ovl = vtr_find_overlap(hcb, &data, DSIDE_TLB); while (ovl) { // generate MCA. panic("Tlb conflict!!"); - return; + return IA64_FAULT; } sections.tr = 0; sections.tc = 1; thash_purge_entries(hcb, &data, sections); +/* + if((idx==IA64_TR_KERNEL)&&(data.ps == KERNEL_TR_PAGE_SHIFT)){ + data.contiguous=1; + } + */ thash_tr_insert(hcb, &data, ifa, idx); +/* + if((idx==IA64_TR_KERNEL)&&(data.ps == KERNEL_TR_PAGE_SHIFT)){ + mfn = __gpfn_to_mfn_foreign(vcpu->domain,arch_to_xen_ppn(data.ppn)); + data.page_flags=pte&~PAGE_FLAGS_RV_MASK; + data.ppn = xen_to_arch_ppn(mfn); + psr = ia64_clear_ic(); + ia64_itr(0x2,IA64_DTR_GUEST_KERNEL , data.vadr, data.page_flags, data.ps); + ia64_set_psr(psr); // restore psr + ia64_srlz_i(); +// return IA64_NO_FAULT; + } +*/ + return IA64_NO_FAULT; } @@ -578,7 +605,6 @@ thash_cb_t *hcb; ia64_rr vrr; search_section_t sections; - thash_data_t data, *ovl; hcb = vmx_vcpu_get_vtlb(vcpu); vrr=vmx_vcpu_rr(vcpu,vadr); sections.tr = 0; @@ -616,7 +642,7 @@ { PTA vpta; ia64_rr vrr; - u64 vhpt_offset,tmp; + u64 vhpt_offset; vmx_vcpu_get_pta(vcpu, &vpta.val); vrr=vmx_vcpu_rr(vcpu, vadr); if(vpta.vf){ @@ -686,7 +712,25 @@ *padr = (data->ppn<<12) | (vadr&(PSIZE(data->ps)-1)); return IA64_NO_FAULT; } - }else{ + } + data = vhpt_lookup(vadr); + if(data){ + if(data->p==0){ + visr.na=1; + vcpu_set_isr(vcpu,visr.val); + page_not_present(vcpu, vadr); + return IA64_FAULT; + }else if(data->ma == VA_MATTR_NATPAGE){ + visr.na = 1; + vcpu_set_isr(vcpu, visr.val); + dnat_page_consumption(vcpu, vadr); + return IA64_FAULT; + }else{ + *padr = ((*(mpt_table+arch_to_xen_ppn(data->ppn)))<<PAGE_SHIFT) | (vadr&(PAGE_SIZE-1)); + return IA64_NO_FAULT; + } + } + else{ if(!vhpt_enabled(vcpu, vadr, NA_REF)){ if(vpsr.ic){ vcpu_set_isr(vcpu, visr.val); diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_entry.S --- a/xen/arch/ia64/vmx/vmx_entry.S Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_entry.S Thu Mar 2 10:00:49 2006 @@ -34,6 +34,7 @@ #include <asm/thread_info.h> #include <asm/unistd.h> #include <asm/vhpt.h> +#include <asm/vmmu.h> #include "vmx_minstate.h" /* @@ -696,7 +697,7 @@ movl r25=PAGE_KERNEL ;; or loc5 = r25,loc5 // construct PA | page properties - mov r23 = IA64_GRANULE_SHIFT <<2 + mov r23 = VCPU_VHPT_SHIFT <<2 ;; ptr.d in3,r23 ;; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_hypercall.c --- a/xen/arch/ia64/vmx/vmx_hypercall.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_hypercall.c Thu Mar 2 10:00:49 2006 @@ -31,6 +31,11 @@ #include <xen/mm.h> #include <xen/multicall.h> #include <xen/hypercall.h> +#include <public/version.h> +#include <asm/dom_fw.h> +#include <xen/domain.h> + +extern long do_sched_op(int cmd, unsigned long arg); void hyper_not_support(void) @@ -48,7 +53,7 @@ vcpu_get_gr_nat(vcpu,17,&r33); vcpu_get_gr_nat(vcpu,18,&r34); vcpu_get_gr_nat(vcpu,19,&r35); - ret=vmx_do_mmu_update((mmu_update_t*)r32,r33,r34,r35); + ret=vmx_do_mmu_update((mmu_update_t*)r32,r33,(u64 *)r34,r35); vcpu_set_gr(vcpu, 8, ret, 0); vmx_vcpu_increment_iip(vcpu); } @@ -124,7 +129,6 @@ static int do_lock_page(VCPU *vcpu, u64 va, u64 lock) { - int i; ia64_rr rr; thash_cb_t *hcb; hcb = vmx_vcpu_get_vtlb(vcpu); @@ -136,6 +140,8 @@ * Lock guest page in vTLB, so that it's not relinquished by recycle * session when HV is servicing that hypercall. */ + +/* void hyper_lock_page(void) { //TODO: @@ -148,6 +154,7 @@ vmx_vcpu_increment_iip(vcpu); } + */ static int do_set_shared_page(VCPU *vcpu, u64 gpa) { @@ -169,7 +176,7 @@ * to xen heap. Or else, leave to domain itself to decide. */ if (likely(IS_XEN_HEAP_FRAME(virt_to_page(o_info)))) - free_xenheap_page(o_info); + free_xenheap_page((void *)o_info); } else memset(d->shared_info, 0, PAGE_SIZE); return 0; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_init.c --- a/xen/arch/ia64/vmx/vmx_init.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_init.c Thu Mar 2 10:00:49 2006 @@ -96,7 +96,7 @@ if (!(vp_env_info & VP_OPCODE)) printk("WARNING: no opcode provided from hardware(%lx)!!!\n", vp_env_info); vm_order = get_order(buffer_size); - printk("vm buffer size: %d, order: %d\n", buffer_size, vm_order); + printk("vm buffer size: %ld, order: %ld\n", buffer_size, vm_order); vmx_enabled = 1; no_vti: @@ -114,7 +114,7 @@ u64 status, tmp_base; if (!vm_buffer) { - vm_buffer = alloc_xenheap_pages(vm_order); + vm_buffer = (unsigned long)alloc_xenheap_pages(vm_order); ASSERT(vm_buffer); printk("vm_buffer: 0x%lx\n", vm_buffer); } @@ -126,7 +126,7 @@ if (status != PAL_STATUS_SUCCESS) { printk("ia64_pal_vp_init_env failed.\n"); - return -1; + return ; } if (!__vsa_base) @@ -172,7 +172,15 @@ cpuid3.number = 4; /* 5 - 1 */ vpd->vcpuid[3] = cpuid3.value; + vpd->vac.a_from_int_cr = 1; + vpd->vac.a_to_int_cr = 1; + vpd->vac.a_from_psr = 1; + vpd->vac.a_from_cpuid = 1; + vpd->vac.a_cover = 1; + vpd->vac.a_bsw = 1; + vpd->vdc.d_vmsw = 1; + return vpd; } @@ -190,7 +198,7 @@ /* ia64_ivt is function pointer, so need this tranlation */ ivt_base = (u64) &vmx_ia64_ivt; printk("ivt_base: 0x%lx\n", ivt_base); - ret = ia64_pal_vp_create(vpd, ivt_base, 0); + ret = ia64_pal_vp_create((u64 *)vpd, (u64 *)ivt_base, 0); if (ret != PAL_STATUS_SUCCESS) panic("ia64_pal_vp_create failed. \n"); } @@ -199,11 +207,10 @@ void vmx_save_state(struct vcpu *v) { - u64 status, psr; - u64 old_rr0, dom_rr7, rr0_xen_start, rr0_vhpt; + u64 status; /* FIXME: about setting of pal_proc_vector... time consuming */ - status = ia64_pal_vp_save(v->arch.privregs, 0); + status = ia64_pal_vp_save((u64 *)v->arch.privregs, 0); if (status != PAL_STATUS_SUCCESS) panic("Save vp status failed\n"); @@ -225,10 +232,7 @@ void vmx_load_state(struct vcpu *v) { - u64 status, psr; - u64 old_rr0, dom_rr7, rr0_xen_start, rr0_vhpt; - u64 pte_xen, pte_vhpt; - int i; + u64 status; status = ia64_pal_vp_restore(v->arch.privregs, 0); if (status != PAL_STATUS_SUCCESS) @@ -304,7 +308,7 @@ int vmx_alloc_contig_pages(struct domain *d) { unsigned int order; - unsigned long i, j, start, end, pgnr, conf_nr; + unsigned long i, j, start,tmp, end, pgnr, conf_nr; struct page_info *page; struct vcpu *v = d->vcpu[0]; @@ -315,57 +319,105 @@ 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); + if((conf_nr<<PAGE_SHIFT)<(1UL<<(_PAGE_SIZE_64M+1))) + panic("vti domain needs 128M memory at least\n"); +/* order = get_order_from_pages(conf_nr); if (unlikely((page = alloc_domheap_pages(d, order, 0)) == NULL)) { printk("Could not allocate order=%d pages for vmx contig alloc\n", order); return -1; } +*/ + +/* reserve contiguous 64M for linux kernel */ + + if (unlikely((page = alloc_domheap_pages(d,(KERNEL_TR_PAGE_SHIFT-PAGE_SHIFT), 0)) == NULL)) { + printk("No enough memory for vti domain!!!\n"); + return -1; + } + pgnr = page_to_mfn(page); + for (i=(1UL<<KERNEL_TR_PAGE_SHIFT);i<(1UL<<(KERNEL_TR_PAGE_SHIFT+1));i+=PAGE_SIZE,pgnr++){ + assign_domain_page(d, i, pgnr << PAGE_SHIFT); + } + + for (i = 0; i < (1UL<<KERNEL_TR_PAGE_SHIFT) ; i += PAGE_SIZE){ + if (unlikely((page = alloc_domheap_pages(d, 0, 0)) == NULL)) { + printk("No enough memory for vti domain!!!\n"); + return -1; + } + pgnr = page_to_mfn(page); + assign_domain_page(d, i, pgnr << PAGE_SHIFT); + } /* Map normal memory below 3G */ - pgnr = page_to_mfn(page); end = conf_nr << PAGE_SHIFT; - for (i = 0; - i < (end < MMIO_START ? end : MMIO_START); - i += PAGE_SIZE, pgnr++) - map_domain_page(d, i, pgnr << PAGE_SHIFT); - + tmp = end < MMIO_START ? end : MMIO_START; + for (i = (1UL<<(KERNEL_TR_PAGE_SHIFT+1)); i < tmp; i += PAGE_SIZE){ + if (unlikely((page = alloc_domheap_pages(d, 0, 0)) == NULL)) { + printk("No enough memory for vti domain!!!\n"); + return -1; + } + pgnr = page_to_mfn(page); + 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); + for (i = start; i < end; i += PAGE_SIZE){ + if (unlikely((page = alloc_domheap_pages(d, 0, 0)) == NULL)) { + printk("No enough memory for vti domain!!!\n"); + return -1; + } + pgnr = page_to_mfn(page); + assign_domain_page(d, i, pgnr << PAGE_SHIFT); + } } d->arch.max_pfn = end >> PAGE_SHIFT; - +/* order = get_order_from_pages(GFW_SIZE >> PAGE_SHIFT); if (unlikely((page = alloc_domheap_pages(d, order, 0)) == NULL)) { printk("Could not allocate order=%d pages for vmx contig alloc\n", - order); + order);` return -1; } - +*/ /* 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); - + for (i = GFW_START; i < GFW_START + GFW_SIZE; i += PAGE_SIZE, pgnr++){ + if (unlikely((page = alloc_domheap_pages(d, 0, 0)) == NULL)) { + printk("No enough memory for vti domain!!!\n"); + return -1; + } + pgnr = page_to_mfn(page); + 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"); return -1; } - +*/ /* Map for shared I/O page and xenstore */ + if (unlikely((page = alloc_domheap_pages(d, 0, 0)) == NULL)) { + printk("No enough memory for vti domain!!!\n"); + return -1; + } pgnr = page_to_mfn(page); - map_domain_page(d, IO_PAGE_START, pgnr << PAGE_SHIFT); - pgnr++; - map_domain_page(d, STORE_PAGE_START, pgnr << PAGE_SHIFT); + assign_domain_page(d, IO_PAGE_START, pgnr << PAGE_SHIFT); + + if (unlikely((page = alloc_domheap_pages(d, 0, 0)) == NULL)) { + printk("No enough memory for vti domain!!!\n"); + return -1; + } + pgnr = page_to_mfn(page); + assign_domain_page(d, STORE_PAGE_START, pgnr << PAGE_SHIFT); set_bit(ARCH_VMX_CONTIG_MEM, &v->arch.arch_vmx.flags); return 0; @@ -375,7 +427,7 @@ { ASSERT(d != dom0); /* only for non-privileged vti domain */ d->arch.vmx_platform.shared_page_va = - __va(__gpa_to_mpa(d, IO_PAGE_START)); + (unsigned long)__va(__gpa_to_mpa(d, IO_PAGE_START)); /* TEMP */ d->arch.vmx_platform.pib_base = 0xfee00000UL; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_interrupt.c --- a/xen/arch/ia64/vmx/vmx_interrupt.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_interrupt.c Thu Mar 2 10:00:49 2006 @@ -86,7 +86,7 @@ } -int +void inject_guest_interruption(VCPU *vcpu, u64 vec) { u64 viva; @@ -334,6 +334,7 @@ * @ Nat Consumption Vector * Refer to SDM Vol2 Table 5-6 & 8-1 */ + static void ir_nat_page_consumption (VCPU *vcpu, u64 vadr) { diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_irq_ia64.c --- a/xen/arch/ia64/vmx/vmx_irq_ia64.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_irq_ia64.c Thu Mar 2 10:00:49 2006 @@ -24,6 +24,8 @@ #include <asm/pgtable.h> #include <asm/system.h> +#include <asm/vcpu.h> +#include <xen/irq.h> #ifdef CONFIG_SMP # define IS_RESCHEDULE(vec) (vec == IA64_IPI_RESCHEDULE) #else @@ -126,6 +128,6 @@ * come through until ia64_eoi() has been done. */ vmx_irq_exit(); - if ( wake_dom0 && current != dom0 ) + if (current && wake_dom0 != dom0 ) vcpu_wake(dom0->vcpu[0]); } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_ivt.S --- a/xen/arch/ia64/vmx/vmx_ivt.S Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_ivt.S Thu Mar 2 10:00:49 2006 @@ -269,6 +269,10 @@ (p7)br.sptk vmx_fault_3 vmx_alt_itlb_miss_1: mov r16=cr.ifa // get address that caused the TLB miss + ;; + tbit.z p6,p7=r16,63 +(p6)br.sptk vmx_fault_3 + ;; movl r17=PAGE_KERNEL mov r24=cr.ipsr movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff) @@ -300,6 +304,10 @@ (p7)br.sptk vmx_fault_4 vmx_alt_dtlb_miss_1: mov r16=cr.ifa // get address that caused the TLB miss + ;; + tbit.z p6,p7=r16,63 +(p6)br.sptk vmx_fault_4 + ;; movl r17=PAGE_KERNEL mov r20=cr.isr movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff) @@ -397,7 +405,7 @@ ///////////////////////////////////////////////////////////////////////////////////////// // 0x3000 Entry 12 (size 64 bundles) External Interrupt (4) ENTRY(vmx_interrupt) - VMX_DBG_FAULT(12) +// VMX_DBG_FAULT(12) mov r31=pr // prepare to save predicates mov r19=12 mov r29=cr.ipsr @@ -734,7 +742,7 @@ ///////////////////////////////////////////////////////////////////////////////////////// // 0x6100 Entry 37 (size 16 bundles) Virtualization Fault ENTRY(vmx_virtualization_fault) - VMX_DBG_FAULT(37) +// VMX_DBG_FAULT(37) mov r31=pr mov r19=37 adds r16 = IA64_VCPU_CAUSE_OFFSET,r21 @@ -1138,5 +1146,5 @@ data8 hyper_not_support //hyper_boot_vcpu data8 hyper_not_support //hyper_ni_hypercall /* 25 */ data8 hyper_not_support //hyper_mmuext_op - data8 hyper_lock_page + data8 hyper_not_support //tata8 hyper_lock_page data8 hyper_set_shared_page diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_phy_mode.c --- a/xen/arch/ia64/vmx/vmx_phy_mode.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_phy_mode.c Thu Mar 2 10:00:49 2006 @@ -27,7 +27,7 @@ #include <asm/vmx_phy_mode.h> #include <xen/sched.h> #include <asm/pgtable.h> - +#include <asm/vmmu.h> int valid_mm_mode[8] = { GUEST_PHYS, /* (it, dt, rt) -> (0, 0, 0) */ INV_MODE, @@ -61,9 +61,9 @@ * data access can be satisfied though itlb entry for physical * emulation is hit. */ - SW_SELF,0, 0, SW_NOP, 0, 0, 0, SW_P2V, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + {SW_SELF,0, 0, SW_NOP, 0, 0, 0, SW_P2V}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, /* * (it,dt,rt): (0,1,1) -> (1,1,1) * This kind of transition is found in OSYa. @@ -71,17 +71,17 @@ * (it,dt,rt): (0,1,1) -> (0,0,0) * This kind of transition is found in OSYa */ - SW_NOP, 0, 0, SW_SELF,0, 0, 0, SW_P2V, + {SW_NOP, 0, 0, SW_SELF,0, 0, 0, SW_P2V}, /* (1,0,0)->(1,1,1) */ - 0, 0, 0, 0, 0, 0, 0, SW_P2V, + {0, 0, 0, 0, 0, 0, 0, SW_P2V}, /* * (it,dt,rt): (1,0,1) -> (1,1,1) * This kind of transition usually occurs when Linux returns * from the low level TLB miss handlers. * (see "arch/ia64/kernel/ivt.S") */ - 0, 0, 0, 0, 0, SW_SELF,0, SW_P2V, - 0, 0, 0, 0, 0, 0, 0, 0, + {0, 0, 0, 0, 0, SW_SELF,0, SW_P2V}, + {0, 0, 0, 0, 0, 0, 0, 0}, /* * (it,dt,rt): (1,1,1) -> (1,0,1) * This kind of transition usually occurs in Linux low level @@ -94,68 +94,18 @@ * (1,1,1)->(1,0,0) */ - SW_V2P, 0, 0, 0, SW_V2P, SW_V2P, 0, SW_SELF, + {SW_V2P, 0, 0, 0, SW_V2P, SW_V2P, 0, SW_SELF}, }; void physical_mode_init(VCPU *vcpu) { - UINT64 psr; - struct domain * d = vcpu->domain; - vcpu->arch.old_rsc = 0; vcpu->arch.mode_flags = GUEST_IN_PHY; } -extern u64 get_mfn(domid_t domid, u64 gpfn, u64 pages); -#if 0 -void -physical_itlb_miss_domn(VCPU *vcpu, u64 vadr) -{ - u64 psr; - IA64_PSR vpsr; - u64 mppn,gppn,mpp1,gpp1; - struct domain *d; - static u64 test=0; - d=vcpu->domain; - if(test) - panic("domn physical itlb miss happen\n"); - else - test=1; - vpsr.val=vmx_vcpu_get_psr(vcpu); - gppn=(vadr<<1)>>13; - mppn = get_mfn(DOMID_SELF,gppn,1); - mppn=(mppn<<12)|(vpsr.cpl<<7); - gpp1=0; - mpp1 = get_mfn(DOMID_SELF,gpp1,1); - mpp1=(mpp1<<12)|(vpsr.cpl<<7); -// if(vadr>>63) -// mppn |= PHY_PAGE_UC; -// else -// mppn |= PHY_PAGE_WB; - mpp1 |= PHY_PAGE_WB; - psr=ia64_clear_ic(); - ia64_itr(0x1, IA64_TEMP_PHYSICAL, vadr&(~0xfff), (mppn|PHY_PAGE_WB), 24); - ia64_srlz_i(); - ia64_itr(0x2, IA64_TEMP_PHYSICAL, vadr&(~0xfff), (mppn|PHY_PAGE_WB), 24); - ia64_stop(); - ia64_srlz_i(); - ia64_itr(0x1, IA64_TEMP_PHYSICAL+1, vadr&(~0x8000000000000fffUL), (mppn|PHY_PAGE_WB), 24); - ia64_srlz_i(); - ia64_itr(0x2, IA64_TEMP_PHYSICAL+1, vadr&(~0x8000000000000fffUL), (mppn|PHY_PAGE_WB), 24); - ia64_stop(); - ia64_srlz_i(); - ia64_itr(0x1, IA64_TEMP_PHYSICAL+2, gpp1&(~0xfff), mpp1, 28); - ia64_srlz_i(); - ia64_itr(0x2, IA64_TEMP_PHYSICAL+2, gpp1&(~0xfff), mpp1, 28); - ia64_stop(); - ia64_srlz_i(); - ia64_set_psr(psr); - ia64_srlz_i(); - return; -} -#endif - +extern u64 get_mfn(struct domain *d, u64 gpfn); +extern void vmx_switch_rr7(unsigned long ,shared_info_t*,void *,void *,void *); void physical_itlb_miss_dom0(VCPU *vcpu, u64 vadr) { @@ -164,7 +114,7 @@ u64 mppn,gppn; vpsr.val=vmx_vcpu_get_psr(vcpu); gppn=(vadr<<1)>>13; - mppn = get_mfn(DOMID_SELF,gppn,1); + mppn = get_mfn(vcpu->domain,gppn); mppn=(mppn<<12)|(vpsr.cpl<<7); // if(vadr>>63) // mppn |= PHY_PAGE_UC; @@ -196,7 +146,7 @@ // panic("dom n physical dtlb miss happen\n"); vpsr.val=vmx_vcpu_get_psr(vcpu); gppn=(vadr<<1)>>13; - mppn = get_mfn(DOMID_SELF,gppn,1); + mppn = get_mfn(vcpu->domain, gppn); mppn=(mppn<<12)|(vpsr.cpl<<7); if(vadr>>63) mppn |= PHY_PAGE_UC; @@ -404,7 +354,7 @@ switch_mm_mode (vcpu, old_psr, new_psr); } - return 0; + return; } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_process.c --- a/xen/arch/ia64/vmx/vmx_process.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_process.c Thu Mar 2 10:00:49 2006 @@ -47,9 +47,11 @@ #include <asm/vmx_vcpu.h> #include <asm/kregs.h> #include <asm/vmx.h> +#include <asm/vmmu.h> #include <asm/vmx_mm_def.h> #include <asm/vmx_phy_mode.h> #include <xen/mm.h> +#include <asm/vmx_pal.h> /* reset all PSR field to 0, except up,mfl,mfh,pk,dt,rt,mc,it */ #define INITIAL_PSR_VALUE_AT_INTERRUPTION 0x0000001808028034 @@ -65,7 +67,7 @@ 0x6100,0x6200,0x6300,0x6400,0x6500,0x6600,0x6700,0x6800,0x6900,0x6a00, 0x6b00,0x6c00,0x6d00,0x6e00,0x6f00,0x7000,0x7100,0x7200,0x7300,0x7400, 0x7500,0x7600,0x7700,0x7800,0x7900,0x7a00,0x7b00,0x7c00,0x7d00,0x7e00, - 0x7f00, + 0x7f00 }; @@ -74,7 +76,7 @@ UINT64 vector,REGS *regs) { VCPU *vcpu = current; - UINT64 viha,vpsr = vmx_vcpu_get_psr(vcpu); + UINT64 vpsr = vmx_vcpu_get_psr(vcpu); if(!(vpsr&IA64_PSR_IC)&&(vector!=5)){ panic("Guest nested fault!"); } @@ -92,10 +94,8 @@ IA64FAULT vmx_ia64_handle_break (unsigned long ifa, struct pt_regs *regs, unsigned long isr, unsigned long iim) { - static int first_time = 1; struct domain *d = (struct domain *) current->domain; - struct vcpu *v = (struct domain *) current; - extern unsigned long running_on_sim; + struct vcpu *v = (struct vcpu *) current; unsigned long i, sal_param[8]; #if 0 @@ -160,12 +160,12 @@ case FW_HYPERCALL_EFI_GET_TIME: { unsigned long *tv, *tc; - vcpu_get_gr_nat(v, 32, &tv); - vcpu_get_gr_nat(v, 33, &tc); + vcpu_get_gr_nat(v, 32, (u64 *)&tv); + vcpu_get_gr_nat(v, 33, (u64 *)&tc); printf("efi_get_time(%p,%p) called...",tv,tc); - tv = __va(translate_domain_mpaddr(tv)); - if (tc) tc = __va(translate_domain_mpaddr(tc)); - regs->r8 = (*efi.get_time)(tv,tc); + tv = __va(translate_domain_mpaddr((unsigned long)tv)); + if (tc) tc = __va(translate_domain_mpaddr((unsigned long)tc)); + regs->r8 = (*efi.get_time)((efi_time_t *)tv,(efi_time_cap_t *)tc); printf("and returns %lx\n",regs->r8); } break; @@ -200,12 +200,13 @@ die_if_kernel("bug check", regs, iim); vmx_reflect_interruption(ifa,isr,iim,11,regs); } + return IA64_NO_FAULT; } void save_banked_regs_to_vpd(VCPU *v, REGS *regs) { - unsigned long i, * src,* dst, *sunat, *dunat; + unsigned long i=0UL, * src,* dst, *sunat, *dunat; IA64_PSR vpsr; src=®s->r16; sunat=®s->eml_unat; @@ -262,10 +263,10 @@ * * Now hardcode the vector as 0x10 temporarily */ - if (event_pending(v)&&(!(VLSAPIC_INSVC(v,0)&(1UL<<0x10)))) { - VCPU(v, irr[0]) |= 1UL << 0x10; - v->arch.irq_new_pending = 1; - } +// if (event_pending(v)&&(!(VLSAPIC_INSVC(v,0)&(1UL<<0x10)))) { +// VCPU(v, irr[0]) |= 1UL << 0x10; +// v->arch.irq_new_pending = 1; +// } if ( v->arch.irq_new_pending ) { v->arch.irq_new_pending = 0; @@ -287,16 +288,17 @@ } /* We came here because the H/W VHPT walker failed to find an entry */ -void vmx_hpw_miss(u64 vadr , u64 vec, REGS* regs) +IA64FAULT +vmx_hpw_miss(u64 vadr , u64 vec, REGS* regs) { IA64_PSR vpsr; - CACHE_LINE_TYPE type; + CACHE_LINE_TYPE type=ISIDE_TLB; u64 vhpt_adr, gppa; ISR misr; ia64_rr vrr; // REGS *regs; - thash_cb_t *vtlb, *vhpt; - thash_data_t *data, me; + thash_cb_t *vtlb; + thash_data_t *data; VCPU *v = current; vtlb=vmx_vcpu_get_vtlb(v); #ifdef VTLB_DEBUG @@ -313,10 +315,14 @@ return; } */ + if(vadr == 0x1ea18c00 ){ + ia64_clear_ic(); + while(1); + } if(is_physical_mode(v)&&(!(vadr<<1>>62))){ if(vec==1){ physical_itlb_miss(v, vadr); - return; + return IA64_FAULT; } if(vec==2){ if(v->domain!=dom0&&__gpfn_is_io(v->domain,(vadr<<1)>>(PAGE_SHIFT+1))){ @@ -324,7 +330,7 @@ }else{ physical_dtlb_miss(v, vadr); } - return; + return IA64_FAULT; } } vrr = vmx_vcpu_rr(v, vadr); @@ -334,19 +340,25 @@ // prepare_if_physical_mode(v); - if(data=vtlb_lookup_ex(vtlb, vrr.rid, vadr,type)){ + if((data=vtlb_lookup_ex(vtlb, vrr.rid, vadr,type))!=0){ gppa = (vadr&((1UL<<data->ps)-1))+(data->ppn>>(data->ps-12)<<data->ps); if(v->domain!=dom0&&type==DSIDE_TLB && __gpfn_is_io(v->domain,gppa>>PAGE_SHIFT)){ emulate_io_inst(v, gppa, data->ma); return IA64_FAULT; } - if ( data->ps != vrr.ps ) { +// if ( data->ps != vrr.ps ) { +// machine_tlb_insert(v, data); +// } +// else { +/* if ( data->contiguous&&(!data->tc)){ machine_tlb_insert(v, data); - } - else { - thash_insert(vtlb->ts->vhpt,data,vadr); - } + } + else{ + */ + thash_vhpt_insert(vtlb->ts->vhpt,data,vadr); +// } +// } }else if(type == DSIDE_TLB){ if(!vhpt_enabled(v, vadr, misr.rs?RSE_REF:DATA_REF)){ if(vpsr.ic){ @@ -366,8 +378,7 @@ } else{ vmx_vcpu_thash(v, vadr, &vhpt_adr); vrr=vmx_vcpu_rr(v,vhpt_adr); - data = vtlb_lookup_ex(vtlb, vrr.rid, vhpt_adr, DSIDE_TLB); - if(data){ + if(vhpt_lookup(vhpt_adr) || vtlb_lookup_ex(vtlb, vrr.rid, vhpt_adr, DSIDE_TLB)){ if(vpsr.ic){ vcpu_set_isr(v, misr.val); dtlb_fault(v, vadr); @@ -410,8 +421,7 @@ } else{ vmx_vcpu_thash(v, vadr, &vhpt_adr); vrr=vmx_vcpu_rr(v,vhpt_adr); - data = vtlb_lookup_ex(vtlb, vrr.rid, vhpt_adr, DSIDE_TLB); - if(data){ + if(vhpt_lookup(vhpt_adr) || vtlb_lookup_ex(vtlb, vrr.rid, vhpt_adr, DSIDE_TLB)){ if(!vpsr.ic){ misr.ni=1; } @@ -428,6 +438,5 @@ } } } -} - - + return IA64_NO_FAULT; +} diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_utility.c --- a/xen/arch/ia64/vmx/vmx_utility.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_utility.c Thu Mar 2 10:00:49 2006 @@ -307,9 +307,8 @@ } return 0; } - - panic ("Unsupported CR"); + return 0; } @@ -600,7 +599,6 @@ void set_isr_for_priv_fault(VCPU *vcpu, u64 non_access) { - u64 value; ISR isr; isr.val = set_isr_ei_ni(vcpu); diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_vcpu.c --- a/xen/arch/ia64/vmx/vmx_vcpu.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_vcpu.c Thu Mar 2 10:00:49 2006 @@ -35,7 +35,7 @@ #include <asm/gcc_intrin.h> #include <asm/vmx_mm_def.h> #include <asm/vmx.h> - +#include <asm/vmx_phy_mode.h> //u64 fire_itc; //u64 fire_itc2; //u64 fire_itm; @@ -66,7 +66,6 @@ #include <asm/hw_irq.h> #include <asm/vmx_pal_vsa.h> #include <asm/kregs.h> - //unsigned long last_guest_rsm = 0x0; struct guest_psr_bundle{ unsigned long ip; @@ -138,7 +137,7 @@ regs->cr_ipsr = (regs->cr_ipsr & mask ) | ( value & (~mask) ); check_mm_mode_switch(vcpu, old_psr, new_psr); - return IA64_NO_FAULT; + return ; } /* Adjust slot both in pt_regs and vpd, upon vpsr.ri which diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vmx_virt.c --- a/xen/arch/ia64/vmx/vmx_virt.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vmx_virt.c Thu Mar 2 10:00:49 2006 @@ -30,8 +30,9 @@ #include <asm/vmmu.h> #include <asm/vmx_mm_def.h> #include <asm/smp.h> - +#include <asm/vmx.h> #include <asm/virt_event.h> +#include <asm/vmx_phy_mode.h> extern UINT64 privop_trace; void @@ -137,6 +138,11 @@ *cause=EVENT_BSW_1; } } + case I: + case F: + case L: + case ILLEGAL: + break; } } @@ -157,7 +163,6 @@ { UINT64 tgt = inst.M33.r1; UINT64 val; - IA64FAULT fault; /* if ((fault = vmx_vcpu_get_psr(vcpu,&val)) == IA64_NO_FAULT) @@ -176,7 +181,6 @@ IA64FAULT vmx_emul_mov_to_psr(VCPU *vcpu, INST64 inst) { UINT64 val; - IA64FAULT fault; if(vcpu_get_gr_nat(vcpu, inst.M35.r2, &val) != IA64_NO_FAULT) panic(" get_psr nat bit fault\n"); @@ -255,7 +259,6 @@ IA64FAULT vmx_emul_ptc_l(VCPU *vcpu, INST64 inst) { u64 r2,r3; - ISR isr; IA64_PSR vpsr; vpsr.val=vmx_vcpu_get_psr(vcpu); @@ -267,6 +270,7 @@ } if(vcpu_get_gr_nat(vcpu,inst.M45.r3,&r3)||vcpu_get_gr_nat(vcpu,inst.M45.r2,&r2)){ #ifdef VMAL_NO_FAULT_CHECK + ISR isr; set_isr_reg_nat_consumption(vcpu,0,0); rnat_comsumption(vcpu); return IA64_FAULT; @@ -287,11 +291,11 @@ IA64FAULT vmx_emul_ptc_e(VCPU *vcpu, INST64 inst) { u64 r3; + IA64_PSR vpsr; + + vpsr.val=vmx_vcpu_get_psr(vcpu); +#ifdef VMAL_NO_FAULT_CHECK ISR isr; - IA64_PSR vpsr; - - vpsr.val=vmx_vcpu_get_psr(vcpu); -#ifdef VMAL_NO_FAULT_CHECK if ( vpsr.cpl != 0) { /* Inject Privileged Operation fault into guest */ set_privileged_operation_isr (vcpu, 0); @@ -321,10 +325,10 @@ IA64FAULT ptr_fault_check(VCPU *vcpu, INST64 inst, u64 *pr2, u64 *pr3) { + IA64FAULT ret1, ret2; + +#ifdef VMAL_NO_FAULT_CHECK ISR isr; - IA64FAULT ret1, ret2; - -#ifdef VMAL_NO_FAULT_CHECK IA64_PSR vpsr; vpsr.val=vmx_vcpu_get_psr(vcpu); if ( vpsr.cpl != 0) { @@ -373,9 +377,9 @@ IA64FAULT vmx_emul_thash(VCPU *vcpu, INST64 inst) { u64 r1,r3; +#ifdef CHECK_FAULT ISR visr; IA64_PSR vpsr; -#ifdef CHECK_FAULT if(check_target_register(vcpu, inst.M46.r1)){ set_illegal_op_isr(vcpu); illegal_op(vcpu); @@ -403,9 +407,11 @@ IA64FAULT vmx_emul_ttag(VCPU *vcpu, INST64 inst) { u64 r1,r3; +#ifdef CHECK_FAULT ISR visr; IA64_PSR vpsr; - #ifdef CHECK_FAULT +#endif +#ifdef CHECK_FAULT if(check_target_register(vcpu, inst.M46.r1)){ set_illegal_op_isr(vcpu); illegal_op(vcpu); @@ -433,8 +439,8 @@ IA64FAULT vmx_emul_tpa(VCPU *vcpu, INST64 inst) { u64 r1,r3; +#ifdef CHECK_FAULT ISR visr; -#ifdef CHECK_FAULT if(check_target_register(vcpu, inst.M46.r1)){ set_illegal_op_isr(vcpu); illegal_op(vcpu); @@ -477,10 +483,10 @@ IA64FAULT vmx_emul_tak(VCPU *vcpu, INST64 inst) { u64 r1,r3; +#ifdef CHECK_FAULT ISR visr; IA64_PSR vpsr; int fault=IA64_NO_FAULT; -#ifdef CHECK_FAULT visr.val=0; if(check_target_register(vcpu, inst.M46.r1)){ set_illegal_op_isr(vcpu); @@ -514,16 +520,16 @@ IA64FAULT vmx_emul_itr_d(VCPU *vcpu, INST64 inst) { - UINT64 fault, itir, ifa, pte, slot; + UINT64 itir, ifa, pte, slot; + IA64_PSR vpsr; + vpsr.val=vmx_vcpu_get_psr(vcpu); + if ( vpsr.ic ) { + set_illegal_op_isr(vcpu); + illegal_op(vcpu); + return IA64_FAULT; + } +#ifdef VMAL_NO_FAULT_CHECK ISR isr; - IA64_PSR vpsr; - vpsr.val=vmx_vcpu_get_psr(vcpu); - if ( vpsr.ic ) { - set_illegal_op_isr(vcpu); - illegal_op(vcpu); - return IA64_FAULT; - } -#ifdef VMAL_NO_FAULT_CHECK if ( vpsr.cpl != 0) { /* Inject Privileged Operation fault into guest */ set_privileged_operation_isr (vcpu, 0); @@ -571,8 +577,10 @@ IA64FAULT vmx_emul_itr_i(VCPU *vcpu, INST64 inst) { - UINT64 fault, itir, ifa, pte, slot; + UINT64 itir, ifa, pte, slot; +#ifdef VMAL_NO_FAULT_CHECK ISR isr; +#endif IA64_PSR vpsr; vpsr.val=vmx_vcpu_get_psr(vcpu); if ( vpsr.ic ) { @@ -628,19 +636,19 @@ IA64FAULT itc_fault_check(VCPU *vcpu, INST64 inst, u64 *itir, u64 *ifa,u64 *pte) { + IA64_PSR vpsr; + IA64FAULT ret1; + + vpsr.val=vmx_vcpu_get_psr(vcpu); + if ( vpsr.ic ) { + set_illegal_op_isr(vcpu); + illegal_op(vcpu); + return IA64_FAULT; + } + +#ifdef VMAL_NO_FAULT_CHECK UINT64 fault; ISR isr; - IA64_PSR vpsr; - IA64FAULT ret1; - - vpsr.val=vmx_vcpu_get_psr(vcpu); - if ( vpsr.ic ) { - set_illegal_op_isr(vcpu); - illegal_op(vcpu); - return IA64_FAULT; - } - -#ifdef VMAL_NO_FAULT_CHECK if ( vpsr.cpl != 0) { /* Inject Privileged Operation fault into guest */ set_privileged_operation_isr (vcpu, 0); @@ -1146,7 +1154,7 @@ IA64FAULT vmx_emul_mov_to_cr(VCPU *vcpu, INST64 inst) { - u64 r2,cr3; + u64 r2; #ifdef CHECK_FAULT IA64_PSR vpsr; vpsr.val=vmx_vcpu_get_psr(vcpu); @@ -1292,9 +1300,7 @@ IA64_BUNDLE __vmx_get_domain_bundle(u64 iip) { IA64_BUNDLE bundle; - - fetch_code( current,iip, &bundle.i64[0]); - fetch_code( current,iip+8, &bundle.i64[1]); + fetch_code( current, iip, &bundle.i64[0], &bundle.i64[1]); return bundle; } @@ -1309,14 +1315,10 @@ void vmx_emulate(VCPU *vcpu, REGS *regs) { - IA64_BUNDLE bundle; - int slot; - IA64_SLOT_TYPE slot_type; IA64FAULT status; INST64 inst; UINT64 iip, cause, opcode; iip = regs->cr_iip; - IA64_PSR vpsr; cause = VMX(vcpu,cause); opcode = VMX(vcpu,opcode); @@ -1342,6 +1344,10 @@ #endif #ifdef BYPASS_VMAL_OPCODE // make a local copy of the bundle containing the privop + IA64_BUNDLE bundle; + int slot; + IA64_SLOT_TYPE slot_type; + IA64_PSR vpsr; bundle = __vmx_get_domain_bundle(iip); slot = ((struct ia64_psr *)&(regs->cr_ipsr))->ri; if (!slot) inst.inst = bundle.slot0; @@ -1483,11 +1489,11 @@ status=vmx_emul_mov_from_cpuid(vcpu, inst); break; case EVENT_VMSW: - printf ("Unimplemented instruction %d\n", cause); + printf ("Unimplemented instruction %ld\n", cause); status=IA64_FAULT; break; default: - printf("unknown cause %d, iip: %lx, ipsr: %lx\n", cause,regs->cr_iip,regs->cr_ipsr); + printf("unknown cause %ld, iip: %lx, ipsr: %lx\n", cause,regs->cr_iip,regs->cr_ipsr); while(1); /* For unknown cause, let hardware to re-execute */ status=IA64_RETRY; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/vmx/vtlb.c --- a/xen/arch/ia64/vmx/vtlb.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/vmx/vtlb.c Thu Mar 2 10:00:49 2006 @@ -28,8 +28,11 @@ #include <asm/gcc_intrin.h> #include <linux/interrupt.h> #include <asm/vmx_vcpu.h> +#include <asm/vmmu.h> +#include <asm/tlbflush.h> #define MAX_CCH_LENGTH 40 +thash_data_t *__alloc_chain(thash_cb_t *, thash_data_t *); static void cch_mem_init(thash_cb_t *hcb) { @@ -50,8 +53,10 @@ if ( (p = hcb->cch_freelist) != NULL ) { hcb->cch_freelist = p->next; - } - return &(p->data); + return (thash_data_t *)p; + }else{ + return NULL; + } } static void cch_free(thash_cb_t *hcb, thash_data_t *cch) @@ -65,36 +70,38 @@ /* * Check to see if the address rid:va is translated by the TLB */ -static int __is_translated(thash_data_t *tlb, u64 rid, u64 va, CACHE_LINE_TYPE cl) -{ - u64 size1,sa1,ea1; - if ( tlb->rid != rid ||(!tlb->tc && tlb->cl != cl) ) - return 0; - size1 = PSIZE(tlb->ps); - sa1 = tlb->vadr & ~(size1-1); // mask the low address bits - ea1 = sa1 + size1; - - if ( va >= sa1 && (va < ea1 || ea1 == 0) ) + +static int __is_tr_translated(thash_data_t *tlb, u64 rid, u64 va, CACHE_LINE_TYPE cl) +{ + u64 size; + size = PSIZE(tlb->ps); + if(tlb->vadr&(size-1)) + while(1); + if ((tlb->rid == rid) && ((va-tlb->vadr)<size)) return 1; else return 0; } /* - * Only for TLB format. + * Only for GUEST TR format. */ static int -__is_tlb_overlap(thash_cb_t *hcb,thash_data_t *entry,int rid, char cl, u64 sva, u64 eva) -{ - uint64_t size1,size2,sa1,ea1,ea2; - - if ( entry->invalid || entry->rid != rid || (!entry->tc && entry->cl != cl ) ) { +__is_tr_overlap(thash_cb_t *hcb,thash_data_t *entry,int rid, char cl, u64 sva, u64 eva) +{ + uint64_t size, sa1, ea1; + +// if ( entry->invalid || entry->rid != rid || (entry->cl != cl ) ) { + if ( entry->invalid || entry->rid != rid ) { return 0; } - size1=PSIZE(entry->ps); - sa1 = entry->vadr & ~(size1-1); // mask the low address bits - ea1 = sa1 + size1; - if ( (sva >= ea1 && ea1 != 0) || (eva <= sa1 && eva != 0) ) + size = PSIZE(entry->ps); + sa1 = entry->vadr; + ea1 = sa1 + size -1; + eva -= 1; + if(sa1&(size-1)) + while(1); + if ( (sva>ea1) || (sa1>eva) ) return 0; else return 1; @@ -103,9 +110,11 @@ static void __rem_tr (thash_cb_t *hcb, thash_data_t *tr) { +/* if ( hcb->remove_notifier ) { (hcb->remove_notifier)(hcb,tr); } +*/ tr->invalid = 1; } @@ -142,7 +151,7 @@ else { tr = &DTR(hcb,idx); } - if ( !INVALID_TLB(tr) ) { + if ( !INVALID_TR(tr) ) { __rem_tr(hcb, tr); } __set_tr (tr, insert, idx); @@ -151,6 +160,7 @@ /* * remove TR entry. */ +/* static void rem_tr(thash_cb_t *hcb,CACHE_LINE_TYPE cl, int idx) { thash_data_t *tr; @@ -161,17 +171,18 @@ else { tr = &DTR(hcb,idx); } - if ( !INVALID_TLB(tr) ) { + if ( !INVALID_TR(tr) ) { __rem_tr(hcb, tr); } } - + */ /* * Delete an thash entry in collision chain. * prev: the previous entry. * rem: the removed entry. */ -static void __rem_chain(thash_cb_t *hcb/*, thash_data_t *prev*/, thash_data_t *rem) +/* +static void __rem_chain(thash_cb_t *hcb, thash_data_t *prev, thash_data_t *rem) { //prev->next = rem->next; if ( hcb->remove_notifier ) { @@ -179,6 +190,7 @@ } cch_free (hcb, rem); } + */ /* * Delete an thash entry leading collision chain. @@ -187,15 +199,16 @@ { thash_data_t *next=hash->next; - if ( hcb->remove_notifier ) { +/* if ( hcb->remove_notifier ) { (hcb->remove_notifier)(hcb,hash); - } + } */ if ( next != NULL ) { + next->len=hash->len-1; *hash = *next; cch_free (hcb, next); } else { - INVALIDATE_HASH(hcb, hash); + INVALIDATE_HASH_HEADER(hcb, hash); } } @@ -215,8 +228,8 @@ num = NDTRS; } for ( i=0; i<num; i++ ) { - if ( !INVALID_ENTRY(hcb,&tr[i]) && - __is_translated(&tr[i], rid, va, cl) ) + if ( !INVALID_TR(&tr[i]) && + __is_tr_translated(&tr[i], rid, va, cl) ) return &tr[i]; } return NULL; @@ -227,6 +240,7 @@ * Find overlap VHPT entry within current collision chain * base on internal priv info. */ +/* static inline thash_data_t* _vhpt_next_overlap_in_chain(thash_cb_t *hcb) { thash_data_t *cch; @@ -240,26 +254,27 @@ } return NULL; } - +*/ /* * Find overlap TLB/VHPT entry within current collision chain * base on internal priv info. */ +/* static thash_data_t *_vtlb_next_overlap_in_chain(thash_cb_t *hcb) { thash_data_t *cch; thash_internal_t *priv = &hcb->priv; - /* Find overlap TLB entry */ + // Find overlap TLB entry for (cch=priv->cur_cch; cch; cch = cch->next) { if ( ( cch->tc ? priv->s_sect.tc : priv->s_sect.tr ) && - __is_tlb_overlap(hcb, cch, priv->rid, priv->cl, - priv->_curva, priv->_eva) ) { + __is_translated( cch, priv->rid, priv->_curva, priv->cl)) { return cch; } } return NULL; } + */ /* * Get the machine format of VHPT entry. @@ -281,26 +296,190 @@ thash_data_t *tlb, u64 va, thash_data_t *vhpt) { - u64 pages,mfn; - ia64_rr vrr; - + u64 padr,pte; +// ia64_rr vrr; ASSERT ( hcb->ht == THASH_VHPT ); - vrr = (hcb->get_rr_fn)(hcb->vcpu,va); - pages = PSIZE(vrr.ps) >> PAGE_SHIFT; - mfn = (hcb->vs->get_mfn)(DOMID_SELF,tlb->ppn, pages); - if ( mfn == INVALID_MFN ) return 0; - +// vrr = (hcb->get_rr_fn)(hcb->vcpu,va); + padr = tlb->ppn >>(tlb->ps-ARCH_PAGE_SHIFT)<<tlb->ps; + padr += va&((1UL<<tlb->ps)-1); + pte=lookup_domain_mpa(current->domain,padr); + if((pte>>56)) + return 0; // TODO with machine discontinuous address space issue. - vhpt->etag = (hcb->vs->tag_func)( hcb->pta, tlb->vadr); + vhpt->etag = ia64_ttag(va); //vhpt->ti = 0; vhpt->itir = tlb->itir & ~ITIR_RV_MASK; vhpt->page_flags = tlb->page_flags & ~PAGE_FLAGS_RV_MASK; - vhpt->ppn = mfn; + vhpt->ps = PAGE_SHIFT; + vhpt->ppn = (pte&((1UL<<IA64_MAX_PHYS_BITS)-(1UL<<PAGE_SHIFT)))>>ARCH_PAGE_SHIFT; vhpt->next = 0; return 1; } - +static void thash_remove_cch(thash_cb_t *hcb, thash_data_t *hash) +{ + thash_data_t *prev, *next; + prev = hash; next= hash->next; + while(next){ + prev=next; + next=prev->next; + cch_free(hcb, prev); + } + hash->next = NULL; + hash->len = 0; +} + +/* vhpt only has entries with PAGE_SIZE page size */ + +void thash_vhpt_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va) +{ + thash_data_t vhpt_entry, *hash_table, *cch; +// ia64_rr vrr; + + if ( !__tlb_to_vhpt(hcb, entry, va, &vhpt_entry) ) { + return; + //panic("Can't convert to machine VHPT entry\n"); + } + + hash_table = (thash_data_t *)ia64_thash(va); + if( INVALID_VHPT(hash_table) ) { + *hash_table = vhpt_entry; + hash_table->next = 0; + return; + } + + cch = hash_table; + while(cch){ + if(cch->etag == vhpt_entry.etag){ + if(cch->ppn == vhpt_entry.ppn) + return; + else + while(1); + } + cch = cch->next; + } + if(hash_table->len>=MAX_CCN_DEPTH){ + thash_remove_cch(hcb, hash_table); + cch = cch_alloc(hcb); + *cch = *hash_table; + *hash_table = vhpt_entry; + hash_table->len = 1; + hash_table->next = cch; + return; + } + + // TODO: Add collision chain length limitation. + cch = __alloc_chain(hcb,entry); + if(cch == NULL){ + *hash_table = vhpt_entry; + hash_table->next = 0; + }else{ + *cch = *hash_table; + *hash_table = vhpt_entry; + hash_table->next = cch; + hash_table->len = cch->len + 1; + cch->len = 0; +// if(hash_table->tag==hash_table->next->tag) +// while(1); + + } + return /*hash_table*/; +} + +/* + * vhpt lookup + */ + +thash_data_t * vhpt_lookup(u64 va) +{ + thash_data_t *hash; + u64 tag; + hash = (thash_data_t *)ia64_thash(va); + tag = ia64_ttag(va); + while(hash){ + if(hash->etag == tag) + return hash; + hash=hash->next; + } + return NULL; +} + + +/* + * purge software guest tlb + */ + +static void vtlb_purge(thash_cb_t *hcb, u64 va, u64 ps) +{ + thash_data_t *hash_table, *prev, *next; + u64 start, end, size, tag, rid; + ia64_rr vrr; + vrr=vmx_vcpu_rr(current, va); + rid = vrr.rid; + size = PSIZE(ps); + start = va & (-size); + end = start + size; + while(start < end){ + hash_table = vsa_thash(hcb->pta, start, vrr.rrval, &tag); +// tag = ia64_ttag(start); + if(!INVALID_TLB(hash_table)){ + if(hash_table->etag == tag){ + __rem_hash_head(hcb, hash_table); + } + else{ + prev=hash_table; + next=prev->next; + while(next){ + if(next->etag == tag){ + prev->next=next->next; + cch_free(hcb,next); + hash_table->len--; + break; + } + prev=next; + next=next->next; + } + } + } + start += PAGE_SIZE; + } +// machine_tlb_purge(va, ps); +} +/* + * purge VHPT and machine TLB + */ + +static void vhpt_purge(thash_cb_t *hcb, u64 va, u64 ps) +{ + thash_data_t *hash_table, *prev, *next; + u64 start, end, size, tag; + size = PSIZE(ps); + start = va & (-size); + end = start + size; + while(start < end){ + hash_table = (thash_data_t *)ia64_thash(start); + tag = ia64_ttag(start); + if(hash_table->etag == tag ){ + __rem_hash_head(hcb, hash_table); + } + else{ + prev=hash_table; + next=prev->next; + while(next){ + if(next->etag == tag){ + prev->next=next->next; + cch_free(hcb,next); + hash_table->len--; + break; + } + prev=next; + next=next->next; + } + } + start += PAGE_SIZE; + } + machine_tlb_purge(va, ps); +} /* * Insert an entry to hash table. * NOTES: @@ -327,61 +506,96 @@ entry->vadr = PAGEALIGN(entry->vadr,entry->ps); entry->ppn = PAGEALIGN(entry->ppn, entry->ps-12); rep_tr(hcb, entry, idx); +// thash_vhpt_insert(hcb->ts->vhpt, entry, va); return ; } + + +/* + * Recycle all collisions chain in VTLB or VHPT. + * + */ + +void thash_recycle_cch(thash_cb_t *hcb) +{ + thash_data_t *hash_table; + + hash_table = (thash_data_t*)((u64)hcb->hash + hcb->hash_sz); + for (--hash_table;(u64)hash_table >= (u64)hcb->hash;hash_table--) { + thash_remove_cch(hcb,hash_table); + } +} +/* thash_data_t *vtlb_alloc_chain(thash_cb_t *hcb,thash_data_t *entry) { thash_data_t *cch; - + cch = cch_alloc(hcb); if(cch == NULL){ - thash_purge_all(hcb); + thash_recycle_cch(hcb); + cch = cch_alloc(hcb); } return cch; } - +*/ thash_data_t *__alloc_chain(thash_cb_t *hcb,thash_data_t *entry) { thash_data_t *cch; - + cch = cch_alloc(hcb); if(cch == NULL){ // recycle - if ( hcb->recycle_notifier ) { - hcb->recycle_notifier(hcb,(u64)entry); - } - thash_purge_all(hcb); -// cch = cch_alloc(hcb); +// if ( hcb->recycle_notifier ) { +// hcb->recycle_notifier(hcb,(u64)entry); +// } + thash_recycle_cch(hcb); + cch = cch_alloc(hcb); } return cch; } - + /* * Insert an entry into hash TLB or VHPT. * NOTES: * 1: When inserting VHPT to thash, "va" is a must covered * address by the inserted machine VHPT entry. * 2: The format of entry is always in TLB. - * 3: The caller need to make sure the new entry will not overlap + * 3: The caller need to make sure the new entry will not overlap * with any existed entry. */ void vtlb_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va) { thash_data_t *hash_table, *cch; - int flag; + /* int flag; */ ia64_rr vrr; - u64 gppn; - u64 ppns, ppne; - - hash_table = (hcb->hash_func)(hcb->pta, va); - if( INVALID_ENTRY(hcb, hash_table) ) { + /* u64 gppn, ppns, ppne; */ + u64 tag; + vrr=vmx_vcpu_rr(current, va); + if (vrr.ps != entry->ps) { +// machine_tlb_insert(hcb->vcpu, entry); + panic("not preferred ps with va: 0x%lx\n", va); + return; + } + entry->vadr = PAGEALIGN(entry->vadr,entry->ps); + entry->ppn = PAGEALIGN(entry->ppn, entry->ps-12); + hash_table = vsa_thash(hcb->pta, va, vrr.rrval, &tag); + entry->etag = tag; + if( INVALID_TLB(hash_table) ) { *hash_table = *entry; hash_table->next = 0; } + else if (hash_table->len>=MAX_CCN_DEPTH){ + thash_remove_cch(hcb, hash_table); + cch = cch_alloc(hcb); + *cch = *hash_table; + *hash_table = *entry; + hash_table->len = 1; + hash_table->next = cch; + } else { // TODO: Add collision chain length limitation. - cch = vtlb_alloc_chain(hcb,entry); + cch = __alloc_chain(hcb,entry); if(cch == NULL){ *hash_table = *entry; hash_table->next = 0; @@ -389,22 +603,17 @@ *cch = *hash_table; *hash_table = *entry; hash_table->next = cch; - } - } + hash_table->len = cch->len + 1; + cch->len = 0; + } + } +#if 0 if(hcb->vcpu->domain->domain_id==0){ thash_insert(hcb->ts->vhpt, entry, va); return; } - -#if 1 - vrr=vmx_vcpu_rr(current, va); - if (vrr.ps != entry->ps) { - machine_tlb_insert(hcb->vcpu, entry); - printk("not preferred ps with va: 0x%lx\n", va); - return; - } -#endif - +#endif +/* flag = 1; gppn = (POFFSET(va,entry->ps)|PAGEALIGN((entry->ppn<<12),entry->ps))>>PAGE_SHIFT; ppns = PAGEALIGN((entry->ppn<<12),entry->ps); @@ -413,46 +622,18 @@ flag = 0; if((__gpfn_is_mem(hcb->vcpu->domain, gppn)&&flag)) thash_insert(hcb->ts->vhpt, entry, va); +*/ return ; } -static void vhpt_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va) -{ - thash_data_t vhpt_entry, *hash_table, *cch; - ia64_rr vrr; - if ( !__tlb_to_vhpt(hcb, entry, va, &vhpt_entry) ) { - panic("Can't convert to machine VHPT entry\n"); - } - hash_table = (hcb->hash_func)(hcb->pta, va); - if( INVALID_ENTRY(hcb, hash_table) ) { - *hash_table = vhpt_entry; - hash_table->next = 0; - } - else { - // TODO: Add collision chain length limitation. - cch = __alloc_chain(hcb,entry); - if(cch == NULL){ - *hash_table = vhpt_entry; - hash_table->next = 0; - }else{ - *cch = *hash_table; - *hash_table = vhpt_entry; - hash_table->next = cch; - if(hash_table->tag==hash_table->next->tag) - while(1); - - } - - } - return /*hash_table*/; -} - + +/* void thash_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va) { thash_data_t *hash_table; ia64_rr vrr; - vrr = (hcb->get_rr_fn)(hcb->vcpu,entry->vadr); + vrr = vmx_vcpu_rr(hcb->vcpu,entry->vadr); if ( entry->ps != vrr.ps && entry->tc ) { panic("Not support for multiple page size now\n"); } @@ -461,7 +642,8 @@ (hcb->ins_hash)(hcb, entry, va); } - +*/ +/* static void rem_thash(thash_cb_t *hcb, thash_data_t *entry) { thash_data_t *hash_table, *p, *q; @@ -482,6 +664,7 @@ // if ( PURGABLE_ENTRY(hcb,q ) ) { p->next = q->next; __rem_chain(hcb, entry); + hash_table->len--; // } return ; } @@ -489,7 +672,8 @@ } panic("Entry not existed or bad sequence\n"); } - +*/ +/* static void rem_vtlb(thash_cb_t *hcb, thash_data_t *entry) { thash_data_t *hash_table, *p, *q; @@ -501,7 +685,7 @@ } rem_thash(hcb, entry); } - +*/ int cch_depth=0; /* * Purge the collision chain starting from cch. @@ -509,6 +693,7 @@ * For those UN-Purgable entries(FM), this function will return * the head of left collision chain. */ +/* static thash_data_t *thash_rem_cch(thash_cb_t *hcb, thash_data_t *cch) { thash_data_t *next; @@ -532,6 +717,7 @@ return cch; } } + */ /* * Purge one hash line (include the entry in hash table). @@ -540,10 +726,11 @@ * hash: The head of collision chain (hash table) * */ +/* static void thash_rem_line(thash_cb_t *hcb, thash_data_t *hash) { if ( INVALID_ENTRY(hcb, hash) ) return; - + if ( hash->next ) { cch_depth = 0; hash->next = thash_rem_cch(hcb, hash->next); @@ -553,7 +740,7 @@ __rem_hash_head(hcb, hash); } } - + */ /* * Find an overlap entry in hash table and its collision chain. @@ -568,14 +755,18 @@ * NOTES: * */ -thash_data_t *thash_find_overlap(thash_cb_t *hcb, + +/* +thash_data_t *thash_find_overlap(thash_cb_t *hcb, thash_data_t *in, search_section_t s_sect) { - return (hcb->find_overlap)(hcb, in->vadr, + return (hcb->find_overlap)(hcb, in->vadr, PSIZE(in->ps), in->rid, in->cl, s_sect); } - -static thash_data_t *vtlb_find_overlap(thash_cb_t *hcb, +*/ + +/* +static thash_data_t *vtlb_find_overlap(thash_cb_t *hcb, u64 va, u64 size, int rid, char cl, search_section_t s_sect) { thash_data_t *hash_table; @@ -586,9 +777,9 @@ priv->_curva = va & ~(size-1); priv->_eva = priv->_curva + size; priv->rid = rid; - vrr = (hcb->get_rr_fn)(hcb->vcpu,va); + vrr = vmx_vcpu_rr(hcb->vcpu,va); priv->ps = vrr.ps; - hash_table = (hcb->hash_func)(hcb->pta, priv->_curva); + hash_table = vsa_thash(hcb->pta, priv->_curva, vrr.rrval, &tag); priv->s_sect = s_sect; priv->cl = cl; priv->_tr_idx = 0; @@ -596,8 +787,10 @@ priv->cur_cch = hash_table; return (hcb->next_overlap)(hcb); } - -static thash_data_t *vhpt_find_overlap(thash_cb_t *hcb, +*/ + +/* +static thash_data_t *vhpt_find_overlap(thash_cb_t *hcb, u64 va, u64 size, int rid, char cl, search_section_t s_sect) { thash_data_t *hash_table; @@ -608,17 +801,43 @@ priv->_curva = va & ~(size-1); priv->_eva = priv->_curva + size; priv->rid = rid; - vrr = (hcb->get_rr_fn)(hcb->vcpu,va); + vrr = vmx_vcpu_rr(hcb->vcpu,va); priv->ps = vrr.ps; - hash_table = (hcb->hash_func)( hcb->pta, priv->_curva); - tag = (hcb->vs->tag_func)( hcb->pta, priv->_curva); + hash_table = ia64_thash(priv->_curva); + tag = ia64_ttag(priv->_curva); priv->tag = tag; priv->hash_base = hash_table; priv->cur_cch = hash_table; return (hcb->next_overlap)(hcb); } - - +*/ + + +thash_data_t *vtr_find_overlap(thash_cb_t *hcb, thash_data_t *data, char cl) +{ + thash_data_t *tr; + int i,num; + u64 end; + + if (cl == ISIDE_TLB ) { + num = NITRS; + tr = &ITR(hcb,0); + } + else { + num = NDTRS; + tr = &DTR(hcb,0); + } + end=data->vadr + PSIZE(data->ps); + for (i=0; i<num; i++ ) { + if ( __is_tr_overlap(hcb, &tr[i], data->rid, cl, data->vadr, end )) { + return &tr[i]; + } + } + return NULL; +} + + +/* static thash_data_t *vtr_find_next_overlap(thash_cb_t *hcb) { thash_data_t *tr; @@ -634,7 +853,7 @@ tr = &DTR(hcb,0); } for (; priv->_tr_idx < num; priv->_tr_idx ++ ) { - if ( __is_tlb_overlap(hcb, &tr[priv->_tr_idx], + if ( __is_tr_overlap(hcb, &tr[priv->_tr_idx], priv->rid, priv->cl, priv->_curva, priv->_eva) ) { return &tr[priv->_tr_idx++]; @@ -642,17 +861,19 @@ } return NULL; } +*/ /* * Similar with vtlb_next_overlap but find next entry. * NOTES: * Intermediate position information is stored in hcb->priv. */ +/* static thash_data_t *vtlb_next_overlap(thash_cb_t *hcb) { thash_data_t *ovl; thash_internal_t *priv = &hcb->priv; - u64 addr,rr_psize; + u64 addr,rr_psize,tag; ia64_rr vrr; if ( priv->s_sect.tr ) { @@ -661,7 +882,7 @@ priv->s_sect.tr = 0; } if ( priv->s_sect.v == 0 ) return NULL; - vrr = (hcb->get_rr_fn)(hcb->vcpu,priv->_curva); + vrr = vmx_vcpu_rr(hcb->vcpu,priv->_curva); rr_psize = PSIZE(vrr.ps); while ( priv->_curva < priv->_eva ) { @@ -673,12 +894,15 @@ } } priv->_curva += rr_psize; - priv->hash_base = (hcb->hash_func)( hcb->pta, priv->_curva); + priv->hash_base = vsa_thash( hcb->pta, priv->_curva, vrr.rrval, &tag); priv->cur_cch = priv->hash_base; } return NULL; } - + */ + + +/* static thash_data_t *vhpt_next_overlap(thash_cb_t *hcb) { thash_data_t *ovl; @@ -686,7 +910,7 @@ u64 addr,rr_psize; ia64_rr vrr; - vrr = (hcb->get_rr_fn)(hcb->vcpu,priv->_curva); + vrr = vmx_vcpu_rr(hcb->vcpu,priv->_curva); rr_psize = PSIZE(vrr.ps); while ( priv->_curva < priv->_eva ) { @@ -698,13 +922,13 @@ } } priv->_curva += rr_psize; - priv->hash_base = (hcb->hash_func)( hcb->pta, priv->_curva); - priv->tag = (hcb->vs->tag_func)( hcb->pta, priv->_curva); + priv->hash_base = ia64_thash(priv->_curva); + priv->tag = ia64_ttag(priv->_curva); priv->cur_cch = priv->hash_base; } return NULL; } - +*/ /* * Find and purge overlap entries in hash table and its collision chain. @@ -716,7 +940,7 @@ * NOTES: * */ -void thash_purge_entries(thash_cb_t *hcb, +void thash_purge_entries(thash_cb_t *hcb, thash_data_t *in, search_section_t p_sect) { return thash_purge_entries_ex(hcb, in->rid, in->vadr, @@ -724,10 +948,11 @@ } void thash_purge_entries_ex(thash_cb_t *hcb, - u64 rid, u64 va, u64 ps, - search_section_t p_sect, + u64 rid, u64 va, u64 ps, + search_section_t p_sect, CACHE_LINE_TYPE cl) { +/* thash_data_t *ovl; ovl = (hcb->find_overlap)(hcb, va, PSIZE(ps), rid, cl, p_sect); @@ -735,19 +960,22 @@ (hcb->rem_hash)(hcb, ovl); ovl = (hcb->next_overlap)(hcb); }; + */ + vtlb_purge(hcb, va, ps); + vhpt_purge(hcb->ts->vhpt, va, ps); } /* * Purge overlap TCs and then insert the new entry to emulate itc ops. * Notes: Only TC entry can purge and insert. */ -void thash_purge_and_insert(thash_cb_t *hcb, thash_data_t *in) -{ - thash_data_t *ovl; +void thash_purge_and_insert(thash_cb_t *hcb, thash_data_t *in, u64 va) +{ + /* thash_data_t *ovl; */ search_section_t sections; #ifdef XEN_DEBUGGER - vrr = (hcb->get_rr_fn)(hcb->vcpu,in->vadr); + vrr = vmx_vcpu_rr(hcb->vcpu,in->vadr); if ( in->ps != vrr.ps || hcb->ht != THASH_TLB || !in->tc ) { panic ("Oops, wrong call for purge_and_insert\n"); return; @@ -757,10 +985,14 @@ in->ppn = PAGEALIGN(in->ppn, in->ps-12); sections.tr = 0; sections.tc = 1; +/* ovl = (hcb->find_overlap)(hcb, in->vadr, PSIZE(in->ps), in->rid, in->cl, sections); if(ovl) (hcb->rem_hash)(hcb, ovl); + */ + vtlb_purge(hcb, va, in->ps); + vhpt_purge(hcb->ts->vhpt, va, in->ps); #ifdef XEN_DEBUGGER ovl = (hcb->next_overlap)(hcb); if ( ovl ) { @@ -768,7 +1000,9 @@ return; } #endif - (hcb->ins_hash)(hcb, in, in->vadr); + if(in->ps!=PAGE_SHIFT) + vtlb_insert(hcb, in, va); + thash_vhpt_insert(hcb->ts->vhpt, in, va); } /* * Purge one hash line (include the entry in hash table). @@ -777,6 +1011,7 @@ * hash: The head of collision chain (hash table) * */ +/* static void thash_purge_line(thash_cb_t *hcb, thash_data_t *hash) { if ( INVALID_ENTRY(hcb, hash) ) return; @@ -790,6 +1025,16 @@ // Then hash table itself. INVALIDATE_HASH(hcb, hash); } +*/ + + + + + + + + + /* * Purge all TCs or VHPT entries including those in Hash table. * @@ -799,7 +1044,10 @@ void thash_purge_all(thash_cb_t *hcb) { thash_data_t *hash_table; - + /* thash_data_t *entry; */ + thash_cb_t *vhpt; + /* u64 i, start, end; */ + #ifdef VTLB_DEBUG extern u64 sanity_check; static u64 statistics_before_purge_all=0; @@ -808,18 +1056,35 @@ check_vtlb_sanity(hcb); } #endif + ASSERT ( hcb->ht == THASH_TLB ); hash_table = (thash_data_t*)((u64)hcb->hash + hcb->hash_sz); for (--hash_table;(u64)hash_table >= (u64)hcb->hash;hash_table--) { - thash_purge_line(hcb, hash_table); - } - if(hcb->ht== THASH_TLB) { - hcb = hcb->ts->vhpt; - hash_table = (thash_data_t*)((u64)hcb->hash + hcb->hash_sz); - for (--hash_table;(u64)hash_table >= (u64)hcb->hash;hash_table--) { - thash_purge_line(hcb, hash_table); - } - } + INVALIDATE_TLB_HEADER(hash_table); + } + cch_mem_init (hcb); + + vhpt = hcb->ts->vhpt; + hash_table = (thash_data_t*)((u64)vhpt->hash + vhpt->hash_sz); + for (--hash_table;(u64)hash_table >= (u64)vhpt->hash;hash_table--) { + INVALIDATE_VHPT_HEADER(hash_table); + } + cch_mem_init (vhpt); + +/* + entry = &hcb->ts->itr[0]; + for(i=0; i< (NITRS+NDTRS); i++){ + if(!INVALID_TLB(entry)){ + start=entry->vadr & (-PSIZE(entry->ps)); + end = start + PSIZE(entry->ps); + while(start<end){ + thash_vhpt_insert(vhpt, entry, start); + start += PAGE_SIZE; + } + } + entry++; + } +*/ local_flush_tlb_all(); } @@ -845,20 +1110,21 @@ u64 tag; ia64_rr vrr; - ASSERT ( hcb->ht == THASH_VTLB ); + ASSERT ( hcb->ht == THASH_TLB ); cch = __vtr_lookup(hcb, rid, va, cl);; if ( cch ) return cch; - vrr = (hcb->get_rr_fn)(hcb->vcpu,va); - hash_table = (hcb->hash_func)( hcb->pta, va); + vrr = vmx_vcpu_rr(hcb->vcpu,va); + hash_table = vsa_thash( hcb->pta, va, vrr.rrval, &tag); if ( INVALID_ENTRY(hcb, hash_table ) ) return NULL; for (cch=hash_table; cch; cch = cch->next) { - if ( __is_translated(cch, rid, va, cl) ) +// if ( __is_translated(cch, rid, va, cl) ) + if(cch->etag == tag) return cch; } return NULL; @@ -871,6 +1137,7 @@ * 1: failure * 0: success */ +/* int thash_lock_tc(thash_cb_t *hcb, u64 va, u64 size, int rid, char cl, int lock) { thash_data_t *ovl; @@ -900,6 +1167,7 @@ } return 1; } +*/ /* * Notifier when TLB is deleted from hash table and its collision chain. @@ -911,15 +1179,17 @@ * 2: The format of entry is always in TLB. * */ -void tlb_remove_notifier(thash_cb_t *hcb, thash_data_t *entry) -{ - thash_cb_t *vhpt; - search_section_t s_sect; +//void tlb_remove_notifier(thash_cb_t *hcb, thash_data_t *entry) +//{ +// vhpt_purge(hcb->ts->vhpt,entry->vadr,entry->ps); +// thash_cb_t *vhpt; - s_sect.v = 0; - thash_purge_entries(hcb->ts->vhpt, entry, s_sect); - machine_tlb_purge(entry->vadr, entry->ps); -} +// search_section_t s_sect; + +// s_sect.v = 0; +// thash_purge_entries(hcb->ts->vhpt, entry, s_sect); +// machine_tlb_purge(entry->vadr, entry->ps); +//} /* * Initialize internal control data before service. @@ -930,34 +1200,33 @@ cch_mem_init (hcb); hcb->magic = THASH_CB_MAGIC; - hcb->pta.val = hcb->hash; + hcb->pta.val = (unsigned long)hcb->hash; hcb->pta.vf = 1; hcb->pta.ve = 1; hcb->pta.size = sz; - hcb->get_rr_fn = vmmu_get_rr; +// hcb->get_rr_fn = vmmu_get_rr; ASSERT ( hcb->hash_sz % sizeof(thash_data_t) == 0 ); if ( hcb->ht == THASH_TLB ) { - hcb->remove_notifier = tlb_remove_notifier; - hcb->find_overlap = vtlb_find_overlap; - hcb->next_overlap = vtlb_next_overlap; - hcb->rem_hash = rem_vtlb; - hcb->ins_hash = vtlb_insert; +// hcb->remove_notifier = NULL; //tlb_remove_notifier; +// hcb->find_overlap = vtlb_find_overlap; +// hcb->next_overlap = vtlb_next_overlap; +// hcb->rem_hash = rem_vtlb; +// hcb->ins_hash = vtlb_insert; __init_tr(hcb); } else { - hcb->remove_notifier = NULL; - hcb->find_overlap = vhpt_find_overlap; - hcb->next_overlap = vhpt_next_overlap; - hcb->rem_hash = rem_thash; - hcb->ins_hash = vhpt_insert; +// hcb->remove_notifier = NULL; +// hcb->find_overlap = vhpt_find_overlap; +// hcb->next_overlap = vhpt_next_overlap; +// hcb->rem_hash = rem_thash; +// hcb->ins_hash = thash_vhpt_insert; } hash_table = (thash_data_t*)((u64)hcb->hash + hcb->hash_sz); - + for (--hash_table;(u64)hash_table >= (u64)hcb->hash;hash_table--) { - INVALIDATE_HASH(hcb,hash_table); - } -} -#define VTLB_DEBUG + INVALIDATE_HASH_HEADER(hcb,hash_table); + } +} #ifdef VTLB_DEBUG static u64 cch_length_statistics[MAX_CCH_LENGTH+1]; u64 sanity_check=0; @@ -967,7 +1236,7 @@ thash_data_t *ovl; search_section_t s_sect; u64 num=0; - + s_sect.v = 0; for (cch=hash; cch; cch=cch->next) { ovl = thash_find_overlap(vhpt, cch, s_sect); @@ -997,7 +1266,7 @@ search_section_t s_sect; thash_cb_t *vhpt = vtlb->ts->vhpt; u64 invalid_ratio; - + if ( sanity_check == 0 ) return; sanity_check --; s_sect.v = 0; @@ -1010,7 +1279,7 @@ // vb2 = vb1 + vtlb->hash_sz; hash_num = vhpt->hash_sz / sizeof(thash_data_t); // printf("vb2=%lp, size=%lx hash_num=%lx\n", vb2, vhpt->hash_sz, hash_num); - printf("vtlb=%lp, hash=%lp size=0x%lx; vhpt=%lp, hash=%lp size=0x%lx\n", + printf("vtlb=%p, hash=%p size=0x%lx; vhpt=%p, hash=%p size=0x%lx\n", vtlb, vtlb->hash,vtlb->hash_sz, vhpt, vhpt->hash, vhpt->hash_sz); //memcpy(vb1, vtlb->hash, vtlb->hash_sz); @@ -1018,9 +1287,9 @@ for ( i=0; i < sizeof(cch_length_statistics)/sizeof(cch_length_statistics[0]); i++ ) { cch_length_statistics[i] = 0; } - + local_irq_save(psr); - + hash = vhpt->hash; for (i=0; i < hash_num; i++) { if ( !INVALID_ENTRY(vhpt, hash) ) { @@ -1043,7 +1312,7 @@ } hash ++; } - printf("Done vtlb entry check, hash=%lp\n", hash); + printf("Done vtlb entry check, hash=%p\n", hash); printf("check_ok_num = 0x%lx check_invalid=0x%lx\n", check_ok_num,check_invalid); invalid_ratio = 1000*check_invalid / hash_num; printf("%02ld.%01ld%% entries are invalid\n", @@ -1072,7 +1341,7 @@ if ( !INVALID_ENTRY(vhpt, hash) ) { for ( cch= hash; cch; cch=cch->next) { if ( !cch->checked ) { - printf ("!!!Hash=%lp cch=%lp not within vtlb\n", hash, cch); + printf ("!!!Hash=%p cch=%p not within vtlb\n", hash, cch); check_fail_num ++; } else { @@ -1103,18 +1372,18 @@ static u64 dump_vtlb=0; thash_data_t *hash, *cch, *tr; u64 hash_num,i; - + if ( dump_vtlb == 0 ) return; dump_vtlb --; hash_num = vtlb->hash_sz / sizeof(thash_data_t); hash = vtlb->hash; - + printf("Dump vTC\n"); for ( i = 0; i < hash_num; i++ ) { if ( !INVALID_ENTRY(vtlb, hash) ) { - printf("VTLB at hash=%lp\n", hash); + printf("VTLB at hash=%p\n", hash); for (cch=hash; cch; cch=cch->next) { - printf("Entry %lp va=%lx ps=%lx rid=%lx\n", + printf("Entry %p va=%lx ps=%d rid=%d\n", cch, cch->vadr, cch->ps, cch->rid); } } @@ -1123,13 +1392,13 @@ printf("Dump vDTR\n"); for (i=0; i<NDTRS; i++) { tr = &DTR(vtlb,i); - printf("Entry %lp va=%lx ps=%lx rid=%lx\n", + printf("Entry %p va=%lx ps=%d rid=%d\n", tr, tr->vadr, tr->ps, tr->rid); } printf("Dump vITR\n"); for (i=0; i<NITRS; i++) { tr = &ITR(vtlb,i); - printf("Entry %lp va=%lx ps=%lx rid=%lx\n", + printf("Entry %p va=%lx ps=%d rid=%d\n", tr, tr->vadr, tr->ps, tr->rid); } printf("End of vTLB dump\n"); diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/acpi.c --- a/xen/arch/ia64/xen/acpi.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/acpi.c Thu Mar 2 10:00:49 2006 @@ -178,7 +178,7 @@ if (lapic->address) { iounmap((void *) ipi_base_addr); - ipi_base_addr = (unsigned long) ioremap(lapic->address, 0); + ipi_base_addr = (void __iomem *) ioremap(lapic->address, 0); } return 0; } @@ -265,7 +265,9 @@ acpi_table_entry_header *header, const unsigned long end) { struct acpi_table_plat_int_src *plintsrc; +#if 0 int vector; +#endif plintsrc = (struct acpi_table_plat_int_src *) header; @@ -369,9 +371,9 @@ /* Get base address of IPI Message Block */ if (acpi_madt->lapic_address) - ipi_base_addr = (unsigned long) ioremap(acpi_madt->lapic_address, 0); - - printk(KERN_INFO PREFIX "Local APIC address 0x%lx\n", ipi_base_addr); + ipi_base_addr = (void __iomem *) ioremap(acpi_madt->lapic_address, 0); + + printk(KERN_INFO PREFIX "Local APIC address %p\n", ipi_base_addr); acpi_madt_oem_check(acpi_madt->header.oem_id, acpi_madt->header.oem_table_id); diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/dom0_ops.c --- a/xen/arch/ia64/xen/dom0_ops.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/dom0_ops.c Thu Mar 2 10:00:49 2006 @@ -17,6 +17,7 @@ #include <xen/trace.h> #include <xen/console.h> #include <public/sched_ctl.h> +#include <asm/vmx.h> long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) { @@ -143,7 +144,7 @@ n += j; } - free_xenheap_page((unsigned long)l_arr); + free_xenheap_page((void *) l_arr); put_domain(d); } @@ -160,7 +161,6 @@ unsigned long nr_pages = op->u.getmemlist.max_pfns & 0xffffffff; unsigned long mfn; unsigned long *buffer = op->u.getmemlist.buffer; - struct page *page; ret = -EINVAL; if ( d != NULL ) diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/dom_fw.c --- a/xen/arch/ia64/xen/dom_fw.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/dom_fw.c Thu Mar 2 10:00:49 2006 @@ -39,7 +39,8 @@ while(1); } if (imva - imva_fw_base > PAGE_SIZE) { - printf("dom_pa: bad offset! imva=%p, imva_fw_base=%p (spinning...)\n",imva,imva_fw_base); + printf("dom_pa: bad offset! imva=0x%lx, imva_fw_base=0x%lx (spinning...)\n", + imva, imva_fw_base); while(1); } return dom_fw_base_mpa + (imva - imva_fw_base); @@ -48,31 +49,29 @@ // builds a hypercall bundle at domain physical address void dom_efi_hypercall_patch(struct domain *d, unsigned long paddr, unsigned long hypercall) { - unsigned long imva; + unsigned long *imva; if (d == dom0) paddr += dom0_start; - imva = domain_mpa_to_imva(d,paddr); - build_hypercall_bundle(imva,d->arch.breakimm,hypercall,1); + imva = (unsigned long *) domain_mpa_to_imva(d, paddr); + build_hypercall_bundle(imva, d->arch.breakimm, hypercall, 1); } // builds a hypercall bundle at domain physical address static void dom_fw_hypercall_patch(struct domain *d, unsigned long paddr, unsigned long hypercall,unsigned long ret) { - unsigned long imva; - - imva = domain_mpa_to_imva(d,paddr); - build_hypercall_bundle(imva,d->arch.breakimm,hypercall,ret); + unsigned long *imva; + + imva = (unsigned long *) domain_mpa_to_imva(d, paddr); + build_hypercall_bundle(imva, d->arch.breakimm, hypercall, ret); } static void dom_fw_pal_hypercall_patch(struct domain *d, unsigned long paddr) { unsigned long *imva; - imva = (unsigned long *)domain_mpa_to_imva(d,paddr); - - build_pal_hypercall_bundles (imva, d->arch.breakimm, - FW_HYPERCALL_PAL_CALL); + imva = (unsigned long *) domain_mpa_to_imva(d, paddr); + build_pal_hypercall_bundles(imva, d->arch.breakimm, FW_HYPERCALL_PAL_CALL); } @@ -85,15 +84,13 @@ dom_fw_base_mpa = 0; if (d == dom0) dom_fw_base_mpa += dom0_start; - imva_fw_base = domain_mpa_to_imva(d,dom_fw_base_mpa); - bp = dom_fw_init(d,args,arglen,imva_fw_base,PAGE_SIZE); - return dom_pa((unsigned long)bp); + 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); } /* the following heavily leveraged from linux/arch/ia64/hp/sim/fw-emu.c */ - -#define MB (1024*1024UL) #define NUM_EFI_SYS_TABLES 6 # define NUM_MEM_DESCS 5 @@ -256,7 +253,8 @@ if (((in1 & ~0xffffffffUL) && (in4 == 0)) || (in4 > 1) || (in2 > 8) || (in2 & (in2-1))) - printf("*** SAL_PCI_CONF_WRITE?!?(adr=%p,typ=%p,sz=%p,val=%p)\n",in1,in4,in2,in3); + printf("*** SAL_PCI_CONF_WRITE?!?(adr=0x%lx,typ=0x%lx,sz=0x%lx,val=0x%lx)\n", + in1,in4,in2,in3); // note that args are in a different order!! status = ia64_sal_pci_config_write(in1,in4,in2,in3); } @@ -296,7 +294,7 @@ long status = -1; if (running_on_sim) return pal_emulator_static(index); - printk("xen_pal_emulator: index=%d\n",index); + printk("xen_pal_emulator: index=%lu\n", index); // pal code must be mapped by a TR when pal is called, however // calls are rare enough that we will map it lazily rather than // at every context switch @@ -312,10 +310,16 @@ status = ia64_pal_proc_get_features(&r9,&r10,&r11); break; case PAL_BUS_GET_FEATURES: - status = ia64_pal_bus_get_features(&r9,&r10,&r11); + status = ia64_pal_bus_get_features( + (pal_bus_features_u_t *) &r9, + (pal_bus_features_u_t *) &r10, + (pal_bus_features_u_t *) &r11); break; case PAL_FREQ_RATIOS: - status = ia64_pal_freq_ratios(&r9,&r10,&r11); + status = ia64_pal_freq_ratios( + (struct pal_freq_ratio *) &r9, + (struct pal_freq_ratio *) &r10, + (struct pal_freq_ratio *) &r11); break; case PAL_PTCE_INFO: { @@ -326,7 +330,9 @@ } break; case PAL_VERSION: - status = ia64_pal_version(&r9,&r10); + status = ia64_pal_version( + (pal_version_u_t *) &r9, + (pal_version_u_t *) &r10); break; case PAL_VM_PAGE_SIZE: status = ia64_pal_vm_page_size(&r9,&r10); @@ -341,13 +347,21 @@ // FIXME: what should xen return for these, figure out later // For now, linux does the right thing if pal call fails // In particular, rid_size must be set properly! - //status = ia64_pal_vm_summary(&r9,&r10); + //status = ia64_pal_vm_summary( + // (pal_vm_info_1_u_t *) &r9, + // (pal_vm_info_2_u_t *) &r10); break; case PAL_RSE_INFO: - status = ia64_pal_rse_info(&r9,&r10); + status = ia64_pal_rse_info( + &r9, + (pal_hints_u_t *) &r10); break; case PAL_VM_INFO: - status = ia64_pal_vm_info(in1,in2,&r9,&r10); + status = ia64_pal_vm_info( + in1, + in2, + (pal_tc_info_u_t *) &r9, + &r10); break; case PAL_REGISTER_INFO: status = ia64_pal_register_info(in1,&r9,&r10); @@ -360,11 +374,12 @@ case PAL_PERF_MON_INFO: { unsigned long pm_buffer[16]; - int i; - status = ia64_pal_perf_mon_info(pm_buffer,&r9); + status = ia64_pal_perf_mon_info( + pm_buffer, + (pal_perf_mon_info_u_t *) &r9); if (status != 0) { while(1) - printk("PAL_PERF_MON_INFO fails ret=%d\n",status); + printk("PAL_PERF_MON_INFO fails ret=%ld\n", status); break; } if (copy_to_user((void __user *)in1,pm_buffer,128)) { @@ -409,7 +424,7 @@ domain_shutdown (current->domain, 0); break; default: - printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %d!!!!\n", + printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %lu!!!!\n", index); break; } @@ -434,7 +449,7 @@ /* Provide only one LP to guest */ static int -acpi_update_lsapic (acpi_table_entry_header *header) +acpi_update_lsapic (acpi_table_entry_header *header, const unsigned long end) { struct acpi_table_lsapic *lsapic; @@ -529,8 +544,8 @@ strcpy(xsdt->asl_compiler_id, "XEN"); xsdt->asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION); - xsdt->table_offset_entry[0] = dom_pa(fadt); - tables->madt_ptr = dom_pa(madt); + xsdt->table_offset_entry[0] = dom_pa((unsigned long) fadt); + tables->madt_ptr = dom_pa((unsigned long) madt); xsdt->checksum = generate_acpi_checksum(xsdt, xsdt->length); @@ -547,8 +562,8 @@ facs->version = 1; facs->length = sizeof(struct facs_descriptor_rev2); - fadt->xfirmware_ctrl = dom_pa(facs); - fadt->Xdsdt = dom_pa(dsdt); + fadt->xfirmware_ctrl = dom_pa((unsigned long) facs); + fadt->Xdsdt = dom_pa((unsigned long) dsdt); /* * All of the below FADT entries are filled it to prevent warnings @@ -558,15 +573,15 @@ fadt->pm1_evt_len = 4; fadt->xpm1a_evt_blk.address_space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY; fadt->xpm1a_evt_blk.register_bit_width = 8; - fadt->xpm1a_evt_blk.address = dom_pa(&tables->pm1a_evt_blk); + fadt->xpm1a_evt_blk.address = dom_pa((unsigned long) &tables->pm1a_evt_blk); fadt->pm1_cnt_len = 1; fadt->xpm1a_cnt_blk.address_space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY; fadt->xpm1a_cnt_blk.register_bit_width = 8; - fadt->xpm1a_cnt_blk.address = dom_pa(&tables->pm1a_cnt_blk); + fadt->xpm1a_cnt_blk.address = dom_pa((unsigned long) &tables->pm1a_cnt_blk); fadt->pm_tm_len = 4; fadt->xpm_tmr_blk.address_space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY; fadt->xpm_tmr_blk.register_bit_width = 8; - fadt->xpm_tmr_blk.address = dom_pa(&tables->pm_tmr_blk); + fadt->xpm_tmr_blk.address = dom_pa((unsigned long) &tables->pm_tmr_blk); fadt->checksum = generate_acpi_checksum(fadt, fadt->length); @@ -575,7 +590,7 @@ strcpy(rsdp->oem_id, "XEN"); rsdp->revision = 2; /* ACPI 2.0 includes XSDT */ rsdp->length = sizeof(struct acpi20_table_rsdp); - rsdp->xsdt_address = dom_pa(xsdt); + rsdp->xsdt_address = dom_pa((unsigned long) xsdt); rsdp->checksum = generate_acpi_checksum(rsdp, ACPI_RSDP_CHECKSUM_LENGTH); @@ -640,7 +655,7 @@ unsigned long maxmem = (d->max_pages - d->arch.sys_pgnr) * PAGE_SIZE; const unsigned long start_mpaddr = ((d==dom0)?dom0_start:0); -# define MAKE_MD(typ, attr, start, end, abs) \ +# define MAKE_MD(typ, attr, start, end, abs) \ do { \ md = efi_memmap + i++; \ md->type = typ; \ @@ -669,7 +684,7 @@ sal_ed = (void *) cp; cp += sizeof(*sal_ed); 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); + pfn = (void *) cp; cp += NFUNCPTRS * 2 * sizeof(pfn); cmd_line = (void *) cp; if (args) { @@ -690,19 +705,19 @@ cp += sizeof(FW_VENDOR) + (8-((unsigned long)cp & 7)); // round to 64-bit boundary memcpy(fw_vendor,FW_VENDOR,sizeof(FW_VENDOR)); - efi_systab->fw_vendor = dom_pa(fw_vendor); + efi_systab->fw_vendor = dom_pa((unsigned long) fw_vendor); efi_systab->fw_revision = 1; - efi_systab->runtime = (void *) dom_pa(efi_runtime); + efi_systab->runtime = (void *) dom_pa((unsigned long) efi_runtime); efi_systab->nr_tables = NUM_EFI_SYS_TABLES; - efi_systab->tables = dom_pa(efi_tables); + efi_systab->tables = dom_pa((unsigned long) efi_tables); efi_runtime->hdr.signature = EFI_RUNTIME_SERVICES_SIGNATURE; efi_runtime->hdr.revision = EFI_RUNTIME_SERVICES_REVISION; efi_runtime->hdr.headersize = sizeof(efi_runtime->hdr); #define EFI_HYPERCALL_PATCH(tgt,call) do { \ dom_efi_hypercall_patch(d,FW_HYPERCALL_##call##_PADDR,FW_HYPERCALL_##call); \ - tgt = dom_pa(pfn); \ + tgt = dom_pa((unsigned long) pfn); \ *pfn++ = FW_HYPERCALL_##call##_PADDR + start_mpaddr; \ *pfn++ = 0; \ } while (0) @@ -719,7 +734,7 @@ EFI_HYPERCALL_PATCH(efi_runtime->reset_system,EFI_RESET_SYSTEM); efi_tables[0].guid = SAL_SYSTEM_TABLE_GUID; - efi_tables[0].table = dom_pa(sal_systab); + efi_tables[0].table = dom_pa((unsigned long) sal_systab); for (i = 1; i < NUM_EFI_SYS_TABLES; i++) { efi_tables[i].guid = NULL_GUID; efi_tables[i].table = 0; @@ -730,7 +745,7 @@ if (efi.mps) { efi_tables[i].guid = MPS_TABLE_GUID; efi_tables[i].table = __pa(efi.mps); - printf(" MPS=%0xlx",efi_tables[i].table); + printf(" MPS=0x%lx",efi_tables[i].table); i++; } @@ -739,25 +754,25 @@ if (efi.acpi20) { efi_tables[i].guid = ACPI_20_TABLE_GUID; efi_tables[i].table = __pa(efi.acpi20); - printf(" ACPI 2.0=%0xlx",efi_tables[i].table); + printf(" ACPI 2.0=0x%lx",efi_tables[i].table); i++; } if (efi.acpi) { efi_tables[i].guid = ACPI_TABLE_GUID; efi_tables[i].table = __pa(efi.acpi); - printf(" ACPI=%0xlx",efi_tables[i].table); + printf(" ACPI=0x%lx",efi_tables[i].table); i++; } if (efi.smbios) { efi_tables[i].guid = SMBIOS_TABLE_GUID; efi_tables[i].table = __pa(efi.smbios); - printf(" SMBIOS=%0xlx",efi_tables[i].table); + printf(" SMBIOS=0x%lx",efi_tables[i].table); i++; } if (efi.hcdp) { efi_tables[i].guid = HCDP_TABLE_GUID; efi_tables[i].table = __pa(efi.hcdp); - printf(" HCDP=%0xlx",efi_tables[i].table); + printf(" HCDP=0x%lx",efi_tables[i].table); i++; } printf("\n"); @@ -773,8 +788,8 @@ dom_fw_fake_acpi(acpi_tables); efi_tables[i].guid = ACPI_20_TABLE_GUID; - efi_tables[i].table = dom_pa(acpi_tables); - printf(" ACPI 2.0=%0xlx",efi_tables[i].table); + efi_tables[i].table = dom_pa((unsigned long) acpi_tables); + printf(" ACPI 2.0=0x%lx",efi_tables[i].table); i++; } } @@ -850,12 +865,12 @@ MAKE_MD(EFI_RESERVED_TYPE,0,0,0,0); } - bp->efi_systab = dom_pa(fw_mem); - bp->efi_memmap = dom_pa(efi_memmap); + bp->efi_systab = dom_pa((unsigned long) fw_mem); + bp->efi_memmap = dom_pa((unsigned long) efi_memmap); bp->efi_memmap_size = NUM_MEM_DESCS*sizeof(efi_memory_desc_t); bp->efi_memdesc_size = sizeof(efi_memory_desc_t); bp->efi_memdesc_version = 1; - bp->command_line = dom_pa(cmd_line); + bp->command_line = dom_pa((unsigned long) cmd_line); bp->console_info.num_cols = 80; bp->console_info.num_rows = 25; bp->console_info.orig_x = 0; @@ -870,7 +885,7 @@ bp->initrd_start = d->arch.initrd_start; bp->initrd_size = d->arch.initrd_len; } - printf(" initrd start %0xlx", bp->initrd_start); - printf(" initrd size %0xlx", bp->initrd_size); + printf(" initrd start 0x%lx", bp->initrd_start); + printf(" initrd size 0x%lx\n", bp->initrd_size); return bp; } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/domain.c Thu Mar 2 10:00:49 2006 @@ -45,7 +45,9 @@ #include <asm/vmx.h> #include <asm/vmx_vcpu.h> #include <asm/vmx_vpd.h> +#include <asm/vmx_phy_mode.h> #include <asm/pal.h> +#include <asm/vhpt.h> #include <public/hvm/ioreq.h> #define CONFIG_DOMAIN0_CONTIGUOUS @@ -63,8 +65,16 @@ extern int readelfimage_base_and_size(char *, unsigned long, unsigned long *, unsigned long *, unsigned long *); -unsigned long map_domain_page0(struct domain *); extern unsigned long dom_fw_setup(struct domain *, char *, int); +/* FIXME: where these declarations should be there ? */ +extern void domain_pend_keyboard_interrupt(int); +extern long platform_is_hp_ski(void); +extern unsigned long allocate_metaphysical_rr(void); +extern int allocate_rid_range(struct domain *, unsigned long); +extern void sync_split_caches(void); +extern void init_all_rr(struct vcpu *); +extern void serial_input_init(void); + static void init_switch_stack(struct vcpu *v); /* this belongs in include/asm, but there doesn't seem to be a suitable place */ @@ -251,9 +261,12 @@ return 0; fail_nomem: - free_xenheap_page(d->shared_info); - xfree(d->arch.mm); - pgd_free(d->arch.mm->pgd); + if (d->arch.mm->pgd != NULL) + pgd_free(d->arch.mm->pgd); + if (d->arch.mm != NULL) + xfree(d->arch.mm); + if (d->shared_info != NULL) + free_xenheap_page(d->shared_info); return -ENOMEM; } @@ -272,8 +285,6 @@ { struct pt_regs *regs = vcpu_regs (v); struct domain *d = v->domain; - int i, rc, ret; - unsigned long progress = 0; printf("arch_set_info_guest\n"); if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) ) @@ -301,7 +312,7 @@ v->vcpu_info->arch.evtchn_vector = c->vcpu.evtchn_vector; if ( c->vcpu.privregs && copy_from_user(v->arch.privregs, c->vcpu.privregs, sizeof(mapped_regs_t))) { - printk("Bad ctxt address in arch_set_info_guest: 0x%lx\n", c->vcpu.privregs); + printk("Bad ctxt address in arch_set_info_guest: %p\n", c->vcpu.privregs); return -EFAULT; } @@ -328,9 +339,7 @@ { struct domain *d = v->domain; struct pt_regs *regs; - struct ia64_boot_param *bp; extern char saved_command_line[]; - #ifdef CONFIG_DOMAIN0_CONTIGUOUS if (d == dom0) start_pc += dom0_start; @@ -378,18 +387,19 @@ } } -static struct page * map_new_domain0_page(unsigned long mpaddr) +static struct page * assign_new_domain0_page(unsigned long mpaddr) { if (mpaddr < dom0_start || mpaddr >= dom0_start + dom0_size) { - printk("map_new_domain0_page: bad domain0 mpaddr %p!\n",mpaddr); -printk("map_new_domain0_page: start=%p,end=%p!\n",dom0_start,dom0_start+dom0_size); + printk("assign_new_domain0_page: bad domain0 mpaddr 0x%lx!\n",mpaddr); + printk("assign_new_domain0_page: start=0x%lx,end=0x%lx!\n", + dom0_start, dom0_start+dom0_size); while(1); } return mfn_to_page((mpaddr >> PAGE_SHIFT)); } /* 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; @@ -397,10 +407,9 @@ pud_t *pud; pmd_t *pmd; pte_t *pte; -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); @@ -419,7 +428,7 @@ pte = pte_offset_map(pmd, mpaddr); if (pte_none(*pte)) { #ifdef CONFIG_DOMAIN0_CONTIGUOUS - if (d == dom0) p = map_new_domain0_page(mpaddr); + if (d == dom0) p = assign_new_domain0_page(mpaddr); else #endif { @@ -428,21 +437,23 @@ 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)); -} + if (unlikely(page_to_maddr(p) > __get_cpu_var(vhpt_paddr) + && page_to_maddr(p) < __get_cpu_var(vhpt_pend))) { + printf("assign_new_domain_page: reassigned vhpt page %lx!!\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 +462,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 +483,14 @@ 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((physaddr>>PAGE_SHIFT)<max_page){ + *(mpt_table + (physaddr>>PAGE_SHIFT))=(mpaddr>>PAGE_SHIFT); + } } #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 +500,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 +523,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) @@ -530,8 +544,8 @@ #ifdef CONFIG_DOMAIN0_CONTIGUOUS if (d == dom0) { if (mpaddr < dom0_start || mpaddr >= dom0_start + dom0_size) { - //printk("lookup_domain_mpa: bad dom0 mpaddr %p!\n",mpaddr); -//printk("lookup_domain_mpa: start=%p,end=%p!\n",dom0_start,dom0_start+dom0_size); + //printk("lookup_domain_mpa: bad dom0 mpaddr 0x%lx!\n",mpaddr); + //printk("lookup_domain_mpa: start=0x%lx,end=0x%lx!\n",dom0_start,dom0_start+dom0_size); mpafoo(mpaddr); } pte_t pteval = pfn_pte(mpaddr >> PAGE_SHIFT, @@ -557,10 +571,10 @@ } /* 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; - } - printk("lookup_domain_mpa: bad mpa %p (> %p\n", - mpaddr,d->max_pages<<PAGE_SHIFT); + if (assign_new_domain_page(d,mpaddr)) goto tryagain; + } + printk("lookup_domain_mpa: bad mpa 0x%lx (> 0x%lx)\n", + mpaddr, (unsigned long) d->max_pages<<PAGE_SHIFT); mpafoo(mpaddr); return 0; } @@ -573,7 +587,7 @@ unsigned long imva; pte &= _PAGE_PPN_MASK; - imva = __va(pte); + imva = (unsigned long) __va(pte); imva |= mpaddr & ~PAGE_MASK; return(imva); } @@ -602,13 +616,13 @@ { int remain; - if (IS_XEN_ADDRESS(dom0,src)) { + 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)) { + 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; @@ -619,16 +633,15 @@ void loaddomainelfimage(struct domain *d, unsigned long image_start) { - char *elfbase = image_start; + char *elfbase = (char *) image_start; //Elf_Ehdr *ehdr = (Elf_Ehdr *)image_start; Elf_Ehdr ehdr; Elf_Phdr phdr; - int h, filesz, memsz, paddr; + int h, filesz, memsz; unsigned long elfaddr, dom_mpaddr, dom_imva; struct page *p; - unsigned long pteval; - copy_memory(&ehdr,image_start,sizeof(Elf_Ehdr)); + copy_memory(&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)); @@ -637,7 +650,7 @@ continue; } filesz = phdr.p_filesz; memsz = phdr.p_memsz; - elfaddr = elfbase + phdr.p_offset; + elfaddr = (unsigned long) elfbase + phdr.p_offset; dom_mpaddr = phdr.p_paddr; //printf("p_offset: %x, size=%x\n",elfaddr,filesz); #ifdef CONFIG_DOMAIN0_CONTIGUOUS @@ -646,37 +659,31 @@ printf("Domain0 doesn't fit in allocated space!\n"); while(1); } - dom_imva = __va(dom_mpaddr + dom0_start); - copy_memory(dom_imva,elfaddr,filesz); - if (memsz > filesz) memset(dom_imva+filesz,0,memsz-filesz); + dom_imva = (unsigned long) __va(dom_mpaddr + dom0_start); + copy_memory((void *) dom_imva, (void *) elfaddr, filesz); + if (memsz > filesz) memset((void *) dom_imva+filesz, 0, memsz-filesz); //FIXME: This test for code seems to find a lot more than objdump -x does if (phdr.p_flags & PF_X) privify_memory(dom_imva,filesz); } 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 + dom_imva = (unsigned long) __va(page_to_maddr(p)); if (filesz > 0) { if (filesz >= PAGE_SIZE) - copy_memory(dom_imva,elfaddr,PAGE_SIZE); + copy_memory((void *) dom_imva, (void *) elfaddr, PAGE_SIZE); else { // copy partial page, zero the rest of page - copy_memory(dom_imva,elfaddr,filesz); - memset(dom_imva+filesz,0,PAGE_SIZE-filesz); + copy_memory((void *) dom_imva, (void *) elfaddr, filesz); + memset((void *) dom_imva+filesz, 0, PAGE_SIZE-filesz); } //FIXME: This test for code seems to find a lot more than objdump -x does if (phdr.p_flags & PF_X) privify_memory(dom_imva,PAGE_SIZE); } else if (memsz > 0) // always zero out entire page - memset(dom_imva,0,PAGE_SIZE); + memset((void *) dom_imva, 0, PAGE_SIZE); memsz -= PAGE_SIZE; filesz -= PAGE_SIZE; elfaddr += PAGE_SIZE; dom_mpaddr += PAGE_SIZE; } @@ -691,33 +698,33 @@ copy_memory(&ehdr,elfbase,sizeof(Elf_Ehdr)); if ( !elf_sanity_check(&ehdr) ) { - printk("ELF sanity check failed.\n"); - return -EINVAL; + printk("ELF sanity check failed.\n"); + return -EINVAL; } if ( (ehdr.e_phoff + (ehdr.e_phnum * ehdr.e_phentsize)) > elfsize ) { - printk("ELF program headers extend beyond end of image.\n"); - return -EINVAL; + printk("ELF program headers extend beyond end of image.\n"); + return -EINVAL; } if ( (ehdr.e_shoff + (ehdr.e_shnum * ehdr.e_shentsize)) > elfsize ) { - printk("ELF section headers extend beyond end of image.\n"); - return -EINVAL; + printk("ELF section headers extend beyond end of image.\n"); + return -EINVAL; } #if 0 /* Find the section-header strings table. */ if ( ehdr.e_shstrndx == SHN_UNDEF ) { - printk("ELF image has no section-header strings table (shstrtab).\n"); - return -EINVAL; + printk("ELF image has no section-header strings table (shstrtab).\n"); + return -EINVAL; } #endif *entry = ehdr.e_entry; -printf("parsedomainelfimage: entry point = %p\n",*entry); + printf("parsedomainelfimage: entry point = 0x%lx\n", *entry); return 0; } @@ -729,22 +736,21 @@ if (platform_is_hp_ski()) { dom0_size = 128*1024*1024; //FIXME: Should be configurable } - printf("alloc_dom0: starting (initializing %d MB...)\n",dom0_size/(1024*1024)); + printf("alloc_dom0: starting (initializing %lu MB...)\n",dom0_size/(1024*1024)); - /* FIXME: The first trunk (say 256M) should always be assigned to - * Dom0, since Dom0's physical == machine address for DMA purpose. - * Some old version linux, like 2.4, assumes physical memory existing - * in 2nd 64M space. - */ - dom0_start = alloc_boot_pages( - dom0_size >> PAGE_SHIFT, dom0_align >> PAGE_SHIFT); - dom0_start <<= PAGE_SHIFT; + /* FIXME: The first trunk (say 256M) should always be assigned to + * Dom0, since Dom0's physical == machine address for DMA purpose. + * Some old version linux, like 2.4, assumes physical memory existing + * in 2nd 64M space. + */ + dom0_start = alloc_boot_pages(dom0_size >> PAGE_SHIFT, dom0_align >> PAGE_SHIFT); + dom0_start <<= PAGE_SHIFT; if (!dom0_start) { - printf("construct_dom0: can't allocate contiguous memory size=%p\n", + printf("alloc_dom0: can't allocate contiguous memory size=%lu\n", dom0_size); while(1); } - printf("alloc_dom0: dom0_start=%p\n",dom0_start); + printf("alloc_dom0: dom0_start=0x%lx\n", dom0_start); #else dom0_start = 0; #endif @@ -772,13 +778,8 @@ unsigned long initrd_start, unsigned long initrd_len, char *cmdline) { - char *dst; int i, rc; - unsigned long pfn, mfn; - unsigned long nr_pt_pages; - unsigned long count; unsigned long alloc_start, alloc_end; - struct page_info *page = NULL; start_info_t *si; struct vcpu *v = d->vcpu[0]; @@ -788,16 +789,23 @@ unsigned long pkern_entry; unsigned long pkern_end; unsigned long pinitrd_start = 0; - unsigned long ret, progress = 0; + unsigned long pstart_info; +#if 0 + char *dst; + unsigned long nr_pt_pages; + unsigned long count; +#endif +#ifdef VALIDATE_VT + unsigned long mfn; + struct page_info *page = NULL; +#endif //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)); @@ -846,20 +854,26 @@ pinitrd_start=(dom0_start+dom0_size) - (PAGE_ALIGN(initrd_len) + 4*1024*1024); - memcpy(__va(pinitrd_start),initrd_start,initrd_len); + memcpy(__va(pinitrd_start), (void *) 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) ) { printk("Initial guest OS requires too much space\n" "(%luMB is greater than %luMB limit)\n", - (pkern_end-pkern_start)>>20, (d->max_pages<<PAGE_SHIFT)>>20); + (pkern_end-pkern_start)>>20, + (unsigned long) (d->max_pages<<PAGE_SHIFT)>>20); return -ENOMEM; } @@ -908,9 +922,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,79 +976,10 @@ 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; - VCPU(v, delivery_mask[1]) = -1L; - VCPU(v, delivery_mask[2]) = -1L; - VCPU(v, delivery_mask[3]) = -1L; - } - else __set_bit(0x30, VCPU(v, delivery_mask)); 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) { diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/hypercall.c --- a/xen/arch/ia64/xen/hypercall.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/hypercall.c Thu Mar 2 10:00:49 2006 @@ -9,24 +9,66 @@ #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 */ #include <asm/vcpu.h> #include <asm/dom_fw.h> +#include <public/dom0_ops.h> +#include <public/event_channel.h> #include <public/memory.h> #include <public/sched.h> extern unsigned long translate_domain_mpaddr(unsigned long); +/* FIXME: where these declarations should be there ? */ +extern int dump_privop_counts_to_user(char *, int); +extern int zero_privop_counts_to_user(char *, int); 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) { - struct vcpu *v = (struct domain *) current; + struct vcpu *v = current; struct sal_ret_values x; unsigned long *tv, *tc; int pi; @@ -94,23 +136,16 @@ 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); - tc = vcpu_get_gr(v,33); + tv = (unsigned long *) vcpu_get_gr(v,32); + tc = (unsigned long *) vcpu_get_gr(v,33); //printf("efi_get_time(%p,%p) called...",tv,tc); - tv = __va(translate_domain_mpaddr(tv)); - if (tc) tc = __va(translate_domain_mpaddr(tc)); - regs->r8 = (*efi.get_time)(tv,tc); + tv = (unsigned long *) __va(translate_domain_mpaddr((unsigned long) tv)); + if (tc) tc = (unsigned long *) __va(translate_domain_mpaddr((unsigned long) tc)); + regs->r8 = (*efi.get_time)((efi_time_t *) tv, (efi_time_cap_t *) tc); //printf("and returns %lx\n",regs->r8); break; case FW_HYPERCALL_EFI_SET_TIME: @@ -131,23 +166,23 @@ break; case 0xffff: regs->r8 = dump_privop_counts_to_user( - vcpu_get_gr(v,32), - vcpu_get_gr(v,33)); + (char *) vcpu_get_gr(v,32), + (int) vcpu_get_gr(v,33)); break; case 0xfffe: regs->r8 = zero_privop_counts_to_user( - vcpu_get_gr(v,32), - vcpu_get_gr(v,33)); + (char *) vcpu_get_gr(v,32), + (int) vcpu_get_gr(v,33)); break; case __HYPERVISOR_dom0_op: - regs->r8 = do_dom0_op(regs->r14); + regs->r8 = do_dom0_op((struct dom0_op *) regs->r14); break; case __HYPERVISOR_memory_op: /* we don't handle reservations; just return success */ { struct xen_memory_reservation reservation; - void *arg = regs->r15; + void *arg = (void *) regs->r15; switch(regs->r14) { case XENMEM_increase_reservation: @@ -159,31 +194,35 @@ regs->r8 = reservation.nr_extents; break; default: - regs->r8 = do_memory_op(regs->r14, regs->r15); + regs->r8 = do_memory_op((int) regs->r14, (void *)regs->r15); break; } } break; case __HYPERVISOR_event_channel_op: - regs->r8 = do_event_channel_op(regs->r14); + regs->r8 = do_event_channel_op((struct evtchn_op *) regs->r14); break; case __HYPERVISOR_grant_table_op: - regs->r8 = do_grant_table_op(regs->r14, regs->r15, regs->r16); + regs->r8 = do_grant_table_op((unsigned int) regs->r14, (void *) regs->r15, (unsigned int) regs->r16); break; case __HYPERVISOR_console_io: - regs->r8 = do_console_io(regs->r14, regs->r15, regs->r16); + regs->r8 = do_console_io((int) regs->r14, (int) regs->r15, (char *) regs->r16); break; case __HYPERVISOR_xen_version: - regs->r8 = do_xen_version(regs->r14, regs->r15); + regs->r8 = do_xen_version((int) regs->r14, (void *) regs->r15); + break; + + case __HYPERVISOR_multicall: + regs->r8 = do_multicall((struct multicall_entry *) regs->r14, (unsigned int) regs->r15); break; default: - printf("unknown hypercall %x\n", regs->r2); - regs->r8 = (unsigned long)-1; + printf("unknown hypercall %lx\n", regs->r2); + regs->r8 = do_ni_hypercall(); } return 1; } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/hyperprivop.S --- a/xen/arch/ia64/xen/hyperprivop.S Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/hyperprivop.S Thu Mar 2 10:00:49 2006 @@ -1336,7 +1336,7 @@ movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; ld8 r22=[r22];; adds r22=IA64_VCPU_META_SAVED_RR0_OFFSET,r22;; - ld4 r23=[r22];; + ld8 r23=[r22];; mov rr[r0]=r23;; srlz.i;; st4 [r20]=r0 ;; @@ -1372,7 +1372,7 @@ movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; ld8 r22=[r22];; adds r22=IA64_VCPU_META_RR0_OFFSET,r22;; - ld4 r23=[r22];; + ld8 r23=[r22];; mov rr[r0]=r23;; srlz.i;; adds r21=1,r0 ;; @@ -1733,7 +1733,7 @@ dep r23=r28,r23,16,8;; dep r23=r29,r23,8,8 cmp.eq p6,p0=r25,r0;; // if rr0, save for metaphysical -(p6) st4 [r24]=r23 +(p6) st8 [r24]=r23 mov rr[r8]=r23;; // done, mosey on back 1: mov r24=cr.ipsr diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/irq.c --- a/xen/arch/ia64/xen/irq.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/irq.c Thu Mar 2 10:00:49 2006 @@ -129,7 +129,9 @@ } #endif +#ifndef XEN static void register_irq_proc (unsigned int irq); +#endif /* * Special irq handlers. @@ -286,7 +288,9 @@ int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, struct irqaction *action) { +#ifndef XEN int status = 1; /* Force the "do bottom halves" bit */ +#endif int retval = 0; #ifndef XEN @@ -657,8 +661,10 @@ if (!action) return -ENOMEM; +#ifdef XEN + action->handler = (void *) handler; +#else action->handler = handler; -#ifndef XEN action->flags = irqflags; action->mask = 0; #endif @@ -698,7 +704,9 @@ #endif { irq_desc_t *desc; +#ifndef XEN struct irqaction **p; +#endif unsigned long flags; if (irq >= NR_IRQS) @@ -755,7 +763,8 @@ * disabled. */ -static DECLARE_MUTEX(probe_sem); +#ifndef XEN +static int DECLARE_MUTEX(probe_sem); /** * probe_irq_on - begin an interrupt autodetect @@ -765,7 +774,6 @@ * */ -#ifndef XEN unsigned long probe_irq_on(void) { unsigned int i; @@ -936,7 +944,9 @@ int setup_irq(unsigned int irq, struct irqaction * new) { +#ifndef XEN int shared = 0; +#endif unsigned long flags; struct irqaction *old, **p; irq_desc_t *desc = irq_descp(irq); @@ -1371,7 +1381,7 @@ return 0; } -int pirq_guest_bind(struct vcpu *d, int irq, int will_share) +int pirq_guest_bind(struct vcpu *v, int irq, int will_share) { irq_desc_t *desc = &irq_desc[irq]; irq_guest_action_t *action; @@ -1431,7 +1441,7 @@ goto out; } - action->guest[action->nr_guests++] = d; + action->guest[action->nr_guests++] = v->domain; out: spin_unlock_irqrestore(&desc->lock, flags); @@ -1480,9 +1490,11 @@ #ifdef XEN #ifdef IA64 // this is a temporary hack until real console input is implemented +extern void domain_pend_keyboard_interrupt(int irq); irqreturn_t guest_forward_keyboard_input(int irq, void *nada, struct pt_regs *regs) { domain_pend_keyboard_interrupt(irq); + return 0; } void serial_input_init(void) diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/ivt.S --- a/xen/arch/ia64/xen/ivt.S Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/ivt.S Thu Mar 2 10:00:49 2006 @@ -298,12 +298,83 @@ DBG_FAULT(2) #ifdef XEN VHPT_CCHAIN_LOOKUP(dtlb_miss,d) +#if VHPT_ENABLED + // XXX TODO optimization + mov r31=pr // save predicates + mov r30=cr.ipsr + mov r28=cr.iip + mov r16=cr.ifa // get virtual address + mov r17=cr.isr // save predicates + ;; + + extr.u r18 = r30, IA64_PSR_CPL0_BIT, 2 // extract psr.cpl + ;; + cmp.ne p6, p0 = r0, r18 // cpl == 0? +(p6) br.cond.sptk 2f + + // is speculation bit on? + tbit.nz p7,p0=r17,IA64_ISR_SP_BIT + ;; +(p7) br.cond.spnt 2f + + // is non-access bit on? + tbit.nz p8,p0=r17,IA64_ISR_NA_BIT + ;; +(p8) br.cond.spnt 2f + + // cr.isr.code == IA64_ISR_CODE_LFETCH? + and r18=IA64_ISR_CODE_MASK,r17 // get the isr.code field + ;; + cmp.eq p9,p0=IA64_ISR_CODE_LFETCH,r18 // check isr.code field +(p9) br.cond.spnt 2f + + // Is the faulted iip in vmm area? + // check [59:58] bit + // 00, 11: guest + // 01, 10: vmm + extr.u r19 = r28, 58, 2 + ;; + cmp.eq p10, p0 = 0x0, r19 +(p10) br.cond.sptk 2f + cmp.eq p11, p0 = 0x3, r19 +(p11) br.cond.sptk 2f + + // Is the faulted address is in the identity mapping area? + // 0xf000... or 0xe8000... + extr.u r20 = r16, 59, 5 + ;; + cmp.eq p12, p0 = 0x1e, r20 // (0xf0 >> 3) = 0x1e +(p12) br.cond.spnt 1f + cmp.eq p0, p13 = 0x1d, r20 // (0xe8 >> 3) = 0x1d +(p13) br.cond.sptk 2f + +1: + // xen identity mappin area. + movl r24=PAGE_KERNEL + movl r25=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff) + ;; + shr.u r26=r16,55 // move address bit 59 to bit 4 + and r25=r25,r16 // clear ed, reserved bits, and PTE control bits + ;; + and r26=0x10,r26 // bit 4=address-bit(59) + ;; + or r25=r25,r24 // insert PTE control bits into r25 + ;; + or r25=r25,r26 // set bit 4 (uncached) if the access was to region 6 + ;; + itc.d r25 // insert the TLB entry + mov pr=r31,-1 + rfi + +2: +#endif #ifdef VHPT_GLOBAL // br.cond.sptk page_fault br.cond.sptk fast_tlb_miss_reflect ;; #endif -#endif + mov r29=b0 // save b0 +#else /* * The DTLB handler accesses the L3 PTE via the virtually mapped linear * page table. If a nested TLB miss occurs, we switch into physical @@ -313,6 +384,7 @@ mov r16=cr.ifa // get virtual address mov r29=b0 // save b0 mov r31=pr // save predicates +#endif dtlb_fault: mov r17=cr.iha // get virtual address of L3 PTE movl r30=1f // load nested fault continuation point @@ -399,6 +471,9 @@ ;; or r19=r19,r18 // set bit 4 (uncached) if the access was to region 6 (p8) br.cond.spnt page_fault +#ifdef XEN + FORCE_CRASH +#endif ;; itc.i r19 // insert the TLB entry mov pr=r31,-1 diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/mm_init.c --- a/xen/arch/ia64/xen/mm_init.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/mm_init.c Thu Mar 2 10:00:49 2006 @@ -47,6 +47,7 @@ #include <asm/uaccess.h> #include <asm/unistd.h> #include <asm/mca.h> +#include <asm/vhpt.h> #ifndef XEN DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); @@ -63,7 +64,7 @@ EXPORT_SYMBOL(vmem_map); #endif -static int pgt_cache_water[2] = { 25, 50 }; +// static int pgt_cache_water[2] = { 25, 50 }; struct page *zero_page_memmap_ptr; /* map entry for zero page */ EXPORT_SYMBOL(zero_page_memmap_ptr); @@ -222,7 +223,7 @@ ia64_set_rbs_bot (void) { #ifdef XEN - unsigned stack_size = MAX_USER_STACK_SIZE; + unsigned long stack_size = MAX_USER_STACK_SIZE; #else unsigned long stack_size = current->rlim[RLIMIT_STACK].rlim_max & -16; #endif @@ -279,7 +280,7 @@ #endif } -setup_gate (void) +void setup_gate (void) { printk("setup_gate not-implemented.\n"); } @@ -287,7 +288,10 @@ void __devinit ia64_mmu_init (void *my_cpu_data) { - unsigned long psr, pta, impl_va_bits; + unsigned long psr, impl_va_bits; +#if 0 + unsigned long pta; +#endif extern void __devinit tlb_init (void); int cpu; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/pcdp.c --- a/xen/arch/ia64/xen/pcdp.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/pcdp.c Thu Mar 2 10:00:49 2006 @@ -71,7 +71,9 @@ { struct pcdp *pcdp; struct pcdp_uart *uart; +#ifndef XEN struct pcdp_device *dev, *end; +#endif int i, serial = 0; pcdp = efi.hcdp; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/privop.c --- a/xen/arch/ia64/xen/privop.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/privop.c Thu Mar 2 10:00:49 2006 @@ -11,7 +11,12 @@ #include <asm/processor.h> #include <asm/delay.h> // Debug only #include <asm/dom_fw.h> +#include <asm/vhpt.h> //#include <debug.h> + +/* FIXME: where these declarations should be there ? */ +extern int dump_reflect_counts(char *); +extern void zero_reflect_counts(void); long priv_verbose=0; @@ -524,7 +529,7 @@ Privileged operation decode and dispatch routines **************************************************************************/ -IA64_SLOT_TYPE slot_types[0x20][3] = { +static const IA64_SLOT_TYPE slot_types[0x20][3] = { {M, I, I}, {M, I, I}, {M, I, I}, {M, I, I}, {M, I, ILLEGAL}, {M, I, ILLEGAL}, {ILLEGAL, ILLEGAL, ILLEGAL}, {ILLEGAL, ILLEGAL, ILLEGAL}, @@ -544,7 +549,7 @@ // pointer to privileged emulation function typedef IA64FAULT (*PPEFCN)(VCPU *vcpu, INST64 inst); -PPEFCN Mpriv_funcs[64] = { +static const PPEFCN Mpriv_funcs[64] = { priv_mov_to_rr, priv_mov_to_dbr, priv_mov_to_ibr, priv_mov_to_pkr, priv_mov_to_pmc, priv_mov_to_pmd, 0, 0, 0, priv_ptc_l, priv_ptc_g, priv_ptc_ga, @@ -600,7 +605,7 @@ if (__copy_from_user(&bundle,iip,sizeof(bundle))) #endif { -//printf("*** priv_handle_op: privop bundle @%p not mapped, retrying\n",iip); +//printf("*** priv_handle_op: privop bundle at 0x%lx not mapped, retrying\n",iip); return vcpu_force_data_miss(vcpu,regs->cr_iip); } #if 0 @@ -613,8 +618,8 @@ #endif if (privop_trace) { static long i = 400; - //if (i > 0) printf("privop @%p\n",iip); - if (i > 0) printf("priv_handle_op: @%p, itc=%lx, itm=%lx\n", + //if (i > 0) printf("priv_handle_op: at 0x%lx\n",iip); + if (i > 0) printf("priv_handle_op: privop trace at 0x%lx, itc=%lx, itm=%lx\n", iip,ia64_get_itc(),ia64_get_itm()); i--; } @@ -727,7 +732,7 @@ break; } //printf("We who are about do die salute you\n"); - printf("handle_op: can't handle privop at 0x%lx (op=0x%016lx) slot %d (type=%d), ipsr=%p\n", + printf("priv_handle_op: can't handle privop at 0x%lx (op=0x%016lx) slot %d (type=%d), ipsr=0x%lx\n", iip, (UINT64)inst.inst, slot, slot_type, ipsr); //printf("vtop(0x%lx)==0x%lx\n", iip, tr_vtop(iip)); //thread_mozambique("privop fault\n"); @@ -768,7 +773,7 @@ (void)vcpu_increment_iip(vcpu); } if (fault == IA64_ILLOP_FAULT) - printf("priv_emulate: priv_handle_op fails, isr=%p\n",isr); + printf("priv_emulate: priv_handle_op fails, isr=0x%lx\n",isr); return fault; } @@ -794,11 +799,10 @@ #define HYPERPRIVOP_SET_KR 0x12 #define HYPERPRIVOP_MAX 0x12 -char *hyperpriv_str[HYPERPRIVOP_MAX+1] = { +static const char * const hyperpriv_str[HYPERPRIVOP_MAX+1] = { 0, "rfi", "rsm.dt", "ssm.dt", "cover", "itc.d", "itc.i", "ssm.i", "=ivr", "=tpr", "tpr=", "eoi", "itm=", "thash", "ptc.ga", "itr.d", - "=rr", "rr=", "kr=", - 0 + "=rr", "rr=", "kr=" }; unsigned long slow_hyperpriv_cnt[HYPERPRIVOP_MAX+1] = { 0 }; @@ -809,15 +813,14 @@ int ia64_hyperprivop(unsigned long iim, REGS *regs) { - struct vcpu *v = (struct domain *) current; - INST64 inst; + struct vcpu *v = current; UINT64 val; UINT64 itir, ifa; // FIXME: Handle faults appropriately for these if (!iim || iim > HYPERPRIVOP_MAX) { printf("bad hyperprivop; ignored\n"); - printf("iim=%d, iip=%p\n",iim,regs->cr_iip); + printf("iim=%lx, iip=0x%lx\n", iim, regs->cr_iip); return 1; } slow_hyperpriv_cnt[iim]++; @@ -895,7 +898,7 @@ Privileged operation instrumentation routines **************************************************************************/ -char *Mpriv_str[64] = { +static const char * const Mpriv_str[64] = { "mov_to_rr", "mov_to_dbr", "mov_to_ibr", "mov_to_pkr", "mov_to_pmc", "mov_to_pmd", "<0x06>", "<0x07>", "<0x08>", "ptc_l", "ptc_g", "ptc_ga", @@ -915,7 +918,7 @@ }; #define RS "Rsvd" -char *cr_str[128] = { +static const char * const cr_str[128] = { "dcr","itm","iva",RS,RS,RS,RS,RS, "pta",RS,RS,RS,RS,RS,RS,RS, "ipsr","isr",RS,"iip","ifa","itir","iipa","ifs", @@ -946,48 +949,48 @@ for (i=0; i < 64; i++) sum += privcnt.Mpriv_cnt[i]; s += sprintf(s,"Privop statistics: (Total privops: %ld)\n",sum); if (privcnt.mov_to_ar_imm) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.mov_to_ar_imm, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_to_ar_imm, "mov_to_ar_imm", (privcnt.mov_to_ar_imm*100L)/sum); if (privcnt.mov_to_ar_reg) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.mov_to_ar_reg, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_to_ar_reg, "mov_to_ar_reg", (privcnt.mov_to_ar_reg*100L)/sum); if (privcnt.mov_from_ar) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.mov_from_ar, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_from_ar, "privified-mov_from_ar", (privcnt.mov_from_ar*100L)/sum); if (privcnt.ssm) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.ssm, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.ssm, "ssm", (privcnt.ssm*100L)/sum); if (privcnt.rsm) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.rsm, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.rsm, "rsm", (privcnt.rsm*100L)/sum); if (privcnt.rfi) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.rfi, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.rfi, "rfi", (privcnt.rfi*100L)/sum); if (privcnt.bsw0) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.bsw0, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.bsw0, "bsw0", (privcnt.bsw0*100L)/sum); if (privcnt.bsw1) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.bsw1, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.bsw1, "bsw1", (privcnt.bsw1*100L)/sum); if (privcnt.cover) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.cover, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.cover, "cover", (privcnt.cover*100L)/sum); if (privcnt.fc) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.fc, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.fc, "privified-fc", (privcnt.fc*100L)/sum); if (privcnt.cpuid) - s += sprintf(s,"%10d %s [%d%%]\n", privcnt.cpuid, + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.cpuid, "privified-getcpuid", (privcnt.cpuid*100L)/sum); for (i=0; i < 64; i++) if (privcnt.Mpriv_cnt[i]) { if (!Mpriv_str[i]) s += sprintf(s,"PRIVSTRING NULL!!\n"); - else s += sprintf(s,"%10d %s [%d%%]\n", privcnt.Mpriv_cnt[i], + else s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.Mpriv_cnt[i], Mpriv_str[i], (privcnt.Mpriv_cnt[i]*100L)/sum); if (i == 0x24) { // mov from CR s += sprintf(s," ["); for (j=0; j < 128; j++) if (from_cr_cnt[j]) { if (!cr_str[j]) s += sprintf(s,"PRIVSTRING NULL!!\n"); - s += sprintf(s,"%s(%d),",cr_str[j],from_cr_cnt[j]); + s += sprintf(s,"%s(%ld),",cr_str[j],from_cr_cnt[j]); } s += sprintf(s,"]\n"); } @@ -996,7 +999,7 @@ for (j=0; j < 128; j++) if (to_cr_cnt[j]) { if (!cr_str[j]) s += sprintf(s,"PRIVSTRING NULL!!\n"); - s += sprintf(s,"%s(%d),",cr_str[j],to_cr_cnt[j]); + s += sprintf(s,"%s(%ld),",cr_str[j],to_cr_cnt[j]); } s += sprintf(s,"]\n"); } @@ -1050,7 +1053,7 @@ s += sprintf(s,"%s:\n",v->instname); for (j = 0; j < PRIVOP_COUNT_NADDRS; j++) { if (!v->addr[j]) break; - s += sprintf(s," @%p #%ld\n",v->addr[j],v->count[j]); + s += sprintf(s," at 0x%lx #%ld\n",v->addr[j],v->count[j]); } if (v->overflow) s += sprintf(s," other #%ld\n",v->overflow); @@ -1085,17 +1088,17 @@ int dump_misc_stats(char *buf) { char *s = buf; - s += sprintf(s,"Virtual TR translations: %d\n",tr_translate_count); - s += sprintf(s,"Virtual VHPT slow translations: %d\n",vhpt_translate_count); - s += sprintf(s,"Virtual VHPT fast translations: %d\n",fast_vhpt_translate_count); - s += sprintf(s,"Virtual DTLB translations: %d\n",dtlb_translate_count); - s += sprintf(s,"Physical translations: %d\n",phys_translate_count); - s += sprintf(s,"Recoveries to page fault: %d\n",recover_to_page_fault_count); - s += sprintf(s,"Recoveries to break fault: %d\n",recover_to_break_fault_count); - s += sprintf(s,"Idle when pending: %d\n",idle_when_pending); - s += sprintf(s,"PAL_HALT_LIGHT (no pending): %d\n",pal_halt_light_count); - s += sprintf(s,"context switches: %d\n",context_switch_count); - s += sprintf(s,"Lazy covers: %d\n",lazy_cover_count); + s += sprintf(s,"Virtual TR translations: %ld\n",tr_translate_count); + s += sprintf(s,"Virtual VHPT slow translations: %ld\n",vhpt_translate_count); + s += sprintf(s,"Virtual VHPT fast translations: %ld\n",fast_vhpt_translate_count); + s += sprintf(s,"Virtual DTLB translations: %ld\n",dtlb_translate_count); + s += sprintf(s,"Physical translations: %ld\n",phys_translate_count); + s += sprintf(s,"Recoveries to page fault: %ld\n",recover_to_page_fault_count); + s += sprintf(s,"Recoveries to break fault: %ld\n",recover_to_break_fault_count); + s += sprintf(s,"Idle when pending: %ld\n",idle_when_pending); + s += sprintf(s,"PAL_HALT_LIGHT (no pending): %ld\n",pal_halt_light_count); + s += sprintf(s,"context switches: %ld\n",context_switch_count); + s += sprintf(s,"Lazy covers: %ld\n",lazy_cover_count); return s - buf; } @@ -1120,17 +1123,17 @@ char *s = buf; unsigned long total = 0; for (i = 1; i <= HYPERPRIVOP_MAX; i++) total += slow_hyperpriv_cnt[i]; - s += sprintf(s,"Slow hyperprivops (total %d):\n",total); + s += sprintf(s,"Slow hyperprivops (total %ld):\n",total); for (i = 1; i <= HYPERPRIVOP_MAX; i++) if (slow_hyperpriv_cnt[i]) - s += sprintf(s,"%10d %s\n", + s += sprintf(s,"%10ld %s\n", slow_hyperpriv_cnt[i], hyperpriv_str[i]); total = 0; for (i = 1; i <= HYPERPRIVOP_MAX; i++) total += fast_hyperpriv_cnt[i]; - s += sprintf(s,"Fast hyperprivops (total %d):\n",total); + s += sprintf(s,"Fast hyperprivops (total %ld):\n",total); for (i = 1; i <= HYPERPRIVOP_MAX; i++) if (fast_hyperpriv_cnt[i]) - s += sprintf(s,"%10d %s\n", + s += sprintf(s,"%10ld %s\n", fast_hyperpriv_cnt[i], hyperpriv_str[i]); return s - buf; } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/process.c --- a/xen/arch/ia64/xen/process.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/process.c Thu Mar 2 10:00:49 2006 @@ -33,8 +33,14 @@ #include <xen/multicall.h> #include <asm/debugger.h> -extern unsigned long vcpu_get_itir_on_fault(struct vcpu *, UINT64); extern void die_if_kernel(char *str, struct pt_regs *regs, long err); +/* FIXME: where these declarations shold be there ? */ +extern void load_region_regs(struct vcpu *); +extern void panic_domain(struct pt_regs *, const char *, ...); +extern long platform_is_hp_ski(void); +extern int ia64_hyperprivop(unsigned long, REGS *); +extern int ia64_hypercall(struct pt_regs *regs); +extern void vmx_do_launch(struct vcpu *); extern unsigned long dom0_start, dom0_size; @@ -94,18 +100,21 @@ extern unsigned long dom0_start, dom0_size; // FIXME address had better be pre-validated on insert - mask = (1L << ((itir >> 2) & 0x3f)) - 1; + mask = ~itir_mask(itir); mpaddr = ((pteval & _PAGE_PPN_MASK) & ~mask) | (address & mask); if (d == dom0) { if (mpaddr < dom0_start || mpaddr >= dom0_start + dom0_size) { - //printk("translate_domain_pte: out-of-bounds dom0 mpaddr %p! itc=%lx...\n",mpaddr,ia64_get_itc()); + /* + printk("translate_domain_pte: out-of-bounds dom0 mpaddr 0x%lx! itc=%lx...\n", + mpaddr, ia64_get_itc()); + */ tdpfoo(); } } else if ((mpaddr >> PAGE_SHIFT) > d->max_pages) { if ((mpaddr & ~0x1fffL ) != (1L << 40)) - printf("translate_domain_pte: bad mpa=%p (> %p),vadr=%p,pteval=%p,itir=%p\n", - mpaddr,d->max_pages<<PAGE_SHIFT,address,pteval,itir); + printf("translate_domain_pte: bad mpa=0x%lx (> 0x%lx),vadr=0x%lx,pteval=0x%lx,itir=0x%lx\n", + mpaddr, (unsigned long) d->max_pages<<PAGE_SHIFT, address, pteval, itir); tdpfoo(); } pteval2 = lookup_domain_mpa(d,mpaddr); @@ -123,7 +132,8 @@ if (current->domain == dom0) { if (mpaddr < dom0_start || mpaddr >= dom0_start + dom0_size) { - printk("translate_domain_mpaddr: out-of-bounds dom0 mpaddr %p! continuing...\n",mpaddr); + printk("translate_domain_mpaddr: out-of-bounds dom0 mpaddr 0x%lx! continuing...\n", + mpaddr); tdpfoo(); } } @@ -150,7 +160,7 @@ s += sprintf(s,"Slow reflections by vector:\n"); for (i = 0, j = 0; i < 0x80; i++) { - if (cnt = slow_reflect_count[i]) { + if ( (cnt = slow_reflect_count[i]) != 0 ) { s += sprintf(s,"0x%02x00:%10d, ",i,cnt); if ((j++ & 3) == 3) s += sprintf(s,"\n"); } @@ -158,7 +168,7 @@ if (j & 3) s += sprintf(s,"\n"); s += sprintf(s,"Fast reflections by vector:\n"); for (i = 0, j = 0; i < 0x80; i++) { - if (cnt = fast_reflect_count[i]) { + if ( (cnt = fast_reflect_count[i]) != 0 ) { s += sprintf(s,"0x%02x00:%10d, ",i,cnt); if ((j++ & 3) == 3) s += sprintf(s,"\n"); } @@ -186,7 +196,6 @@ void reflect_interruption(unsigned long isr, struct pt_regs *regs, unsigned long vector) { - unsigned long vcpu_get_ipsr_int_state(struct vcpu *,unsigned long); struct vcpu *v = current; if (!PSCB(v,interrupt_collection_enabled)) @@ -205,7 +214,7 @@ #ifdef CONFIG_SMP #warning "SMP FIXME: sharedinfo doesn't handle smp yet, need page per vcpu" #endif - regs->r31 = &(((mapped_regs_t *)SHARED_ARCHINFO_ADDR)->ipsr); + regs->r31 = (unsigned long) &(((mapped_regs_t *)SHARED_ARCHINFO_ADDR)->ipsr); PSCB(v,interrupt_delivery_enabled) = 0; PSCB(v,interrupt_collection_enabled) = 0; @@ -219,14 +228,12 @@ void reflect_extint(struct pt_regs *regs) { - extern unsigned long vcpu_verbose, privop_trace; unsigned long isr = regs->cr_ipsr & IA64_PSR_RI; struct vcpu *v = current; - static first_extint = 1; + static int first_extint = 1; if (first_extint) { - printf("Delivering first extint to domain: isr=%p, iip=%p\n",isr,regs->cr_iip); - //privop_trace = 1; vcpu_verbose = 1; + printf("Delivering first extint to domain: isr=0x%lx, iip=0x%lx\n", isr, regs->cr_iip); first_extint = 0; } if (vcpu_timer_pending_early(v)) @@ -297,11 +304,11 @@ // should never happen. If it does, region 0 addr may // indicate a bad xen pointer printk("*** xen_handle_domain_access: exception table" - " lookup failed, iip=%p, addr=%p, spinning...\n", - iip,address); + " lookup failed, iip=0x%lx, addr=0x%lx, spinning...\n", + iip, address); panic_domain(regs,"*** xen_handle_domain_access: exception table" - " lookup failed, iip=%p, addr=%p, spinning...\n", - iip,address); + " lookup failed, iip=0x%lx, addr=0x%lx, spinning...\n", + iip, address); } return; } @@ -329,10 +336,9 @@ unsigned long arg6, unsigned long arg7, unsigned long stack) { struct pt_regs *regs = (struct pt_regs *) &stack; - unsigned long code, error = isr; + unsigned long code; char buf[128]; - int result, sig; - static const char *reason[] = { + static const char * const reason[] = { "IA-64 Illegal Operation fault", "IA-64 Privileged Operation fault", "IA-64 Privileged Register fault", @@ -543,7 +549,6 @@ /**/ static int last_fd, last_count; // FIXME FIXME FIXME /**/ // BROKEN FOR MULTIPLE DOMAINS & SMP /**/ struct ssc_disk_stat { int fd; unsigned count;} *stat, last_stat; - extern unsigned long vcpu_verbose, privop_trace; arg0 = vcpu_get_gr(current,32); switch(ssc) { @@ -588,11 +593,11 @@ arg3 = vcpu_get_gr(current,35); if (arg2) { // metaphysical address of descriptor struct ssc_disk_req *req; - unsigned long mpaddr, paddr; + unsigned long mpaddr; long len; arg2 = translate_domain_mpaddr(arg2); - req = (struct disk_req *)__va(arg2); + req = (struct ssc_disk_req *) __va(arg2); req->len &= 0xffffffffL; // avoid strange bug len = req->len; /**/ last_fd = arg1; @@ -640,7 +645,8 @@ vcpu_set_gr(current,8,-1L,0); break; default: - printf("ia64_handle_break: bad ssc code %lx, iip=%p, b0=%p... spinning\n",ssc,regs->cr_iip,regs->b0); + printf("ia64_handle_break: bad ssc code %lx, iip=0x%lx, b0=0x%lx... spinning\n", + ssc, regs->cr_iip, regs->b0); while(1); break; } @@ -696,8 +702,7 @@ ia64_handle_privop (unsigned long ifa, struct pt_regs *regs, unsigned long isr, unsigned long itir) { IA64FAULT vector; - struct domain *d = current->domain; - struct vcpu *v = current; + vector = priv_emulate(current,regs,isr); if (vector != IA64_NO_FAULT && vector != IA64_RFI_IN_PROGRESS) { // Note: if a path results in a vector to reflect that requires @@ -712,8 +717,7 @@ void ia64_handle_reflection (unsigned long ifa, struct pt_regs *regs, unsigned long isr, unsigned long iim, unsigned long vector) { - struct domain *d = (struct domain *) current->domain; - struct vcpu *v = (struct domain *) current; + struct vcpu *v = current; unsigned long check_lazy_cover = 0; unsigned long psr = regs->cr_ipsr; @@ -753,7 +757,8 @@ } #endif printf("*** NaT fault... attempting to handle as privop\n"); -printf("isr=%p, ifa=%p,iip=%p,ipsr=%p\n",isr,ifa,regs->cr_iip,psr); +printf("isr=%016lx, ifa=%016lx, iip=%016lx, ipsr=%016lx\n", + isr, ifa, regs->cr_iip, psr); //regs->eml_unat = 0; FIXME: DO WE NEED THIS??? // certain NaT faults are higher priority than privop faults vector = priv_emulate(v,regs,isr); @@ -800,8 +805,7 @@ unsigned int op, const char *format, ...) { struct mc_state *mcs = &mc_state[smp_processor_id()]; - VCPU *vcpu = current; - struct cpu_user_regs *regs = vcpu_regs(vcpu); + struct vcpu *v = current; const char *p = format; unsigned long arg; unsigned int i; @@ -811,7 +815,7 @@ if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) { panic("PREEMPT happen in multicall\n"); // Not support yet } else { - vcpu_set_gr(vcpu, 2, op, 0); + vcpu_set_gr(v, 2, op, 0); for ( i = 0; *p != '\0'; i++) { switch ( *p++ ) { @@ -830,22 +834,22 @@ BUG(); } switch (i) { - case 0: vcpu_set_gr(vcpu, 14, arg, 0); + case 0: vcpu_set_gr(v, 14, arg, 0); break; - case 1: vcpu_set_gr(vcpu, 15, arg, 0); + case 1: vcpu_set_gr(v, 15, arg, 0); break; - case 2: vcpu_set_gr(vcpu, 16, arg, 0); + case 2: vcpu_set_gr(v, 16, arg, 0); break; - case 3: vcpu_set_gr(vcpu, 17, arg, 0); + case 3: vcpu_set_gr(v, 17, arg, 0); break; - case 4: vcpu_set_gr(vcpu, 18, arg, 0); + case 4: vcpu_set_gr(v, 18, arg, 0); break; default: panic("Too many args for hypercall continuation\n"); break; } } } - vcpu->arch.hypercall_continuation = 1; + v->arch.hypercall_continuation = 1; va_end(args); return op; } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/regionreg.c --- a/xen/arch/ia64/xen/regionreg.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/regionreg.c Thu Mar 2 10:00:49 2006 @@ -18,6 +18,8 @@ extern void ia64_new_rr7(unsigned long rid,void *shared_info, void *shared_arch_info, unsigned long p_vhpt, unsigned long v_pal); extern void *pal_vaddr; +/* FIXME: where these declarations should be there ? */ +extern void panic_domain(struct pt_regs *, const char *, ...); #define IA64_MIN_IMPL_RID_BITS (IA64_MIN_IMPL_RID_MSB+1) #define IA64_MAX_IMPL_RID_BITS 24 @@ -142,7 +144,7 @@ // setup domain struct d->arch.rid_bits = ridbits; d->arch.starting_rid = i << IA64_MIN_IMPL_RID_BITS; d->arch.ending_rid = (i+n_rid_blocks) << IA64_MIN_IMPL_RID_BITS; -printf("###allocating rid_range, domain %p: starting_rid=%lx, ending_rid=%lx\n", +printf("###allocating rid_range, domain %p: starting_rid=%x, ending_rid=%x\n", d,d->arch.starting_rid, d->arch.ending_rid); return 1; @@ -211,7 +213,6 @@ unsigned long rreg = REGION_NUMBER(rr); ia64_rr rrv, newrrv, memrrv; unsigned long newrid; - extern unsigned long vhpt_paddr; if (val == -1) return 1; @@ -220,8 +221,8 @@ newrid = v->arch.starting_rid + rrv.rid; if (newrid > v->arch.ending_rid) { - printk("can't set rr%d to %lx, starting_rid=%lx," - "ending_rid=%lx, val=%lx\n", rreg, newrid, + printk("can't set rr%d to %lx, starting_rid=%x," + "ending_rid=%x, val=%lx\n", (int) rreg, newrid, v->arch.starting_rid,v->arch.ending_rid,val); return 0; } @@ -249,10 +250,12 @@ newrrv.rid = newrid; newrrv.ve = 1; // VHPT now enabled for region 7!! newrrv.ps = PAGE_SHIFT; - if (rreg == 0) v->arch.metaphysical_saved_rr0 = - vmMangleRID(newrrv.rrval); - if (rreg == 7) ia64_new_rr7(vmMangleRID(newrrv.rrval),v->vcpu_info, - v->arch.privregs, vhpt_paddr, pal_vaddr); + if (rreg == 0) + v->arch.metaphysical_saved_rr0 = vmMangleRID(newrrv.rrval); + else if (rreg == 7) + ia64_new_rr7(vmMangleRID(newrrv.rrval),v->vcpu_info, + v->arch.privregs, __get_cpu_var(vhpt_paddr), + (unsigned long) pal_vaddr); else set_rr(rr,newrrv.rrval); #endif return 1; @@ -262,11 +265,12 @@ int set_metaphysical_rr0(void) { struct vcpu *v = current; - ia64_rr rrv; +// ia64_rr rrv; // rrv.ve = 1; FIXME: TURN ME BACK ON WHEN VHPT IS WORKING ia64_set_rr(0,v->arch.metaphysical_rr0); ia64_srlz_d(); + return 1; } // validates/changes region registers 0-6 in the currently executing domain diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/sn_console.c --- a/xen/arch/ia64/xen/sn_console.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/sn_console.c Thu Mar 2 10:00:49 2006 @@ -9,7 +9,13 @@ #include <asm/sn/sn_sal.h> #include <xen/serial.h> -void sn_putc(struct serial_port *, char); +/* + * sn_putc - Send a character to the console, polled or interrupt mode + */ +static void sn_putc(struct serial_port *port, char c) +{ + ia64_sn_console_putc(c); +} static struct uart_driver sn_sal_console = { .putc = sn_putc, @@ -75,11 +81,3 @@ return 0; } - -/* - * sn_putc - Send a character to the console, polled or interrupt mode - */ -void sn_putc(struct serial_port *port, char c) -{ - return ia64_sn_console_putc(c); -} diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/vcpu.c --- a/xen/arch/ia64/xen/vcpu.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/vcpu.c Thu Mar 2 10:00:49 2006 @@ -21,7 +21,15 @@ #include <asm/processor.h> #include <asm/delay.h> #include <asm/vmx_vcpu.h> +#include <asm/vhpt.h> +#include <asm/tlbflush.h> #include <xen/event.h> + +/* FIXME: where these declarations should be there ? */ +extern void getreg(unsigned long regnum, unsigned long *val, int *nat, struct pt_regs *regs); +extern void setreg(unsigned long regnum, unsigned long val, int nat, struct pt_regs *regs); +extern void panic_domain(struct pt_regs *, const char *, ...); +extern int set_metaphysical_rr0(void); typedef union { struct ia64_psr ia64_psr; @@ -47,10 +55,10 @@ #define STATIC #ifdef PRIVOP_ADDR_COUNT -struct privop_addr_count privop_addr_counter[PRIVOP_COUNT_NINSTS] = { - { "=ifa", { 0 }, { 0 }, 0 }, +struct privop_addr_count privop_addr_counter[PRIVOP_COUNT_NINSTS+1] = { + { "=ifa", { 0 }, { 0 }, 0 }, { "thash", { 0 }, { 0 }, 0 }, - 0 + { 0, { 0 }, { 0 }, 0 } }; extern void privop_count_addr(unsigned long addr, int inst); #define PRIVOP_COUNT_ADDR(regs,inst) privop_count_addr(regs->cr_iip,inst) @@ -81,7 +89,7 @@ **************************************************************************/ #ifdef XEN UINT64 -vcpu_get_gr(VCPU *vcpu, unsigned reg) +vcpu_get_gr(VCPU *vcpu, unsigned long reg) { REGS *regs = vcpu_regs(vcpu); UINT64 val; @@ -90,7 +98,7 @@ return val; } IA64FAULT -vcpu_get_gr_nat(VCPU *vcpu, unsigned reg, UINT64 *val) +vcpu_get_gr_nat(VCPU *vcpu, unsigned long reg, UINT64 *val) { REGS *regs = vcpu_regs(vcpu); int nat; @@ -104,7 +112,7 @@ // IA64_ILLOP_FAULT if the register would cause an Illegal Operation fault // IA64_NO_FAULT otherwise IA64FAULT -vcpu_set_gr(VCPU *vcpu, unsigned reg, UINT64 value, int nat) +vcpu_set_gr(VCPU *vcpu, unsigned long reg, UINT64 value, int nat) { REGS *regs = vcpu_regs(vcpu); if (!reg) return IA64_ILLOP_FAULT; @@ -118,7 +126,7 @@ // IA64_ILLOP_FAULT if the register would cause an Illegal Operation fault // IA64_NO_FAULT otherwise IA64FAULT -vcpu_set_gr(VCPU *vcpu, unsigned reg, UINT64 value) +vcpu_set_gr(VCPU *vcpu, unsigned long reg, UINT64 value) { REGS *regs = vcpu_regs(vcpu); long sof = (regs->cr_ifs) & 0x7f; @@ -375,7 +383,7 @@ UINT64 vcpu_get_ipsr_int_state(VCPU *vcpu,UINT64 prevpsr) { UINT64 dcr = PSCBX(vcpu,dcr); - PSR psr = {0}; + PSR psr; //printf("*** vcpu_get_ipsr_int_state (0x%016lx)...",prevpsr); psr.i64 = prevpsr; @@ -397,7 +405,7 @@ IA64FAULT vcpu_get_dcr(VCPU *vcpu, UINT64 *pval) { -extern unsigned long privop_trace; +//extern unsigned long privop_trace; //privop_trace=0; //verbose("vcpu_get_dcr: called @%p\n",PSCB(vcpu,iip)); // Reads of cr.dcr on Xen always have the sign bit set, so @@ -525,7 +533,7 @@ IA64FAULT vcpu_set_dcr(VCPU *vcpu, UINT64 val) { -extern unsigned long privop_trace; +//extern unsigned long privop_trace; //privop_trace=1; // Reads of cr.dcr on SP always have the sign bit set, so // a domain can differentiate whether it is running on SP or not @@ -643,7 +651,6 @@ set_bit(vector,VCPU(vcpu,irr)); } else { - /* if (!test_bit(vector,PSCB(vcpu,delivery_mask))) return; */ if (test_bit(vector,PSCBX(vcpu,irr))) { //printf("vcpu_pend_interrupt: overrun\n"); } @@ -683,7 +690,6 @@ vcpu_pend_interrupt(vcpu, vcpu->vcpu_info->arch.evtchn_vector); p = &PSCBX(vcpu,irr[3]); - /* q = &PSCB(vcpu,delivery_mask[3]); */ r = &PSCBX(vcpu,insvc[3]); for (i = 3; ; p--, q--, r--, i--) { bits = *p /* & *q */; @@ -747,7 +753,7 @@ IA64FAULT vcpu_get_lid(VCPU *vcpu, UINT64 *pval) { -extern unsigned long privop_trace; +//extern unsigned long privop_trace; //privop_trace=1; //TODO: Implement this printf("vcpu_get_lid: WARNING: Getting cr.lid always returns zero\n"); @@ -764,9 +770,10 @@ #define HEARTBEAT_FREQ 16 // period in seconds #ifdef HEARTBEAT_FREQ #define N_DOMS 16 // period in seconds +#if 0 static long count[N_DOMS] = { 0 }; +#endif static long nonclockcount[N_DOMS] = { 0 }; - REGS *regs = vcpu_regs(vcpu); unsigned domid = vcpu->domain->domain_id; #endif #ifdef IRQ_DEBUG @@ -803,7 +810,7 @@ // getting ivr has "side effects" #ifdef IRQ_DEBUG if (firsttime[vector]) { - printf("*** First get_ivr on vector=%d,itc=%lx\n", + printf("*** First get_ivr on vector=%lu,itc=%lx\n", vector,ia64_get_itc()); firsttime[vector]=0; } @@ -817,7 +824,7 @@ i = vector >> 6; mask = 1L << (vector & 0x3f); -//printf("ZZZZZZ vcpu_get_ivr: setting insvc mask for vector %ld\n",vector); +//printf("ZZZZZZ vcpu_get_ivr: setting insvc mask for vector %lu\n",vector); PSCBX(vcpu,insvc[i]) |= mask; PSCBX(vcpu,irr[i]) &= ~mask; //PSCB(vcpu,pending_interruption)--; @@ -978,27 +985,18 @@ return (IA64_NO_FAULT); } -// parameter is a time interval specified in cycles -void vcpu_enable_timer(VCPU *vcpu,UINT64 cycles) -{ - PSCBX(vcpu,xen_timer_interval) = cycles; - vcpu_set_next_timer(vcpu); - printf("vcpu_enable_timer(%d): interval set to %d cycles\n", - PSCBX(vcpu,xen_timer_interval)); - __set_bit(PSCB(vcpu,itv), PSCB(vcpu,delivery_mask)); -} - IA64FAULT vcpu_set_itv(VCPU *vcpu, UINT64 val) { -extern unsigned long privop_trace; +//extern unsigned long privop_trace; //privop_trace=1; if (val & 0xef00) return (IA64_ILLOP_FAULT); PSCB(vcpu,itv) = val; if (val & 0x10000) { -printf("**** vcpu_set_itv(%d): vitm=%lx, setting to 0\n",val,PSCBX(vcpu,domain_itm)); + printf("**** vcpu_set_itv(%lu): vitm=%lx, setting to 0\n", + val,PSCBX(vcpu,domain_itm)); PSCBX(vcpu,domain_itm) = 0; } - else vcpu_enable_timer(vcpu,1000000L); + else vcpu_set_next_timer(vcpu); return (IA64_NO_FAULT); } @@ -1080,7 +1078,6 @@ //UINT64 s = PSCBX(vcpu,xen_itm); UINT64 s = local_cpu_data->itm_next; UINT64 now = ia64_get_itc(); - //UINT64 interval = PSCBX(vcpu,xen_timer_interval); /* gloss over the wraparound problem for now... we know it exists * but it doesn't matter right now */ @@ -1103,7 +1100,7 @@ IA64FAULT vcpu_set_itm(VCPU *vcpu, UINT64 val) { - UINT now = ia64_get_itc(); + //UINT now = ia64_get_itc(); //if (val < now) val = now + 1000; //printf("*** vcpu_set_itm: called with %lx\n",val); @@ -1114,7 +1111,10 @@ IA64FAULT vcpu_set_itc(VCPU *vcpu, UINT64 val) { - +#define DISALLOW_SETTING_ITC_FOR_NOW +#ifdef DISALLOW_SETTING_ITC_FOR_NOW +printf("vcpu_set_itc: Setting ar.itc is currently disabled\n"); +#else UINT64 oldnow = ia64_get_itc(); UINT64 olditm = PSCBX(vcpu,domain_itm); unsigned long d = olditm - oldnow; @@ -1122,10 +1122,6 @@ UINT64 newnow = val, min_delta; -#define DISALLOW_SETTING_ITC_FOR_NOW -#ifdef DISALLOW_SETTING_ITC_FOR_NOW -printf("vcpu_set_itc: Setting ar.itc is currently disabled\n"); -#else local_irq_disable(); if (olditm) { printf("**** vcpu_set_itc(%lx): vitm changed to %lx\n",val,newnow+d); @@ -1293,9 +1289,6 @@ return (IA64_ILLOP_FAULT); } -#define itir_ps(itir) ((itir >> 2) & 0x3f) -#define itir_mask(itir) (~((1UL << itir_ps(itir)) - 1)) - unsigned long vhpt_translate_count = 0; unsigned long fast_vhpt_translate_count = 0; unsigned long recover_to_page_fault_count = 0; @@ -1317,7 +1310,7 @@ // this down, but since it has been apparently harmless, just flag it for now // panic_domain(vcpu_regs(vcpu), printk( - "vcpu_translate: bad physical address: %p\n",address); + "vcpu_translate: bad physical address: 0x%lx\n",address); } *pteval = (address & _PAGE_PPN_MASK) | __DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX; *itir = PAGE_SHIFT << 2; @@ -1330,7 +1323,8 @@ unsigned long vipsr = PSCB(vcpu,ipsr); unsigned long iip = regs->cr_iip; unsigned long ipsr = regs->cr_ipsr; - printk("vcpu_translate: bad address %p, viip=%p, vipsr=%p, iip=%p, ipsr=%p continuing\n", address, viip, vipsr, iip, ipsr); + printk("vcpu_translate: bad address 0x%lx, viip=0x%lx, vipsr=0x%lx, iip=0x%lx, ipsr=0x%lx continuing\n", + address, viip, vipsr, iip, ipsr); } rr = PSCB(vcpu,rrs)[region]; @@ -1798,7 +1792,7 @@ IA64FAULT vcpu_itc_d(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa) { - unsigned long pteval, logps = (itir >> 2) & 0x3f; + unsigned long pteval, logps = itir_ps(itir); unsigned long translate_domain_pte(UINT64,UINT64,UINT64); BOOLEAN swap_rr0 = (!(ifa>>61) && PSCB(vcpu,metaphysical_mode)); @@ -1818,7 +1812,7 @@ IA64FAULT vcpu_itc_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa) { - unsigned long pteval, logps = (itir >> 2) & 0x3f; + unsigned long pteval, logps = itir_ps(itir); unsigned long translate_domain_pte(UINT64,UINT64,UINT64); BOOLEAN swap_rr0 = (!(ifa>>61) && PSCB(vcpu,metaphysical_mode)); @@ -1891,7 +1885,7 @@ IA64FAULT vcpu_ptc_ga(VCPU *vcpu,UINT64 vadr,UINT64 addr_range) { - extern ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 nbits); + extern void ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 nbits); // FIXME: validate not flushing Xen addresses // if (Xen address) return(IA64_ILLOP_FAULT); // FIXME: ??breaks if domain PAGE_SIZE < Xen PAGE_SIZE diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/vhpt.c --- a/xen/arch/ia64/xen/vhpt.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/vhpt.c Thu Mar 2 10:00:49 2006 @@ -15,12 +15,13 @@ #include <asm/dma.h> #include <asm/vhpt.h> -unsigned long vhpt_paddr, vhpt_pend, vhpt_pte; +DEFINE_PER_CPU (unsigned long, vhpt_paddr); +DEFINE_PER_CPU (unsigned long, vhpt_pend); void vhpt_flush(void) { struct vhpt_lf_entry *v = (void *)VHPT_ADDR; - int i, cnt = 0; + int i; #if 0 static int firsttime = 2; @@ -47,7 +48,6 @@ #ifdef VHPT_GLOBAL void vhpt_flush_address(unsigned long vadr, unsigned long addr_range) { - unsigned long ps; struct vhpt_lf_entry *vlfe; if ((vadr >> 61) == 7) { @@ -77,12 +77,12 @@ } #endif -void vhpt_map(void) +static void vhpt_map(unsigned long pte) { unsigned long psr; psr = ia64_clear_ic(); - ia64_itr(0x2, IA64_TR_VHPT, VHPT_ADDR, vhpt_pte, VHPT_SIZE_LOG2); + ia64_itr(0x2, IA64_TR_VHPT, VHPT_ADDR, pte, VHPT_SIZE_LOG2); ia64_set_psr(psr); ia64_srlz_i(); } @@ -121,29 +121,35 @@ void vhpt_init(void) { - unsigned long vhpt_total_size, vhpt_alignment, vhpt_imva; + unsigned long vhpt_total_size, vhpt_alignment; + unsigned long paddr, pte; + struct page_info *page; #if !VHPT_ENABLED return; #endif // allocate a huge chunk of physical memory.... how??? vhpt_total_size = 1 << VHPT_SIZE_LOG2; // 4MB, 16MB, 64MB, or 256MB vhpt_alignment = 1 << VHPT_SIZE_LOG2; // 4MB, 16MB, 64MB, or 256MB - printf("vhpt_init: vhpt size=%p, align=%p\n",vhpt_total_size,vhpt_alignment); + printf("vhpt_init: vhpt size=0x%lx, align=0x%lx\n", + vhpt_total_size, vhpt_alignment); /* This allocation only holds true if vhpt table is unique for * all domains. Or else later new vhpt table should be allocated * from domain heap when each domain is created. Assume xen buddy * allocator can provide natural aligned page by order? */ - vhpt_imva = alloc_xenheap_pages(VHPT_SIZE_LOG2 - PAGE_SHIFT); - if (!vhpt_imva) { +// vhpt_imva = alloc_xenheap_pages(VHPT_SIZE_LOG2 - PAGE_SHIFT); + page = alloc_domheap_pages(NULL, VHPT_SIZE_LOG2 - PAGE_SHIFT, 0); + if (!page) { printf("vhpt_init: can't allocate VHPT!\n"); while(1); } - vhpt_paddr = __pa(vhpt_imva); - vhpt_pend = vhpt_paddr + vhpt_total_size - 1; - printf("vhpt_init: vhpt paddr=%p, end=%p\n",vhpt_paddr,vhpt_pend); - vhpt_pte = pte_val(pfn_pte(vhpt_paddr >> PAGE_SHIFT, PAGE_KERNEL)); - vhpt_map(); + paddr = page_to_maddr(page); + __get_cpu_var(vhpt_paddr) = paddr; + __get_cpu_var(vhpt_pend) = paddr + vhpt_total_size - 1; + printf("vhpt_init: vhpt paddr=0x%lx, end=0x%lx\n", + paddr, __get_cpu_var(vhpt_pend)); + pte = pte_val(pfn_pte(paddr >> PAGE_SHIFT, PAGE_KERNEL)); + vhpt_map(pte); ia64_set_pta(VHPT_ADDR | (1 << 8) | (VHPT_SIZE_LOG2 << 2) | VHPT_ENABLED); vhpt_flush(); @@ -167,6 +173,6 @@ if (v->CChain) vhpt_chains++; } s += sprintf(s,"VHPT usage: %ld/%ld (%ld collision chains)\n", - vhpt_valid,VHPT_NUM_ENTRIES,vhpt_chains); + vhpt_valid, (unsigned long) VHPT_NUM_ENTRIES, vhpt_chains); return s - buf; } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/xenirq.c --- a/xen/arch/ia64/xen/xenirq.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/xenirq.c Thu Mar 2 10:00:49 2006 @@ -24,7 +24,7 @@ firstirq = 0; } if (firsttime[vector]) { - printf("**** (entry) First received int on vector=%d,itc=%lx\n", + printf("**** (entry) First received int on vector=%lu,itc=%lx\n", (unsigned long) vector, ia64_get_itc()); firsttime[vector] = 0; } @@ -38,13 +38,13 @@ extern void vcpu_pend_interrupt(void *, int); #if 0 if (firsttime[vector]) { - printf("**** (iterate) First received int on vector=%d,itc=%lx\n", - (unsigned long) vector, ia64_get_itc()); + printf("**** (iterate) First received int on vector=%lu,itc=%lx\n", + (unsigned long) vector, ia64_get_itc()); firsttime[vector] = 0; } if (firstpend[vector]) { - printf("**** First pended int on vector=%d,itc=%lx\n", - (unsigned long) vector,ia64_get_itc()); + printf("**** First pended int on vector=%lu,itc=%lx\n", + (unsigned long) vector, ia64_get_itc()); firstpend[vector] = 0; } #endif @@ -59,7 +59,7 @@ /* * Exit an interrupt context. Process softirqs if needed and possible: */ -void xen_irq_exit(struct pt_regs *regs) +void irq_exit(void) { sub_preempt_count(IRQ_EXIT_OFFSET); } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/xenmem.c --- a/xen/arch/ia64/xen/xenmem.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/xenmem.c Thu Mar 2 10:00:49 2006 @@ -34,7 +34,6 @@ void paging_init (void) { - struct page_info *pg; unsigned int mpt_order; /* Create machine to physical mapping table * NOTE: similar to frame table, later we may need virtually @@ -61,7 +60,7 @@ #define FT_ALIGN_SIZE (16UL << 20) void __init init_frametable(void) { - unsigned long i, pfn; + unsigned long pfn; frame_table_size = max_page * sizeof(struct page_info); frame_table_size = (frame_table_size + PAGE_SIZE - 1) & PAGE_MASK; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/xenmisc.c --- a/xen/arch/ia64/xen/xenmisc.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/xenmisc.c Thu Mar 2 10:00:49 2006 @@ -19,12 +19,18 @@ #include <public/sched.h> #include <asm/vhpt.h> #include <asm/debugger.h> +#include <asm/vmx.h> +#include <asm/vmx_vcpu.h> efi_memory_desc_t ia64_efi_io_md; EXPORT_SYMBOL(ia64_efi_io_md); unsigned long wait_init_idle; int phys_proc_id[NR_CPUS]; unsigned long loops_per_jiffy = (1<<12); // from linux/init/main.c + +/* FIXME: where these declarations should be there ? */ +extern void load_region_regs(struct vcpu *); +extern void show_registers(struct pt_regs *regs); void ia64_mca_init(void) { printf("ia64_mca_init() skipped (Machine check abort handling)\n"); } void ia64_mca_cpu_init(void *x) { } @@ -168,7 +174,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) @@ -247,6 +257,7 @@ unsigned long user_rbs_end, unsigned long addr, long *val) { printk("ia64_peek: called, not implemented\n"); + return 1; } long @@ -254,6 +265,7 @@ unsigned long user_rbs_end, unsigned long addr, long val) { printk("ia64_poke: called, not implemented\n"); + return 1; } void @@ -291,6 +303,7 @@ void context_switch(struct vcpu *prev, struct vcpu *next) { uint64_t spsr; + uint64_t pta; local_irq_save(spsr); if(VMX_DOMAIN(prev)){ @@ -298,9 +311,9 @@ } context_switch_count++; switch_to(prev,next,prev); - if(VMX_DOMAIN(current)){ - vtm_domain_in(current); - } +// if(VMX_DOMAIN(current)){ +// vtm_domain_in(current); +// } // leave this debug for now: it acts as a heartbeat when more than // one domain is active @@ -309,22 +322,30 @@ static int i = 100; int id = ((struct vcpu *)current)->domain->domain_id & 0xf; if (!cnt[id]--) { printk("%x",id); cnt[id] = 500000; } -if (!i--) { printk("+",id); i = 1000000; } +if (!i--) { printk("+"); i = 1000000; } } if (VMX_DOMAIN(current)){ + vtm_domain_in(current); vmx_load_all_rr(current); }else{ - extern char ia64_ivt; - ia64_set_iva(&ia64_ivt); - ia64_set_pta(VHPT_ADDR | (1 << 8) | (VHPT_SIZE_LOG2 << 2) | - VHPT_ENABLED); + extern char ia64_ivt; + ia64_set_iva(&ia64_ivt); if (!is_idle_domain(current->domain)) { + ia64_set_pta(VHPT_ADDR | (1 << 8) | (VHPT_SIZE_LOG2 << 2) | + VHPT_ENABLED); load_region_regs(current); vcpu_load_kernel_regs(current); - if (vcpu_timer_expired(current)) vcpu_pend_timer(current); - } - if (vcpu_timer_expired(current)) vcpu_pend_timer(current); + if (vcpu_timer_expired(current)) + vcpu_pend_timer(current); + }else { + /* When switching to idle domain, only need to disable vhpt + * walker. Then all accesses happen within idle context will + * be handled by TR mapping and identity mapping. + */ + pta = ia64_get_pta(); + ia64_set_pta(pta & ~VHPT_ENABLED); + } } local_irq_restore(spsr); @@ -345,12 +366,12 @@ va_list args; char buf[128]; struct vcpu *v = current; - static volatile int test = 1; // so can continue easily in debug - extern spinlock_t console_lock; - unsigned long flags; +// static volatile int test = 1; // so can continue easily in debug +// extern spinlock_t console_lock; +// unsigned long flags; loop: - printf("$$$$$ PANIC in domain %d (k6=%p): ", + printf("$$$$$ PANIC in domain %d (k6=0x%lx): ", v->domain->domain_id, __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT]); va_start(args, fmt); @@ -365,7 +386,7 @@ } domain_pause_by_systemcontroller(current->domain); v->domain->shutdown_code = SHUTDOWN_crash; - set_bit(_DOMF_shutdown, v->domain->domain_flags); + set_bit(_DOMF_shutdown, &v->domain->domain_flags); if (v->domain->domain_id == 0) { int i = 1000000000L; // if domain0 crashes, just periodically print out panic diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/xensetup.c --- a/xen/arch/ia64/xen/xensetup.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/xensetup.c Thu Mar 2 10:00:49 2006 @@ -14,7 +14,7 @@ #include <public/version.h> //#include <xen/delay.h> #include <xen/compile.h> -//#include <xen/console.h> +#include <xen/console.h> #include <xen/serial.h> #include <xen/trace.h> #include <asm/meminit.h> @@ -22,6 +22,7 @@ #include <asm/setup.h> #include <xen/string.h> #include <asm/vmx.h> +#include <linux/efi.h> unsigned long xenheap_phys_end; @@ -31,13 +32,20 @@ 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 *); void start_of_day(void); + +/* FIXME: which header these declarations should be there ? */ +extern long is_platform_hp_ski(void); +extern void early_setup_arch(char **); +extern void late_setup_arch(char **); +extern void hpsim_serial_init(void); +extern void alloc_dom0(void); +extern void setup_per_cpu_areas(void); +extern void mem_init(void); +extern void init_IRQ(void); /* opt_nosmp: If true, secondary processors are ignored. */ static int opt_nosmp = 0; @@ -147,13 +155,30 @@ .parity = 'n', .stop_bits = 1 }; +/* This is a wrapper function of init_domheap_pages, + * memory exceeds (max_page<<PAGE_SHIFT) will not be reclaimed. + * This function will go away when the virtual memmap/discontig + * memory issues are solved + */ +void init_domheap_pages_wrapper(unsigned long ps, unsigned long pe) +{ + unsigned long s_nrm, e_nrm, max_mem; + max_mem = (max_page+1)<<PAGE_SHIFT; + s_nrm = (ps+PAGE_SIZE-1)&PAGE_MASK; + e_nrm = pe&PAGE_MASK; + s_nrm = min(s_nrm, max_mem); + e_nrm = min(e_nrm, max_mem); + if(s_nrm < e_nrm) + init_domheap_pages(s_nrm, e_nrm); +} + + void start_kernel(void) { unsigned char *cmdline; void *heap_start; - int i; - unsigned long max_mem, nr_pages, firsthole_start; + unsigned long nr_pages, firsthole_start; unsigned long dom0_memory_start, dom0_memory_size; unsigned long dom0_initrd_start, dom0_initrd_size; unsigned long initial_images_start, initial_images_end; @@ -163,7 +188,7 @@ /* Kernel may be relocated by EFI loader */ xen_pstart = ia64_tpa(KERNEL_START); - early_setup_arch(&cmdline); + early_setup_arch((char **) &cmdline); /* We initialise the serial devices very early so we can get debugging. */ if (running_on_sim) hpsim_serial_init(); @@ -251,9 +276,9 @@ max_page); heap_start = memguard_init(ia64_imva(&_end)); - printf("Before heap_start: 0x%lx\n", heap_start); + printf("Before heap_start: %p\n", heap_start); heap_start = __va(init_boot_allocator(__pa(heap_start))); - printf("After heap_start: 0x%lx\n", heap_start); + printf("After heap_start: %p\n", heap_start); reserve_memory(); @@ -284,7 +309,7 @@ idle_domain = domain_create(IDLE_DOMAIN_ID, 0); BUG_ON(idle_domain == NULL); - late_setup_arch(&cmdline); + late_setup_arch((char **) &cmdline); setup_per_cpu_areas(); mem_init(); @@ -301,6 +326,8 @@ #endif #ifdef CONFIG_SMP + int i; + if ( opt_nosmp ) { max_cpus = 0; @@ -342,16 +369,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"); @@ -362,9 +379,9 @@ * above our heap. The second module, if present, is an initrd ramdisk. */ printk("About to call construct_dom0()\n"); - dom0_memory_start = __va(initial_images_start); + dom0_memory_start = (unsigned long) __va(initial_images_start); dom0_memory_size = ia64_boot_param->domain_size; - dom0_initrd_start = __va(initial_images_start + + dom0_initrd_start = (unsigned long) __va(initial_images_start + PAGE_ALIGN(ia64_boot_param->domain_size)); dom0_initrd_size = ia64_boot_param->initrd_size; @@ -376,29 +393,15 @@ /* 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); + /* init_domheap_pages_wrapper is temporary solution, please refer to the + * descriptor of this function */ + init_domheap_pages_wrapper(ia64_boot_param->domain_start, + ia64_boot_param->domain_start+ia64_boot_param->domain_size); /* throw away initrd area passed from elilo */ if (ia64_boot_param->initrd_size) { - init_domheap_pages(ia64_boot_param->initrd_start, - ia64_boot_param->initrd_size); + init_domheap_pages_wrapper(ia64_boot_param->initrd_start, + ia64_boot_param->initrd_start+ia64_boot_param->initrd_size); } if (!running_on_sim) // slow on ski and pages are pre-initialized to zero @@ -412,13 +415,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 7edd64c8bb36 -r eeac4fdf02ed xen/arch/ia64/xen/xentime.c --- a/xen/arch/ia64/xen/xentime.c Thu Mar 2 09:59:34 2006 +++ b/xen/arch/ia64/xen/xentime.c Thu Mar 2 10:00:49 2006 @@ -30,6 +30,9 @@ #include <linux/jiffies.h> // not included by xen/sched.h #include <xen/softirq.h> +/* FIXME: where these declarations should be there ? */ +extern void ia64_init_itm(void); + seqlock_t xtime_lock __cacheline_aligned_in_smp = SEQLOCK_UNLOCKED; #define TIME_KEEPER_ID 0 @@ -70,7 +73,7 @@ s_time_t get_s_time(void) { s_time_t now; - unsigned long flags, seq; + unsigned long seq; do { seq = read_seqbegin(&xtime_lock); @@ -202,7 +205,7 @@ } static struct irqaction xen_timer_irqaction = { - .handler = xen_timer_interrupt, + .handler = (void *) xen_timer_interrupt, .name = "timer" }; @@ -217,8 +220,6 @@ /* Late init function (after all CPUs are booted). */ int __init init_xen_time() { - struct timespec tm; - ia64_time_init(); itc_scale = 1000000000UL << 32 ; itc_scale /= local_cpu_data->itc_freq; @@ -253,7 +254,7 @@ } while (unlikely(read_seqretry(&xtime_lock, seq))); local_cpu_data->itm_next = itm_next; - vcpu_set_next_timer(current); + vcpu_set_next_timer(v); return 1; } diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/config.h --- a/xen/include/asm-ia64/config.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/config.h Thu Mar 2 10:00:49 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 @@ -24,7 +21,7 @@ #define CONFIG_EFI_PCDP #define CONFIG_SERIAL_SGI_L1_CONSOLE -#undef CONFIG_XEN_SMP +#define CONFIG_XEN_SMP #ifdef CONFIG_XEN_SMP #define CONFIG_SMP 1 @@ -72,7 +69,7 @@ extern unsigned long xenheap_phys_end; extern unsigned long xen_pstart; extern unsigned long xenheap_size; -extern struct domain *dom0; +//extern struct domain *dom0; extern unsigned long dom0_start; extern unsigned long dom0_size; @@ -211,9 +208,9 @@ // 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) +// Deprivated linux inf and put here for short time compatibility +#define kmalloc(s, t) xmalloc_bytes((s)) +#define kfree(s) xfree((s)) // see common/keyhandler.c #define nop() asm volatile ("nop 0") @@ -254,10 +251,8 @@ #define seq_printf(a,b...) printf(b) #define CONFIG_BLK_DEV_INITRD // needed to reserve memory for domain0 -#define FORCE_CRASH() asm("break 0;;"); - void dummy_called(char *function); -#define dummy() dummy_called(__FUNCTION__) +#define dummy() dummy_called((char *) __FUNCTION__) // these declarations got moved at some point, find a better place for them extern int ht_per_core; @@ -295,14 +290,17 @@ #endif /* __XEN_IA64_CONFIG_H__ */ // needed for include/xen/smp.h -#ifdef CONFIG_SMP -#define raw_smp_processor_id() current->processor -#else -#define raw_smp_processor_id() 0 -#endif +//#ifdef CONFIG_SMP +//#define raw_smp_processor_id() current->processor +//#else +//#define raw_smp_processor_id() 0 +//#endif #ifndef __ASSEMBLY__ #include <linux/linkage.h> +#define FORCE_CRASH() asm("break.m 0;;"); +#else +#define FORCE_CRASH break.m 0;; #endif #endif /* _IA64_CONFIG_H_ */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/debugger.h --- a/xen/include/asm-ia64/debugger.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/debugger.h Thu Mar 2 10:00:49 2006 @@ -39,6 +39,8 @@ #ifndef __ASSEMBLY__ #include <xen/gdbstub.h> + +void show_registers(struct cpu_user_regs *regs); // NOTE: on xen struct pt_regs = struct cpu_user_regs // see include/asm-ia64/linux-xen/asm/ptrace.h diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/domain.h --- a/xen/include/asm-ia64/domain.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/domain.h Thu Mar 2 10:00:49 2006 @@ -9,14 +9,15 @@ #include <public/arch-ia64.h> #include <asm/vmx_platform.h> #include <xen/list.h> +#include <xen/cpumask.h> extern void domain_relinquish_resources(struct domain *); struct arch_domain { struct mm_struct *active_mm; struct mm_struct *mm; - int metaphysical_rr0; - int metaphysical_rr4; + unsigned long metaphysical_rr0; + unsigned long metaphysical_rr4; int starting_rid; /* first RID assigned to domain */ int ending_rid; /* one beyond highest RID assigned to domain */ int rid_bits; /* number of virtual rid bits (default: 18) */ @@ -32,11 +33,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; @@ -63,13 +59,12 @@ unsigned long domain_itm; unsigned long domain_itm_last; unsigned long xen_itm; - unsigned long xen_timer_interval; #endif mapped_regs_t *privregs; /* save the state of vcpu */ - int metaphysical_rr0; // from arch_domain (so is pinned) - int metaphysical_rr4; // from arch_domain (so is pinned) - int metaphysical_saved_rr0; // from arch_domain (so is pinned) - int metaphysical_saved_rr4; // from arch_domain (so is pinned) + unsigned long metaphysical_rr0; // from arch_domain (so is pinned) + unsigned long metaphysical_rr4; // from arch_domain (so is pinned) + unsigned long metaphysical_saved_rr0; // from arch_domain (so is pinned) + unsigned long metaphysical_saved_rr4; // from arch_domain (so is pinned) int breakimm; // from arch_domain (so is pinned) int starting_rid; /* first RID assigned to domain */ int ending_rid; /* one beyond highest RID assigned to domain */ @@ -112,6 +107,7 @@ * by mmlist_lock */ +#ifndef XEN unsigned long start_code, end_code, start_data, end_data; unsigned long start_brk, brk, start_stack; unsigned long arg_start, arg_end, env_start, env_end; @@ -121,6 +117,7 @@ unsigned long saved_auxv[40]; /* for /proc/PID/auxv */ unsigned dumpable:1; +#endif #ifdef CONFIG_HUGETLB_PAGE int used_hugetlb; #endif diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/grant_table.h --- a/xen/include/asm-ia64/grant_table.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/grant_table.h Thu Mar 2 10:00:49 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 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/hypercall.h --- a/xen/include/asm-ia64/hypercall.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/hypercall.h Thu Mar 2 10:00:49 2006 @@ -16,15 +16,4 @@ u64 *pdone, u64 foreigndom); -extern int -do_lock_page( - VCPU *vcpu, - u64 va, - u64 lock); - -extern int -do_set_shared_page( - VCPU *vcpu, - u64 gpa); - #endif /* __ASM_IA64_HYPERCALL_H__ */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux-xen/asm/README.origin --- a/xen/include/asm-ia64/linux-xen/asm/README.origin Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/linux-xen/asm/README.origin Thu Mar 2 10:00:49 2006 @@ -5,6 +5,7 @@ # (e.g. with #ifdef XEN or XEN in a comment) so that they can be # easily updated to future versions of the corresponding Linux files. +cache.h -> linux/include/asm-ia64/cache.h gcc_intrin.h -> linux/include/asm-ia64/gcc_intrin.h ia64regs.h -> linux/include/asm-ia64/ia64regs.h io.h -> linux/include/asm-ia64/io.h @@ -16,6 +17,7 @@ pgtable.h -> linux/include/asm-ia64/pgtable.h processor.h -> linux/include/asm-ia64/processor.h ptrace.h -> linux/include/asm-ia64/ptrace.h +smp.h -> linux/include/asm-ia64/smp.h spinlock.h -> linux/include/asm-ia64/spinlock.h system.h -> linux/include/asm-ia64/system.h tlbflush.h -> linux/include/asm-ia64/tlbflush.h diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux-xen/asm/processor.h --- a/xen/include/asm-ia64/linux-xen/asm/processor.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/linux-xen/asm/processor.h Thu Mar 2 10:00:49 2006 @@ -639,6 +639,19 @@ return r; } +#ifdef XEN +/* Get the page table address and control bits. */ +static inline __u64 +ia64_get_pta (void) +{ + __u64 r; + ia64_srlz_d(); + r = ia64_getreg(_IA64_REG_CR_PTA); + ia64_srlz_d(); + return r; +} +#endif + static inline void ia64_set_dbr (__u64 regnum, __u64 value) { diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux-xen/asm/tlbflush.h --- a/xen/include/asm-ia64/linux-xen/asm/tlbflush.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/linux-xen/asm/tlbflush.h Thu Mar 2 10:00:49 2006 @@ -103,6 +103,10 @@ */ } + #define flush_tlb_kernel_range(start, end) flush_tlb_all() /* XXX fix me */ +#ifdef XEN +extern void flush_tlb_mask(cpumask_t mask); +#endif #endif /* _ASM_IA64_TLBFLUSH_H */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux-xen/linux/README.origin --- a/xen/include/asm-ia64/linux-xen/linux/README.origin Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/linux-xen/linux/README.origin Thu Mar 2 10:00:49 2006 @@ -5,7 +5,6 @@ # (e.g. with #ifdef XEN or XEN in a comment) so that they can be # easily updated to future versions of the corresponding Linux files. -cpumask.h -> linux/include/linux/cpumask.h gfp.h -> linux/include/linux/gfp.h hardirq.h -> linux/include/linux/hardirq.h interrupt.h -> linux/include/linux/interrupt.h diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux/README.origin --- a/xen/include/asm-ia64/linux/README.origin Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/linux/README.origin Thu Mar 2 10:00:49 2006 @@ -4,31 +4,29 @@ # needs to be changed, move it to ../linux-xen and follow # the instructions in the README there. -bcd.h ->linux/include/linux/bcd.h -bitmap.h ->linux/include/linux/bitmap.h -bitops.h ->linux/include/linux/bitops.h -dma-mapping.h ->linux/include/linux/dma-mapping.h -efi.h ->linux/include/linux/efi.h -err.h ->linux/include/linux/err.h -initrd.h ->linux/include/linux/initrd.h -jiffies.h ->linux/include/linux/jiffies.h -kmalloc_sizes.h ->linux/include/linux/kmalloc_sizes.h -linkage.h ->linux/include/linux/linkage.h -mmzone.h ->linux/include/linux/mmzone.h -notifier.h ->linux/include/linux/notifier.h -numa.h ->linux/include/linux/numa.h -page-flags.h ->linux/include/linux/page-flags.h -percpu.h ->linux/include/linux/percpu.h -preempt.h ->linux/include/linux/preempt.h -rbtree.h ->linux/include/linux/rbtree.h -rwsem.h ->linux/include/linux/rwsem.h -seqlock.h ->linux/include/linux/seqlock.h -slab.h ->linux/include/linux/slab.h -sort.h ->linux/include/linux/sort.h -stddef.h ->linux/include/linux/stddef.h -thread_info.h ->linux/include/linux/thread_info.h -threads.h ->linux/include/linux/threads.h -time.h ->linux/include/linux/time.h -timex.h ->linux/include/linux/timex.h -topology.h ->linux/include/linux/topology.h -wait.h ->linux/include/linux/wait.h +bcd.h -> linux/include/linux/bcd.h +bitmap.h -> linux/include/linux/bitmap.h +bitops.h -> linux/include/linux/bitops.h +dma-mapping.h -> linux/include/linux/dma-mapping.h +efi.h -> linux/include/linux/efi.h +err.h -> linux/include/linux/err.h +initrd.h -> linux/include/linux/initrd.h +jiffies.h -> linux/include/linux/jiffies.h +kmalloc_sizes.h -> linux/include/linux/kmalloc_sizes.h +linkage.h -> linux/include/linux/linkage.h +mmzone.h -> linux/include/linux/mmzone.h +notifier.h -> linux/include/linux/notifier.h +numa.h -> linux/include/linux/numa.h +page-flags.h -> linux/include/linux/page-flags.h +percpu.h -> linux/include/linux/percpu.h +preempt.h -> linux/include/linux/preempt.h +rbtree.h -> linux/include/linux/rbtree.h +rwsem.h -> linux/include/linux/rwsem.h +seqlock.h -> linux/include/linux/seqlock.h +sort.h -> linux/include/linux/sort.h +stddef.h -> linux/include/linux/stddef.h +thread_info.h -> linux/include/linux/thread_info.h +time.h -> linux/include/linux/time.h +timex.h -> linux/include/linux/timex.h +topology.h -> linux/include/linux/topology.h +wait.h -> linux/include/linux/wait.h diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux/asm/README.origin --- a/xen/include/asm-ia64/linux/asm/README.origin Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/linux/asm/README.origin Thu Mar 2 10:00:49 2006 @@ -4,6 +4,7 @@ # needs to be changed, move it to ../linux-xen and follow # the instructions in the README there. +acpi.h -> linux/include/asm-ia64/acpi.h asmmacro.h -> linux/include/asm-ia64/asmmacro.h atomic.h -> linux/include/asm-ia64/atomic.h bitops.h -> linux/include/asm-ia64/bitops.h @@ -11,7 +12,6 @@ bug.h -> linux/include/asm-ia64/bug.h byteorder.h -> linux/include/asm-ia64/byteorder.h cacheflush.h -> linux/include/asm-ia64/cacheflush.h -cache.h -> linux/include/asm-ia64/cache.h checksum.h -> linux/include/asm-ia64/checksum.h current.h -> linux/include/asm-ia64/current.h delay.h -> linux/include/asm-ia64/delay.h @@ -46,9 +46,6 @@ sections.h -> linux/include/asm-ia64/sections.h semaphore.h -> linux/include/asm-ia64/semaphore.h setup.h -> linux/include/asm-ia64/setup.h -sigcontext.h -> linux/include/asm-ia64/sigcontext.h -signal.h -> linux/include/asm-ia64/signal.h -smp.h -> linux/include/asm-ia64/smp.h string.h -> linux/include/asm-ia64/string.h thread_info.h -> linux/include/asm-ia64/thread_info.h timex.h -> linux/include/asm-ia64/timex.h diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux/byteorder/README.origin --- a/xen/include/asm-ia64/linux/byteorder/README.origin Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/linux/byteorder/README.origin Thu Mar 2 10:00:49 2006 @@ -4,6 +4,6 @@ # needs to be changed, move it to ../linux-xen and follow # the instructions in the README there. -generic.h -> linux/include/byteorder/generic.h -little_endian.h -> linux/include/byteorder/little_endian.h -swab.h -> linux/include/byteorder/swab.h +generic.h -> linux/include/linux/byteorder/generic.h +little_endian.h -> linux/include/linux/byteorder/little_endian.h +swab.h -> linux/include/linux/byteorder/swab.h diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/mm.h --- a/xen/include/asm-ia64/mm.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/mm.h Thu Mar 2 10:00:49 2006 @@ -133,6 +133,8 @@ extern void __init init_frametable(void); #endif void add_to_domain_alloc_list(unsigned long ps, unsigned long pe); + +extern unsigned long gmfn_to_mfn_foreign(struct domain *d, unsigned long gpfn); static inline void put_page(struct page_info *page) { @@ -215,8 +217,8 @@ #endif // prototype of misc memory stuff -unsigned long __get_free_pages(unsigned int mask, unsigned int order); -void __free_pages(struct page *page, unsigned int order); +//unsigned long __get_free_pages(unsigned int mask, unsigned int order); +//void __free_pages(struct page *page, unsigned int order); void *pgtable_quicklist_alloc(void); void pgtable_quicklist_free(void *pgtable_entry); @@ -407,6 +409,7 @@ extern int nr_swap_pages; extern unsigned long *mpt_table; +extern unsigned long gmfn_to_mfn_foreign(struct domain *d, unsigned long gpfn); extern unsigned long lookup_domain_mpa(struct domain *d, unsigned long mpaddr); #undef machine_to_phys_mapping #define machine_to_phys_mapping mpt_table @@ -435,12 +438,22 @@ /* Return I/O type if trye */ #define __gpfn_is_io(_d, gpfn) \ - (__gmfn_valid(_d, gpfn) ? \ - (lookup_domain_mpa((_d), ((gpfn)<<PAGE_SHIFT)) & GPFN_IO_MASK) : 0) +({ \ + u64 pte, ret=0; \ + pte=lookup_domain_mpa((_d), ((gpfn)<<PAGE_SHIFT)); \ + if(!(pte&GPFN_INV_MASK)) \ + ret = pte & GPFN_IO_MASK; \ + ret; \ +}) #define __gpfn_is_mem(_d, gpfn) \ - (__gmfn_valid(_d, gpfn) ? \ - ((lookup_domain_mpa((_d), ((gpfn)<<PAGE_SHIFT)) & GPFN_IO_MASK) == GPFN_MEM) : 0) +({ \ + u64 pte, ret=0; \ + pte=lookup_domain_mpa((_d), ((gpfn)<<PAGE_SHIFT)); \ + if((!(pte&GPFN_INV_MASK))&&((pte & GPFN_IO_MASK)==GPFN_MEM)) \ + ret = 1; \ + ret; \ +}) #define __gpa_to_mpa(_d, gpa) \ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/multicall.h --- a/xen/include/asm-ia64/multicall.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/multicall.h Thu Mar 2 10:00:49 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__ */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/privop.h --- a/xen/include/asm-ia64/privop.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/privop.h Thu Mar 2 10:00:49 2006 @@ -209,4 +209,6 @@ extern void privify_memory(void *start, UINT64 len); +extern int ia64_hyperprivop(unsigned long iim, REGS *regs); + #endif diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vcpu.h --- a/xen/include/asm-ia64/vcpu.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vcpu.h Thu Mar 2 10:00:49 2006 @@ -34,11 +34,13 @@ #endif /* general registers */ -extern UINT64 vcpu_get_gr(VCPU *vcpu, unsigned reg); -extern IA64FAULT vcpu_get_gr_nat(VCPU *vcpu, unsigned reg, UINT64 *val); -extern IA64FAULT vcpu_set_gr(VCPU *vcpu, unsigned reg, UINT64 value, int nat); +extern UINT64 vcpu_get_gr(VCPU *vcpu, unsigned long reg); +extern IA64FAULT vcpu_get_gr_nat(VCPU *vcpu, unsigned long reg, UINT64 *val); +extern IA64FAULT vcpu_set_gr(VCPU *vcpu, unsigned long reg, UINT64 value, int nat); /* application registers */ +extern void vcpu_load_kernel_regs(VCPU *vcpu); extern IA64FAULT vcpu_set_ar(VCPU *vcpu, UINT64 reg, UINT64 val); +extern IA64FAULT vcpu_get_ar(VCPU *vcpu, UINT64 reg, UINT64 *val); /* psr */ extern BOOLEAN vcpu_get_psr_ic(VCPU *vcpu); extern UINT64 vcpu_get_ipsr_int_state(VCPU *vcpu,UINT64 prevpsr); @@ -46,6 +48,9 @@ extern IA64FAULT vcpu_reset_psr_sm(VCPU *vcpu, UINT64 imm); extern IA64FAULT vcpu_set_psr_sm(VCPU *vcpu, UINT64 imm); extern IA64FAULT vcpu_set_psr_l(VCPU *vcpu, UINT64 val); +extern IA64FAULT vcpu_set_psr_i(VCPU *vcpu); +extern IA64FAULT vcpu_reset_psr_dt(VCPU *vcpu); +extern IA64FAULT vcpu_set_psr_dt(VCPU *vcpu); /* control registers */ extern IA64FAULT vcpu_set_dcr(VCPU *vcpu, UINT64 val); extern IA64FAULT vcpu_set_itm(VCPU *vcpu, UINT64 val); @@ -89,6 +94,8 @@ extern IA64FAULT vcpu_get_lrr0(VCPU *vcpu, UINT64 *pval); extern IA64FAULT vcpu_get_lrr1(VCPU *vcpu, UINT64 *pval); /* interrupt registers */ +extern void vcpu_pend_unspecified_interrupt(VCPU *vcpu); +extern UINT64 vcpu_check_pending_interrupts(VCPU *vcpu); extern IA64FAULT vcpu_get_itv(VCPU *vcpu,UINT64 *pval); extern IA64FAULT vcpu_get_pmv(VCPU *vcpu,UINT64 *pval); extern IA64FAULT vcpu_get_cmcv(VCPU *vcpu,UINT64 *pval); @@ -97,8 +104,8 @@ extern IA64FAULT vcpu_set_pmv(VCPU *vcpu, UINT64 val); extern IA64FAULT vcpu_set_cmcv(VCPU *vcpu, UINT64 val); /* interval timer registers */ -extern IA64FAULT vcpu_set_itm(VCPU *vcpu,UINT64 val); extern IA64FAULT vcpu_set_itc(VCPU *vcpu,UINT64 val); +extern UINT64 vcpu_timer_pending_early(VCPU *vcpu); /* debug breakpoint registers */ extern IA64FAULT vcpu_set_ibr(VCPU *vcpu,UINT64 reg,UINT64 val); extern IA64FAULT vcpu_set_dbr(VCPU *vcpu,UINT64 reg,UINT64 val); @@ -135,9 +142,14 @@ extern IA64FAULT vcpu_ptr_i(VCPU *vcpu,UINT64 vadr, UINT64 addr_range); extern IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 *pteval, UINT64 *itir, UINT64 *iha); extern IA64FAULT vcpu_tpa(VCPU *vcpu, UINT64 vadr, UINT64 *padr); +extern IA64FAULT vcpu_force_data_miss(VCPU *vcpu, UINT64 ifa); +extern IA64FAULT vcpu_fc(VCPU *vcpu, UINT64 vadr); /* misc */ extern IA64FAULT vcpu_rfi(VCPU *vcpu); extern IA64FAULT vcpu_thash(VCPU *vcpu, UINT64 vadr, UINT64 *pval); +extern IA64FAULT vcpu_cover(VCPU *vcpu); +extern IA64FAULT vcpu_ttag(VCPU *vcpu, UINT64 vadr, UINT64 *padr); +extern IA64FAULT vcpu_get_cpuid(VCPU *vcpu, UINT64 reg, UINT64 *pval); extern void vcpu_pend_interrupt(VCPU *vcpu, UINT64 vector); extern void vcpu_pend_timer(VCPU *vcpu); @@ -149,4 +161,16 @@ extern UINT64 vcpu_get_tmp(VCPU *, UINT64); extern void vcpu_set_tmp(VCPU *, UINT64, UINT64); +static inline UINT64 +itir_ps(UINT64 itir) +{ + return ((itir >> 2) & 0x3f); +} + +static inline UINT64 +itir_mask(UINT64 itir) +{ + return (~((1UL << itir_ps(itir)) - 1)); +} + #endif diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vhpt.h --- a/xen/include/asm-ia64/vhpt.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vhpt.h Thu Mar 2 10:00:49 2006 @@ -121,6 +121,11 @@ extern void vhpt_insert (unsigned long vadr, unsigned long ptr, unsigned logps); extern void vhpt_flush(void); + +/* Currently the VHPT is allocated per CPU. */ +DECLARE_PER_CPU (unsigned long, vhpt_paddr); +DECLARE_PER_CPU (unsigned long, vhpt_pend); + #endif /* !__ASSEMBLY */ #if !VHPT_ENABLED diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vmmu.h --- a/xen/include/asm-ia64/vmmu.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vmmu.h Thu Mar 2 10:00:49 2006 @@ -22,13 +22,23 @@ #ifndef XEN_TLBthash_H #define XEN_TLBthash_H + +#define MAX_CCN_DEPTH 15 // collision chain depth +#define VCPU_VTLB_SHIFT (20) // 1M for VTLB +#define VCPU_VTLB_SIZE (1UL<<VCPU_VTLB_SHIFT) +#define VCPU_VTLB_ORDER (VCPU_VTLB_SHIFT - PAGE_SHIFT) +#define VCPU_VHPT_SHIFT (24) // 16M for VTLB +#define VCPU_VHPT_SIZE (1UL<<VCPU_VHPT_SHIFT) +#define VCPU_VHPT_ORDER (VCPU_VHPT_SHIFT - PAGE_SHIFT) + +#ifndef __ASSEMBLY__ #include <xen/config.h> #include <xen/types.h> #include <public/xen.h> #include <asm/tlb.h> #include <asm/regionreg.h> - +#include <asm/vmx_mm_def.h> //#define THASH_TLB_TR 0 //#define THASH_TLB_TC 1 @@ -39,7 +49,15 @@ /* * Next bit definition must be same with THASH_TLB_XX - */ +#define PTA_BASE_SHIFT (15) + */ + + + + +#define HIGH_32BITS(x) bits(x,32,63) +#define LOW_32BITS(x) bits(x,0,31) + typedef union search_section { struct { u32 tr : 1; @@ -49,15 +67,6 @@ u32 v; } search_section_t; -#define MAX_CCN_DEPTH 4 // collision chain depth -#define VCPU_TLB_SHIFT (22) -#define VCPU_TLB_SIZE (1UL<<VCPU_TLB_SHIFT) -#define VCPU_TLB_ORDER VCPU_TLB_SHIFT - PAGE_SHIFT -#define PTA_BASE_SHIFT (15) - -#ifndef __ASSEMBLY__ -#define HIGH_32BITS(x) bits(x,32,63) -#define LOW_32BITS(x) bits(x,0,31) typedef enum { ISIDE_TLB=0, @@ -77,18 +86,21 @@ u64 ppn : 38; // 12-49 u64 rv2 : 2; // 50-51 u64 ed : 1; // 52 - u64 ig1 : 11; //53-63 + u64 ig1 : 3; // 53-55 + u64 len : 4; // 56-59 + u64 ig2 : 3; // 60-63 }; struct { u64 __rv1 : 53; // 0-52 + u64 contiguous : 1; //53 + u64 tc : 1; // 54 TR or TC + CACHE_LINE_TYPE cl : 1; // 55 I side or D side cache line // next extension to ig1, only for TLB instance - u64 tc : 1; // 53 TR or TC - u64 locked : 1; // 54 entry locked or not - CACHE_LINE_TYPE cl : 1; // I side or D side cache line - u64 nomap : 1; // entry cann't be inserted into machine TLB. - u64 __ig1 : 5; // 56-61 - u64 checked : 1; // for VTLB/VHPT sanity check - u64 invalid : 1; // invalid entry + u64 __ig1 : 4; // 56-59 + u64 locked : 1; // 60 entry locked or not + u64 nomap : 1; // 61 entry cann't be inserted into machine TLB. + u64 checked : 1; // 62 for VTLB/VHPT sanity check + u64 invalid : 1; // 63 invalid entry }; u64 page_flags; }; // same for VHPT and TLB @@ -128,10 +140,37 @@ }; } thash_data_t; +#define INVALIDATE_VHPT_HEADER(hdata) \ +{ ((hdata)->page_flags)=0; \ + ((hdata)->ti)=1; \ + ((hdata)->next)=0; } + +#define INVALIDATE_TLB_HEADER(hdata) \ +{ ((hdata)->page_flags)=0; \ + ((hdata)->ti)=1; \ + ((hdata)->next)=0; } + #define INVALID_VHPT(hdata) ((hdata)->ti) -#define INVALID_TLB(hdata) ((hdata)->invalid) -#define INVALID_ENTRY(hcb, hdata) \ - ((hcb)->ht==THASH_TLB ? INVALID_TLB(hdata) : INVALID_VHPT(hdata)) +#define INVALID_TLB(hdata) ((hdata)->ti) +#define INVALID_TR(hdata) ((hdata)->invalid) +#define INVALID_ENTRY(hcb, hdata) INVALID_VHPT(hdata) + +/* ((hcb)->ht==THASH_TLB ? INVALID_TLB(hdata) : INVALID_VHPT(hdata)) */ + + +/* + * Architecture ppn is in 4KB unit while XEN + * page may be different(1<<PAGE_SHIFT). + */ +static inline u64 arch_to_xen_ppn(u64 appn) +{ + return (appn >>(PAGE_SHIFT-ARCH_PAGE_SHIFT)); +} + +static inline u64 xen_to_arch_ppn(u64 xppn) +{ + return (xppn <<(PAGE_SHIFT- ARCH_PAGE_SHIFT)); +} typedef enum { THASH_TLB=0, @@ -166,11 +205,11 @@ struct thash_cb *vhpt; } tlb_special_t; -typedef struct vhpt_cb { +//typedef struct vhpt_cb { //u64 pta; // pta value. - GET_MFN_FN *get_mfn; - TTAG_FN *tag_func; -} vhpt_special; +// GET_MFN_FN *get_mfn; +// TTAG_FN *tag_func; +//} vhpt_special; typedef struct thash_internal { thash_data_t *hash_base; @@ -198,36 +237,38 @@ u64 hash_sz; // size of above data. void *cch_buf; // base address of collision chain. u64 cch_sz; // size of above data. - THASH_FN *hash_func; - GET_RR_FN *get_rr_fn; - RECYCLE_FN *recycle_notifier; +// THASH_FN *hash_func; +// GET_RR_FN *get_rr_fn; +// RECYCLE_FN *recycle_notifier; thash_cch_mem_t *cch_freelist; struct vcpu *vcpu; PTA pta; /* VTLB/VHPT common information */ - FIND_OVERLAP_FN *find_overlap; - FIND_NEXT_OVL_FN *next_overlap; - REM_THASH_FN *rem_hash; // remove hash entry. - INS_THASH_FN *ins_hash; // insert hash entry. - REM_NOTIFIER_FN *remove_notifier; +// FIND_OVERLAP_FN *find_overlap; +// FIND_NEXT_OVL_FN *next_overlap; +// REM_THASH_FN *rem_hash; // remove hash entry. +// INS_THASH_FN *ins_hash; // insert hash entry. +// REM_NOTIFIER_FN *remove_notifier; /* private information */ - thash_internal_t priv; +// thash_internal_t priv; union { tlb_special_t *ts; - vhpt_special *vs; +// vhpt_special *vs; }; // Internal positon information, buffer and storage etc. TBD } thash_cb_t; #define ITR(hcb,id) ((hcb)->ts->itr[id]) #define DTR(hcb,id) ((hcb)->ts->dtr[id]) -#define INVALIDATE_HASH(hcb,hash) { \ - if ((hcb)->ht==THASH_TLB) \ - INVALID_TLB(hash) = 1; \ - else \ - INVALID_VHPT(hash) = 1; \ - hash->next = NULL; } - +#define INVALIDATE_HASH_HEADER(hcb,hash) INVALIDATE_TLB_HEADER(hash) +/* \ +{ if ((hcb)->ht==THASH_TLB){ \ + INVALIDATE_TLB_HEADER(hash); \ + }else{ \ + INVALIDATE_VHPT_HEADER(hash); \ + } \ +} + */ #define PURGABLE_ENTRY(hcb,en) 1 // ((hcb)->ht == THASH_VHPT || ( (en)->tc && !(en->locked)) ) @@ -242,18 +283,20 @@ * NOTES: * 1: TLB entry may be TR, TC or Foreign Map. For TR entry, * itr[]/dtr[] need to be updated too. - * 2: Inserting to collision chain may trigger recycling if + * 2: Inserting to collision chain may trigger recycling if * the buffer for collision chain is empty. * 3: The new entry is inserted at the hash table. * (I.e. head of the collision chain) * 4: Return the entry in hash table or collision chain. * */ -extern void thash_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va); +extern void thash_vhpt_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va); +//extern void thash_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va); extern void thash_tr_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va, int idx); - -/* - * Force to delete a found entry no matter TR or foreign map for TLB. +extern thash_data_t *vtr_find_overlap(thash_cb_t *hcb, thash_data_t *data, char cl); +extern u64 get_mfn(struct domain *d, u64 gpfn); +/* + * Force to delete a found entry no matter TR or foreign map for TLB. * NOTES: * 1: TLB entry may be TR, TC or Foreign Map. For TR entry, * itr[]/dtr[] need to be updated too. @@ -307,7 +350,7 @@ u64 rid, u64 va, u64 sz, search_section_t p_sect, CACHE_LINE_TYPE cl); -extern void thash_purge_and_insert(thash_cb_t *hcb, thash_data_t *in); +extern void thash_purge_and_insert(thash_cb_t *hcb, thash_data_t *in, u64 va); /* * Purge all TCs or VHPT entries including those in Hash table. @@ -335,8 +378,11 @@ extern void machine_tlb_insert(struct vcpu *d, thash_data_t *tlb); extern ia64_rr vmmu_get_rr(struct vcpu *vcpu, u64 va); extern thash_cb_t *init_domain_tlb(struct vcpu *d); - -#define VTLB_DEBUG +extern thash_data_t * vsa_thash(PTA vpta, u64 va, u64 vrr, u64 *tag); +extern thash_data_t * vhpt_lookup(u64 va); +extern void machine_tlb_purge(u64 va, u64 ps); + +//#define VTLB_DEBUG #ifdef VTLB_DEBUG extern void check_vtlb_sanity(thash_cb_t *vtlb); extern void dump_vtlb(thash_cb_t *vtlb); diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vmx.h --- a/xen/include/asm-ia64/vmx.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vmx.h Thu Mar 2 10:00:49 2006 @@ -34,7 +34,24 @@ extern void vmx_setup_platform(struct domain *d, struct vcpu_guest_context *c); extern void vmx_wait_io(void); extern void vmx_io_assist(struct vcpu *v); - +extern void vmx_load_all_rr(struct vcpu *vcpu); +extern void panic_domain(struct pt_regs *regs, const char *fmt, ...); +extern int ia64_hypercall (struct pt_regs *regs); +extern void vmx_save_state(struct vcpu *v); +extern void vmx_load_state(struct vcpu *v); +extern void show_registers(struct pt_regs *regs); +extern int vmx_alloc_contig_pages(struct domain *d); +extern unsigned long __gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn); +extern void sync_split_caches(void); +extern void vmx_virq_line_assist(struct vcpu *v); +extern void set_privileged_operation_isr (struct vcpu *vcpu,int inst); +extern void privilege_op (struct vcpu *vcpu); +extern void set_ifa_itir_iha (struct vcpu *vcpu, u64 vadr, + int set_ifa, int set_itir, int set_iha); +extern void inject_guest_interruption(struct vcpu *vcpu, u64 vec); +extern void vmx_intr_assist(struct vcpu *v); +extern void set_illegal_op_isr (struct vcpu *vcpu); +extern void illegal_op (struct vcpu *vcpu); static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu) { return &((shared_iopage_t *)d->arch.vmx_platform.shared_page_va)->vcpu_iodata[cpu]; diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vmx_mm_def.h --- a/xen/include/asm-ia64/vmx_mm_def.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vmx_mm_def.h Thu Mar 2 10:00:49 2006 @@ -27,8 +27,6 @@ //#define VHPT_SIZE (1 << VHPT_SIZE_PS) #define ARCH_PAGE_SHIFT 12 #define ARCH_PAGE_SIZE PSIZE(ARCH_PAGE_SHIFT) -#define INVALID_MFN (-1) - #define MAX_PHYS_ADDR_BITS 50 #define PMASK(size) (~((size) - 1)) #define PSIZE(size) (1UL<<(size)) @@ -36,7 +34,7 @@ #define POFFSET(vaddr, ps) ((vaddr) & (PSIZE(ps) - 1)) #define PPN_2_PA(ppn) ((ppn)<<12) #define CLEARLSB(ppn, nbits) ((((uint64_t)ppn) >> (nbits)) << (nbits)) -#define PAGEALIGN(va, ps) (va & ~(PSIZE(ps)-1)) +#define PAGEALIGN(va, ps) CLEARLSB(va, ps) #define TLB_AR_R 0 #define TLB_AR_RX 1 @@ -86,9 +84,6 @@ #define STLB_TC 0 #define STLB_TR 1 - -#define VMM_RR_MASK 0xfffff -#define VMM_RR_SHIFT 20 #define IA64_RR_SHIFT 61 @@ -145,6 +140,7 @@ uint64_t result; __asm __volatile("shl %0=%1, %2;; shr.u %0=%0, %3;;" : "=r" (result): "r"(v), "r"(63-be), "r" (bs+63-be) ); + return result; } #define bits(val, bs, be) \ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vmx_pal.h --- a/xen/include/asm-ia64/vmx_pal.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vmx_pal.h Thu Mar 2 10:00:49 2006 @@ -114,7 +114,7 @@ PAL_CALL_STK(iprv, PAL_VP_SAVE, (u64)vpd, pal_proc_vector, 0); return iprv.status; } - +extern void pal_emul(struct vcpu *vcpu); #define PAL_PROC_VM_BIT (1UL << 40) #define PAL_PROC_VMSW_BIT (1UL << 54) #endif /* _ASM_IA64_VT_PAL_H */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vmx_phy_mode.h --- a/xen/include/asm-ia64/vmx_phy_mode.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vmx_phy_mode.h Thu Mar 2 10:00:49 2006 @@ -96,6 +96,8 @@ extern void recover_if_physical_mode(VCPU *vcpu); extern void vmx_init_all_rr(VCPU *vcpu); extern void vmx_load_all_rr(VCPU *vcpu); +extern void physical_itlb_miss(VCPU *vcpu, u64 vadr); +extern void physical_dtlb_miss(VCPU *vcpu, u64 vadr); /* * No sanity check here, since all psr changes have been * checked in switch_mm_mode(). diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vmx_platform.h --- a/xen/include/asm-ia64/vmx_platform.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vmx_platform.h Thu Mar 2 10:00:49 2006 @@ -54,7 +54,7 @@ #define VCPU(_v,_x) _v->arch.privregs->_x #define VLAPIC_ID(l) (uint16_t)(VCPU((l)->vcpu, lid) >> 16) #define VLAPIC_IRR(l) VCPU((l)->vcpu, irr[0]) - +struct vlapic* apic_round_robin(struct domain *d, uint8_t dest_mode, uint8_t vector, uint32_t bitmap); extern int vmx_vcpu_pend_interrupt(struct vcpu *vcpu, uint8_t vector); static inline int vlapic_set_irq(struct vlapic *t, uint8_t vec, uint8_t trig) { diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/vmx_vcpu.h --- a/xen/include/asm-ia64/vmx_vcpu.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/vmx_vcpu.h Thu Mar 2 10:00:49 2006 @@ -51,8 +51,7 @@ #define VMM_RR_SHIFT 20 #define VMM_RR_MASK ((1UL<<VMM_RR_SHIFT)-1) -//#define VRID_2_MRID(vcpu,rid) ((rid) & VMM_RR_MASK) | \ - ((vcpu->domain->domain_id) << VMM_RR_SHIFT) + extern u64 indirect_reg_igfld_MASK ( int type, int index, u64 value); extern u64 cr_igfld_mask (int index, u64 value); extern int check_indirect_reg_rsv_fields ( int type, int index, u64 value ); @@ -118,7 +117,16 @@ extern void memread_v(VCPU *vcpu, thash_data_t *vtlb, u64 *src, u64 *dest, size_t s); extern void memwrite_v(VCPU *vcpu, thash_data_t *vtlb, u64 *src, u64 *dest, size_t s); extern void memwrite_p(VCPU *vcpu, u64 *src, u64 *dest, size_t s); - +extern void vcpu_load_kernel_regs(VCPU *vcpu); +extern IA64FAULT vmx_vcpu_increment_iip(VCPU *vcpu); +extern void vmx_switch_rr7(unsigned long ,shared_info_t*,void *,void *,void *); + +extern void dtlb_fault (VCPU *vcpu, u64 vadr); +extern void nested_dtlb (VCPU *vcpu); +extern void alt_dtlb (VCPU *vcpu, u64 vadr); +extern void dvhpt_fault (VCPU *vcpu, u64 vadr); +extern void dnat_page_consumption (VCPU *vcpu, uint64_t vadr); +extern void page_not_present(VCPU *vcpu, u64 vadr); /************************************************************************** VCPU control register access routines @@ -461,10 +469,10 @@ vmx_vrrtomrr(VCPU *v, unsigned long val) { ia64_rr rr; - u64 rid; rr.rrval=val; rr.rid = rr.rid + v->arch.starting_rid; + rr.ps = PAGE_SHIFT; rr.ve = 1; return vmMangleRID(rr.rrval); /* Disable this rid allocation algorithm for now */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/xenkregs.h --- a/xen/include/asm-ia64/xenkregs.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/xenkregs.h Thu Mar 2 10:00:49 2006 @@ -8,7 +8,8 @@ #define IA64_TR_VHPT 4 /* dtr4: vhpt */ #define IA64_TR_ARCH_INFO 5 #define IA64_TR_PERVP_VHPT 6 - +#define IA64_DTR_GUEST_KERNEL 7 +#define IA64_ITR_GUEST_KERNEL 2 /* Processor status register bits: */ #define IA64_PSR_VM_BIT 46 #define IA64_PSR_VM (__IA64_UL(1) << IA64_PSR_VM_BIT) diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/xensystem.h --- a/xen/include/asm-ia64/xensystem.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/xensystem.h Thu Mar 2 10:00:49 2006 @@ -78,7 +78,6 @@ #define __cmpxchg_user(ptr, new, old, _size) \ ({ \ register long __gu_r8 asm ("r8"); \ - register long __gu_r9 asm ("r9"); \ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \ asm volatile ("mov %1=r0;;\n" \ "[1:]\tcmpxchg"_size".acq %0=[%2],%3,ar.ccv\n" \ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/public/arch-ia64.h --- a/xen/include/public/arch-ia64.h Thu Mar 2 09:59:34 2006 +++ b/xen/include/public/arch-ia64.h Thu Mar 2 10:00:49 2006 @@ -249,7 +249,7 @@ int interrupt_delivery_enabled; // virtual psr.i int pending_interruption; int incomplete_regframe; // see SDM vol2 6.8 - unsigned long delivery_mask[4]; + unsigned long reserved5_1[4]; int metaphysical_mode; // 1 = use metaphys mapping, 0 = use virtual int banknum; // 0 or 1, which virtual register bank is active unsigned long rrs[8]; // region registers diff -r 7edd64c8bb36 -r eeac4fdf02ed linux-2.6-xen-sparse/include/asm-ia64/meminit.h --- /dev/null Thu Mar 2 09:59:34 2006 +++ b/linux-2.6-xen-sparse/include/asm-ia64/meminit.h Thu Mar 2 10:00:49 2006 @@ -0,0 +1,67 @@ +#ifndef meminit_h +#define meminit_h + +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include <linux/config.h> + +/* + * Entries defined so far: + * - boot param structure itself + * - memory map + * - initrd (optional) + * - command line string + * - kernel code & data + * - Kernel memory map built from EFI memory map + * - xen start info + * + * More could be added if necessary + */ +#ifndef CONFIG_XEN +#define IA64_MAX_RSVD_REGIONS 6 +#else +#define IA64_MAX_RSVD_REGIONS 7 +#endif + +struct rsvd_region { + unsigned long start; /* virtual address of beginning of element */ + unsigned long end; /* virtual address of end of element + 1 */ +}; + +extern struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1]; +extern int num_rsvd_regions; + +extern void find_memory (void); +extern void reserve_memory (void); +extern void find_initrd (void); +extern int filter_rsvd_memory (unsigned long start, unsigned long end, void *arg); +extern void efi_memmap_init(unsigned long *, unsigned long *); + +/* + * For rounding an address to the next IA64_GRANULE_SIZE or order + */ +#define GRANULEROUNDDOWN(n) ((n) & ~(IA64_GRANULE_SIZE-1)) +#define GRANULEROUNDUP(n) (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1)) +#define ORDERROUNDDOWN(n) ((n) & ~((PAGE_SIZE<<MAX_ORDER)-1)) + +#ifdef CONFIG_NUMA + extern void call_pernode_memory (unsigned long start, unsigned long len, void *func); +#else +# define call_pernode_memory(start, len, func) (*func)(start, len, 0) +#endif + +#define IGNORE_PFN0 1 /* XXX fix me: ignore pfn 0 until TLB miss handler is updated... */ + +#ifdef CONFIG_VIRTUAL_MEM_MAP +# define LARGE_GAP 0x40000000 /* Use virtual mem map if hole is > than this */ + extern unsigned long vmalloc_end; + extern struct page *vmem_map; + extern int find_largest_hole (u64 start, u64 end, void *arg); + extern int create_mem_map_page_table (u64 start, u64 end, void *arg); +#endif + +#endif /* meminit_h */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux-xen/asm/smp.h --- /dev/null Thu Mar 2 09:59:34 2006 +++ b/xen/include/asm-ia64/linux-xen/asm/smp.h Thu Mar 2 10:00:49 2006 @@ -0,0 +1,143 @@ +/* + * SMP Support + * + * Copyright (C) 1999 VA Linux Systems + * Copyright (C) 1999 Walt Drummond <drummond@xxxxxxxxxxx> + * (c) Copyright 2001-2003, 2005 Hewlett-Packard Development Company, L.P. + * David Mosberger-Tang <davidm@xxxxxxxxxx> + * Bjorn Helgaas <bjorn.helgaas@xxxxxx> + */ +#ifndef _ASM_IA64_SMP_H +#define _ASM_IA64_SMP_H + +#include <linux/config.h> +#include <linux/init.h> +#include <linux/threads.h> +#include <linux/kernel.h> +#include <linux/cpumask.h> + +#include <asm/bitops.h> +#include <asm/io.h> +#include <asm/param.h> +#include <asm/processor.h> +#include <asm/ptrace.h> + +static inline unsigned int +ia64_get_lid (void) +{ + union { + struct { + unsigned long reserved : 16; + unsigned long eid : 8; + unsigned long id : 8; + unsigned long ignored : 32; + } f; + unsigned long bits; + } lid; + + lid.bits = ia64_getreg(_IA64_REG_CR_LID); + return lid.f.id << 8 | lid.f.eid; +} + +#ifdef CONFIG_SMP + +#define XTP_OFFSET 0x1e0008 + +#define SMP_IRQ_REDIRECTION (1 << 0) +#define SMP_IPI_REDIRECTION (1 << 1) + +#ifdef XEN +#define raw_smp_processor_id() (current->processor) +#else +#define raw_smp_processor_id() (current_thread_info()->cpu) +#endif + +extern struct smp_boot_data { + int cpu_count; + int cpu_phys_id[NR_CPUS]; +} smp_boot_data __initdata; + +extern char no_int_routing __devinitdata; + +extern cpumask_t cpu_online_map; +extern cpumask_t cpu_core_map[NR_CPUS]; +extern cpumask_t cpu_sibling_map[NR_CPUS]; +extern int smp_num_siblings; +extern int smp_num_cpucores; +extern void __iomem *ipi_base_addr; +extern unsigned char smp_int_redirect; + +extern volatile int ia64_cpu_to_sapicid[]; +#define cpu_physical_id(i) ia64_cpu_to_sapicid[i] + +extern unsigned long ap_wakeup_vector; + +/* + * Function to map hard smp processor id to logical id. Slow, so don't use this in + * performance-critical code. + */ +static inline int +cpu_logical_id (int cpuid) +{ + int i; + + for (i = 0; i < NR_CPUS; ++i) + if (cpu_physical_id(i) == cpuid) + break; + return i; +} + +/* + * XTP control functions: + * min_xtp : route all interrupts to this CPU + * normal_xtp: nominal XTP value + * max_xtp : never deliver interrupts to this CPU. + */ + +static inline void +min_xtp (void) +{ + if (smp_int_redirect & SMP_IRQ_REDIRECTION) + writeb(0x00, ipi_base_addr + XTP_OFFSET); /* XTP to min */ +} + +static inline void +normal_xtp (void) +{ + if (smp_int_redirect & SMP_IRQ_REDIRECTION) + writeb(0x08, ipi_base_addr + XTP_OFFSET); /* XTP normal */ +} + +static inline void +max_xtp (void) +{ + if (smp_int_redirect & SMP_IRQ_REDIRECTION) + writeb(0x0f, ipi_base_addr + XTP_OFFSET); /* Set XTP to max */ +} + +#define hard_smp_processor_id() ia64_get_lid() + +/* Upping and downing of CPUs */ +extern int __cpu_disable (void); +extern void __cpu_die (unsigned int cpu); +extern void cpu_die (void) __attribute__ ((noreturn)); +extern int __cpu_up (unsigned int cpu); +extern void __init smp_build_cpu_map(void); + +extern void __init init_smp_config (void); +extern void smp_do_timer (struct pt_regs *regs); + +extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info, + int retry, int wait); +extern void smp_send_reschedule (int cpu); +extern void lock_ipi_calllock(void); +extern void unlock_ipi_calllock(void); +extern void identify_siblings (struct cpuinfo_ia64 *); + +#else + +#define cpu_logical_id(i) 0 +#define cpu_physical_id(i) ia64_get_lid() + +#endif /* CONFIG_SMP */ +#endif /* _ASM_IA64_SMP_H */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux-xen/linux/cpumask.h --- a/xen/include/asm-ia64/linux-xen/linux/cpumask.h Thu Mar 2 09:59:34 2006 +++ /dev/null Thu Mar 2 10:00:49 2006 @@ -1,397 +0,0 @@ -#ifndef __LINUX_CPUMASK_H -#define __LINUX_CPUMASK_H - -/* - * Cpumasks provide a bitmap suitable for representing the - * set of CPU's in a system, one bit position per CPU number. - * - * See detailed comments in the file linux/bitmap.h describing the - * data type on which these cpumasks are based. - * - * For details of cpumask_scnprintf() and cpumask_parse(), - * see bitmap_scnprintf() and bitmap_parse() in lib/bitmap.c. - * For details of cpulist_scnprintf() and cpulist_parse(), see - * bitmap_scnlistprintf() and bitmap_parselist(), also in bitmap.c. - * - * The available cpumask operations are: - * - * void cpu_set(cpu, mask) turn on bit 'cpu' in mask - * void cpu_clear(cpu, mask) turn off bit 'cpu' in mask - * void cpus_setall(mask) set all bits - * void cpus_clear(mask) clear all bits - * int cpu_isset(cpu, mask) true iff bit 'cpu' set in mask - * int cpu_test_and_set(cpu, mask) test and set bit 'cpu' in mask - * - * void cpus_and(dst, src1, src2) dst = src1 & src2 [intersection] - * void cpus_or(dst, src1, src2) dst = src1 | src2 [union] - * void cpus_xor(dst, src1, src2) dst = src1 ^ src2 - * void cpus_andnot(dst, src1, src2) dst = src1 & ~src2 - * void cpus_complement(dst, src) dst = ~src - * - * int cpus_equal(mask1, mask2) Does mask1 == mask2? - * int cpus_intersects(mask1, mask2) Do mask1 and mask2 intersect? - * int cpus_subset(mask1, mask2) Is mask1 a subset of mask2? - * int cpus_empty(mask) Is mask empty (no bits sets)? - * int cpus_full(mask) Is mask full (all bits sets)? - * int cpus_weight(mask) Hamming weigh - number of set bits - * - * void cpus_shift_right(dst, src, n) Shift right - * void cpus_shift_left(dst, src, n) Shift left - * - * int first_cpu(mask) Number lowest set bit, or NR_CPUS - * int next_cpu(cpu, mask) Next cpu past 'cpu', or NR_CPUS - * - * cpumask_t cpumask_of_cpu(cpu) Return cpumask with bit 'cpu' set - * CPU_MASK_ALL Initializer - all bits set - * CPU_MASK_NONE Initializer - no bits set - * unsigned long *cpus_addr(mask) Array of unsigned long's in mask - * - * int cpumask_scnprintf(buf, len, mask) Format cpumask for printing - * int cpumask_parse(ubuf, ulen, mask) Parse ascii string as cpumask - * int cpulist_scnprintf(buf, len, mask) Format cpumask as list for printing - * int cpulist_parse(buf, map) Parse ascii string as cpulist - * - * for_each_cpu_mask(cpu, mask) for-loop cpu over mask - * - * int num_online_cpus() Number of online CPUs - * int num_possible_cpus() Number of all possible CPUs - * int num_present_cpus() Number of present CPUs - * - * int cpu_online(cpu) Is some cpu online? - * int cpu_possible(cpu) Is some cpu possible? - * int cpu_present(cpu) Is some cpu present (can schedule)? - * - * int any_online_cpu(mask) First online cpu in mask - * - * for_each_cpu(cpu) for-loop cpu over cpu_possible_map - * for_each_online_cpu(cpu) for-loop cpu over cpu_online_map - * for_each_present_cpu(cpu) for-loop cpu over cpu_present_map - * - * Subtlety: - * 1) The 'type-checked' form of cpu_isset() causes gcc (3.3.2, anyway) - * to generate slightly worse code. Note for example the additional - * 40 lines of assembly code compiling the "for each possible cpu" - * loops buried in the disk_stat_read() macros calls when compiling - * drivers/block/genhd.c (arch i386, CONFIG_SMP=y). So use a simple - * one-line #define for cpu_isset(), instead of wrapping an inline - * inside a macro, the way we do the other calls. - */ - -#include <linux/kernel.h> -#include <linux/threads.h> -#include <linux/bitmap.h> -#include <asm/bug.h> - -typedef struct { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t; -extern cpumask_t _unused_cpumask_arg_; - -#define cpu_set(cpu, dst) __cpu_set((cpu), &(dst)) -static inline void __cpu_set(int cpu, volatile cpumask_t *dstp) -{ - set_bit(cpu, dstp->bits); -} - -#define cpu_clear(cpu, dst) __cpu_clear((cpu), &(dst)) -static inline void __cpu_clear(int cpu, volatile cpumask_t *dstp) -{ - clear_bit(cpu, dstp->bits); -} - -#define cpus_setall(dst) __cpus_setall(&(dst), NR_CPUS) -static inline void __cpus_setall(cpumask_t *dstp, int nbits) -{ - bitmap_fill(dstp->bits, nbits); -} - -#define cpus_clear(dst) __cpus_clear(&(dst), NR_CPUS) -static inline void __cpus_clear(cpumask_t *dstp, int nbits) -{ - bitmap_zero(dstp->bits, nbits); -} - -/* No static inline type checking - see Subtlety (1) above. */ -#define cpu_isset(cpu, cpumask) test_bit((cpu), (cpumask).bits) - -#define cpu_test_and_set(cpu, cpumask) __cpu_test_and_set((cpu), &(cpumask)) -static inline int __cpu_test_and_set(int cpu, cpumask_t *addr) -{ - return test_and_set_bit(cpu, addr->bits); -} - -#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS) -static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p, - const cpumask_t *src2p, int nbits) -{ - bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits); -} - -#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS) -static inline void __cpus_or(cpumask_t *dstp, const cpumask_t *src1p, - const cpumask_t *src2p, int nbits) -{ - bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits); -} - -#define cpus_xor(dst, src1, src2) __cpus_xor(&(dst), &(src1), &(src2), NR_CPUS) -static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p, - const cpumask_t *src2p, int nbits) -{ - bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits); -} - -#define cpus_andnot(dst, src1, src2) \ - __cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS) -static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p, - const cpumask_t *src2p, int nbits) -{ - bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits); -} - -#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS) -static inline void __cpus_complement(cpumask_t *dstp, - const cpumask_t *srcp, int nbits) -{ - bitmap_complement(dstp->bits, srcp->bits, nbits); -} - -#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), NR_CPUS) -static inline int __cpus_equal(const cpumask_t *src1p, - const cpumask_t *src2p, int nbits) -{ - return bitmap_equal(src1p->bits, src2p->bits, nbits); -} - -#define cpus_intersects(src1, src2) __cpus_intersects(&(src1), &(src2), NR_CPUS) -static inline int __cpus_intersects(const cpumask_t *src1p, - const cpumask_t *src2p, int nbits) -{ - return bitmap_intersects(src1p->bits, src2p->bits, nbits); -} - -#define cpus_subset(src1, src2) __cpus_subset(&(src1), &(src2), NR_CPUS) -static inline int __cpus_subset(const cpumask_t *src1p, - const cpumask_t *src2p, int nbits) -{ - return bitmap_subset(src1p->bits, src2p->bits, nbits); -} - -#define cpus_empty(src) __cpus_empty(&(src), NR_CPUS) -static inline int __cpus_empty(const cpumask_t *srcp, int nbits) -{ - return bitmap_empty(srcp->bits, nbits); -} - -#define cpus_full(cpumask) __cpus_full(&(cpumask), NR_CPUS) -static inline int __cpus_full(const cpumask_t *srcp, int nbits) -{ - return bitmap_full(srcp->bits, nbits); -} - -#define cpus_weight(cpumask) __cpus_weight(&(cpumask), NR_CPUS) -static inline int __cpus_weight(const cpumask_t *srcp, int nbits) -{ - return bitmap_weight(srcp->bits, nbits); -} - -#define cpus_shift_right(dst, src, n) \ - __cpus_shift_right(&(dst), &(src), (n), NR_CPUS) -static inline void __cpus_shift_right(cpumask_t *dstp, - const cpumask_t *srcp, int n, int nbits) -{ - bitmap_shift_right(dstp->bits, srcp->bits, n, nbits); -} - -#define cpus_shift_left(dst, src, n) \ - __cpus_shift_left(&(dst), &(src), (n), NR_CPUS) -static inline void __cpus_shift_left(cpumask_t *dstp, - const cpumask_t *srcp, int n, int nbits) -{ - bitmap_shift_left(dstp->bits, srcp->bits, n, nbits); -} - -#define first_cpu(src) __first_cpu(&(src), NR_CPUS) -static inline int __first_cpu(const cpumask_t *srcp, int nbits) -{ - return min_t(int, nbits, find_first_bit(srcp->bits, nbits)); -} - -#define next_cpu(n, src) __next_cpu((n), &(src), NR_CPUS) -static inline int __next_cpu(int n, const cpumask_t *srcp, int nbits) -{ - return min_t(int, nbits, find_next_bit(srcp->bits, nbits, n+1)); -} - -#define cpumask_of_cpu(cpu) \ -({ \ - typeof(_unused_cpumask_arg_) m; \ - if (sizeof(m) == sizeof(unsigned long)) { \ - m.bits[0] = 1UL<<(cpu); \ - } else { \ - cpus_clear(m); \ - cpu_set((cpu), m); \ - } \ - m; \ -}) - -#define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS) - -#if NR_CPUS <= BITS_PER_LONG - -#define CPU_MASK_ALL \ -(cpumask_t) { { \ - [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \ -} } - -#else - -#define CPU_MASK_ALL \ -(cpumask_t) { { \ - [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \ - [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \ -} } - -#endif - -#define CPU_MASK_NONE \ -(cpumask_t) { { \ - [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \ -} } - -#define CPU_MASK_CPU0 \ -(cpumask_t) { { \ - [0] = 1UL \ -} } - -#define cpus_addr(src) ((src).bits) - -#define cpumask_scnprintf(buf, len, src) \ - __cpumask_scnprintf((buf), (len), &(src), NR_CPUS) -static inline int __cpumask_scnprintf(char *buf, int len, - const cpumask_t *srcp, int nbits) -{ - return bitmap_scnprintf(buf, len, srcp->bits, nbits); -} - -#define cpumask_parse(ubuf, ulen, dst) \ - __cpumask_parse((ubuf), (ulen), &(dst), NR_CPUS) -static inline int __cpumask_parse(const char __user *buf, int len, - cpumask_t *dstp, int nbits) -{ - return bitmap_parse(buf, len, dstp->bits, nbits); -} - -#define cpulist_scnprintf(buf, len, src) \ - __cpulist_scnprintf((buf), (len), &(src), NR_CPUS) -static inline int __cpulist_scnprintf(char *buf, int len, - const cpumask_t *srcp, int nbits) -{ - return bitmap_scnlistprintf(buf, len, srcp->bits, nbits); -} - -#define cpulist_parse(buf, dst) __cpulist_parse((buf), &(dst), NR_CPUS) -static inline int __cpulist_parse(const char *buf, cpumask_t *dstp, int nbits) -{ - return bitmap_parselist(buf, dstp->bits, nbits); -} - -#if NR_CPUS > 1 -#define for_each_cpu_mask(cpu, mask) \ - for ((cpu) = first_cpu(mask); \ - (cpu) < NR_CPUS; \ - (cpu) = next_cpu((cpu), (mask))) -#else /* NR_CPUS == 1 */ -#define for_each_cpu_mask(cpu, mask) for ((cpu) = 0; (cpu) < 1; (cpu)++) -#endif /* NR_CPUS */ - -/* - * The following particular system cpumasks and operations manage - * possible, present and online cpus. Each of them is a fixed size - * bitmap of size NR_CPUS. - * - * #ifdef CONFIG_HOTPLUG_CPU - * cpu_possible_map - all NR_CPUS bits set - * cpu_present_map - has bit 'cpu' set iff cpu is populated - * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler - * #else - * cpu_possible_map - has bit 'cpu' set iff cpu is populated - * cpu_present_map - copy of cpu_possible_map - * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler - * #endif - * - * In either case, NR_CPUS is fixed at compile time, as the static - * size of these bitmaps. The cpu_possible_map is fixed at boot - * time, as the set of CPU id's that it is possible might ever - * be plugged in at anytime during the life of that system boot. - * The cpu_present_map is dynamic(*), representing which CPUs - * are currently plugged in. And cpu_online_map is the dynamic - * subset of cpu_present_map, indicating those CPUs available - * for scheduling. - * - * If HOTPLUG is enabled, then cpu_possible_map is forced to have - * all NR_CPUS bits set, otherwise it is just the set of CPUs that - * ACPI reports present at boot. - * - * If HOTPLUG is enabled, then cpu_present_map varies dynamically, - * depending on what ACPI reports as currently plugged in, otherwise - * cpu_present_map is just a copy of cpu_possible_map. - * - * (*) Well, cpu_present_map is dynamic in the hotplug case. If not - * hotplug, it's a copy of cpu_possible_map, hence fixed at boot. - * - * Subtleties: - * 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode - * assumption that their single CPU is online. The UP - * cpu_{online,possible,present}_maps are placebos. Changing them - * will have no useful affect on the following num_*_cpus() - * and cpu_*() macros in the UP case. This ugliness is a UP - * optimization - don't waste any instructions or memory references - * asking if you're online or how many CPUs there are if there is - * only one CPU. - * 2) Most SMP arch's #define some of these maps to be some - * other map specific to that arch. Therefore, the following - * must be #define macros, not inlines. To see why, examine - * the assembly code produced by the following. Note that - * set1() writes phys_x_map, but set2() writes x_map: - * int x_map, phys_x_map; - * #define set1(a) x_map = a - * inline void set2(int a) { x_map = a; } - * #define x_map phys_x_map - * main(){ set1(3); set2(5); } - */ - -extern cpumask_t cpu_possible_map; -#ifndef XEN -extern cpumask_t cpu_online_map; -#endif -extern cpumask_t cpu_present_map; - -#if NR_CPUS > 1 -#define num_online_cpus() cpus_weight(cpu_online_map) -#define num_possible_cpus() cpus_weight(cpu_possible_map) -#define num_present_cpus() cpus_weight(cpu_present_map) -#define cpu_online(cpu) cpu_isset((cpu), cpu_online_map) -#define cpu_possible(cpu) cpu_isset((cpu), cpu_possible_map) -#define cpu_present(cpu) cpu_isset((cpu), cpu_present_map) -#else -#define num_online_cpus() 1 -#define num_possible_cpus() 1 -#define num_present_cpus() 1 -#define cpu_online(cpu) ((cpu) == 0) -#define cpu_possible(cpu) ((cpu) == 0) -#define cpu_present(cpu) ((cpu) == 0) -#endif - -#define any_online_cpu(mask) \ -({ \ - int cpu; \ - for_each_cpu_mask(cpu, (mask)) \ - if (cpu_online(cpu)) \ - break; \ - cpu; \ -}) - -#define for_each_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map) -#define for_each_online_cpu(cpu) for_each_cpu_mask((cpu), cpu_online_map) -#define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map) - -#endif /* __LINUX_CPUMASK_H */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux/asm/sigcontext.h --- a/xen/include/asm-ia64/linux/asm/sigcontext.h Thu Mar 2 09:59:34 2006 +++ /dev/null Thu Mar 2 10:00:49 2006 @@ -1,70 +0,0 @@ -#ifndef _ASM_IA64_SIGCONTEXT_H -#define _ASM_IA64_SIGCONTEXT_H - -/* - * Copyright (C) 1998, 1999, 2001 Hewlett-Packard Co - * Copyright (C) 1998, 1999, 2001 David Mosberger-Tang <davidm@xxxxxxxxxx> - */ - -#include <asm/fpu.h> - -#define IA64_SC_FLAG_ONSTACK_BIT 0 /* is handler running on signal stack? */ -#define IA64_SC_FLAG_IN_SYSCALL_BIT 1 /* did signal interrupt a syscall? */ -#define IA64_SC_FLAG_FPH_VALID_BIT 2 /* is state in f[32]-f[127] valid? */ - -#define IA64_SC_FLAG_ONSTACK (1 << IA64_SC_FLAG_ONSTACK_BIT) -#define IA64_SC_FLAG_IN_SYSCALL (1 << IA64_SC_FLAG_IN_SYSCALL_BIT) -#define IA64_SC_FLAG_FPH_VALID (1 << IA64_SC_FLAG_FPH_VALID_BIT) - -# ifndef __ASSEMBLY__ - -/* - * Note on handling of register backing store: sc_ar_bsp contains the address that would - * be found in ar.bsp after executing a "cover" instruction the context in which the - * signal was raised. If signal delivery required switching to an alternate signal stack - * (sc_rbs_base is not NULL), the "dirty" partition (as it would exist after executing the - * imaginary "cover" instruction) is backed by the *alternate* signal stack, not the - * original one. In this case, sc_rbs_base contains the base address of the new register - * backing store. The number of registers in the dirty partition can be calculated as: - * - * ndirty = ia64_rse_num_regs(sc_rbs_base, sc_rbs_base + (sc_loadrs >> 16)) - * - */ - -struct sigcontext { - unsigned long sc_flags; /* see manifest constants above */ - unsigned long sc_nat; /* bit i == 1 iff scratch reg gr[i] is a NaT */ - stack_t sc_stack; /* previously active stack */ - - unsigned long sc_ip; /* instruction pointer */ - unsigned long sc_cfm; /* current frame marker */ - unsigned long sc_um; /* user mask bits */ - unsigned long sc_ar_rsc; /* register stack configuration register */ - unsigned long sc_ar_bsp; /* backing store pointer */ - unsigned long sc_ar_rnat; /* RSE NaT collection register */ - unsigned long sc_ar_ccv; /* compare and exchange compare value register */ - unsigned long sc_ar_unat; /* ar.unat of interrupted context */ - unsigned long sc_ar_fpsr; /* floating-point status register */ - unsigned long sc_ar_pfs; /* previous function state */ - unsigned long sc_ar_lc; /* loop count register */ - unsigned long sc_pr; /* predicate registers */ - unsigned long sc_br[8]; /* branch registers */ - /* Note: sc_gr[0] is used as the "uc_link" member of ucontext_t */ - unsigned long sc_gr[32]; /* general registers (static partition) */ - struct ia64_fpreg sc_fr[128]; /* floating-point registers */ - - unsigned long sc_rbs_base; /* NULL or new base of sighandler's rbs */ - unsigned long sc_loadrs; /* see description above */ - - unsigned long sc_ar25; /* cmp8xchg16 uses this */ - unsigned long sc_ar26; /* rsvd for scratch use */ - unsigned long sc_rsvd[12]; /* reserved for future use */ - /* - * The mask must come last so we can increase _NSIG_WORDS - * without breaking binary compatibility. - */ - sigset_t sc_mask; /* signal mask to restore after handler returns */ -}; - -# endif /* __ASSEMBLY__ */ -#endif /* _ASM_IA64_SIGCONTEXT_H */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux/asm/signal.h --- a/xen/include/asm-ia64/linux/asm/signal.h Thu Mar 2 09:59:34 2006 +++ /dev/null Thu Mar 2 10:00:49 2006 @@ -1,166 +0,0 @@ -#ifndef _ASM_IA64_SIGNAL_H -#define _ASM_IA64_SIGNAL_H - -/* - * Modified 1998-2001, 2003 - * David Mosberger-Tang <davidm@xxxxxxxxxx>, Hewlett-Packard Co - * - * Unfortunately, this file is being included by bits/signal.h in - * glibc-2.x. Hence the #ifdef __KERNEL__ ugliness. - */ - -#define SIGHUP 1 -#define SIGINT 2 -#define SIGQUIT 3 -#define SIGILL 4 -#define SIGTRAP 5 -#define SIGABRT 6 -#define SIGIOT 6 -#define SIGBUS 7 -#define SIGFPE 8 -#define SIGKILL 9 -#define SIGUSR1 10 -#define SIGSEGV 11 -#define SIGUSR2 12 -#define SIGPIPE 13 -#define SIGALRM 14 -#define SIGTERM 15 -#define SIGSTKFLT 16 -#define SIGCHLD 17 -#define SIGCONT 18 -#define SIGSTOP 19 -#define SIGTSTP 20 -#define SIGTTIN 21 -#define SIGTTOU 22 -#define SIGURG 23 -#define SIGXCPU 24 -#define SIGXFSZ 25 -#define SIGVTALRM 26 -#define SIGPROF 27 -#define SIGWINCH 28 -#define SIGIO 29 -#define SIGPOLL SIGIO -/* -#define SIGLOST 29 -*/ -#define SIGPWR 30 -#define SIGSYS 31 -/* signal 31 is no longer "unused", but the SIGUNUSED macro remains for backwards compatibility */ -#define SIGUNUSED 31 - -/* These should not be considered constants from userland. */ -#define SIGRTMIN 32 -#define SIGRTMAX _NSIG - -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 -#define SA_SIGINFO 0x00000004 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ - -#define SA_RESTORER 0x04000000 - -/* - * sigaltstack controls - */ -#define SS_ONSTACK 1 -#define SS_DISABLE 2 - -/* - * The minimum stack size needs to be fairly large because we want to - * be sure that an app compiled for today's CPUs will continue to run - * on all future CPU models. The CPU model matters because the signal - * frame needs to have space for the complete machine state, including - * all physical stacked registers. The number of physical stacked - * registers is CPU model dependent, but given that the width of - * ar.rsc.loadrs is 14 bits, we can assume that they'll never take up - * more than 16KB of space. - */ -#if 1 - /* - * This is a stupid typo: the value was _meant_ to be 131072 (0x20000), but I typed it - * in wrong. ;-( To preserve backwards compatibility, we leave the kernel at the - * incorrect value and fix libc only. - */ -# define MINSIGSTKSZ 131027 /* min. stack size for sigaltstack() */ -#else -# define MINSIGSTKSZ 131072 /* min. stack size for sigaltstack() */ -#endif -#define SIGSTKSZ 262144 /* default stack size for sigaltstack() */ - -#ifdef __KERNEL__ - -#define _NSIG 64 -#define _NSIG_BPW 64 -#define _NSIG_WORDS (_NSIG / _NSIG_BPW) - -#define SA_PERCPU_IRQ 0x02000000 - -#endif /* __KERNEL__ */ - -#include <asm-generic/signal.h> - -# ifndef __ASSEMBLY__ - -# include <linux/types.h> - -/* Avoid too many header ordering problems. */ -struct siginfo; - -typedef struct sigaltstack { - void __user *ss_sp; - int ss_flags; - size_t ss_size; -} stack_t; - -#ifdef __KERNEL__ - -/* Most things should be clean enough to redefine this at will, if care - is taken to make libc match. */ - -typedef unsigned long old_sigset_t; - -typedef struct { - unsigned long sig[_NSIG_WORDS]; -} sigset_t; - -struct sigaction { - __sighandler_t sa_handler; - unsigned long sa_flags; - sigset_t sa_mask; /* mask last for extensibility */ -}; - -struct k_sigaction { - struct sigaction sa; -}; - -# include <asm/sigcontext.h> - -#define ptrace_signal_deliver(regs, cookie) do { } while (0) - -void set_sigdelayed(pid_t pid, int signo, int code, void __user *addr); - -#endif /* __KERNEL__ */ - -# endif /* !__ASSEMBLY__ */ -#endif /* _ASM_IA64_SIGNAL_H */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux/asm/smp.h --- a/xen/include/asm-ia64/linux/asm/smp.h Thu Mar 2 09:59:34 2006 +++ /dev/null Thu Mar 2 10:00:49 2006 @@ -1,139 +0,0 @@ -/* - * SMP Support - * - * Copyright (C) 1999 VA Linux Systems - * Copyright (C) 1999 Walt Drummond <drummond@xxxxxxxxxxx> - * (c) Copyright 2001-2003, 2005 Hewlett-Packard Development Company, L.P. - * David Mosberger-Tang <davidm@xxxxxxxxxx> - * Bjorn Helgaas <bjorn.helgaas@xxxxxx> - */ -#ifndef _ASM_IA64_SMP_H -#define _ASM_IA64_SMP_H - -#include <linux/config.h> -#include <linux/init.h> -#include <linux/threads.h> -#include <linux/kernel.h> -#include <linux/cpumask.h> - -#include <asm/bitops.h> -#include <asm/io.h> -#include <asm/param.h> -#include <asm/processor.h> -#include <asm/ptrace.h> - -static inline unsigned int -ia64_get_lid (void) -{ - union { - struct { - unsigned long reserved : 16; - unsigned long eid : 8; - unsigned long id : 8; - unsigned long ignored : 32; - } f; - unsigned long bits; - } lid; - - lid.bits = ia64_getreg(_IA64_REG_CR_LID); - return lid.f.id << 8 | lid.f.eid; -} - -#ifdef CONFIG_SMP - -#define XTP_OFFSET 0x1e0008 - -#define SMP_IRQ_REDIRECTION (1 << 0) -#define SMP_IPI_REDIRECTION (1 << 1) - -#define raw_smp_processor_id() (current_thread_info()->cpu) - -extern struct smp_boot_data { - int cpu_count; - int cpu_phys_id[NR_CPUS]; -} smp_boot_data __initdata; - -extern char no_int_routing __devinitdata; - -extern cpumask_t cpu_online_map; -extern cpumask_t cpu_core_map[NR_CPUS]; -extern cpumask_t cpu_sibling_map[NR_CPUS]; -extern int smp_num_siblings; -extern int smp_num_cpucores; -extern void __iomem *ipi_base_addr; -extern unsigned char smp_int_redirect; - -extern volatile int ia64_cpu_to_sapicid[]; -#define cpu_physical_id(i) ia64_cpu_to_sapicid[i] - -extern unsigned long ap_wakeup_vector; - -/* - * Function to map hard smp processor id to logical id. Slow, so don't use this in - * performance-critical code. - */ -static inline int -cpu_logical_id (int cpuid) -{ - int i; - - for (i = 0; i < NR_CPUS; ++i) - if (cpu_physical_id(i) == cpuid) - break; - return i; -} - -/* - * XTP control functions: - * min_xtp : route all interrupts to this CPU - * normal_xtp: nominal XTP value - * max_xtp : never deliver interrupts to this CPU. - */ - -static inline void -min_xtp (void) -{ - if (smp_int_redirect & SMP_IRQ_REDIRECTION) - writeb(0x00, ipi_base_addr + XTP_OFFSET); /* XTP to min */ -} - -static inline void -normal_xtp (void) -{ - if (smp_int_redirect & SMP_IRQ_REDIRECTION) - writeb(0x08, ipi_base_addr + XTP_OFFSET); /* XTP normal */ -} - -static inline void -max_xtp (void) -{ - if (smp_int_redirect & SMP_IRQ_REDIRECTION) - writeb(0x0f, ipi_base_addr + XTP_OFFSET); /* Set XTP to max */ -} - -#define hard_smp_processor_id() ia64_get_lid() - -/* Upping and downing of CPUs */ -extern int __cpu_disable (void); -extern void __cpu_die (unsigned int cpu); -extern void cpu_die (void) __attribute__ ((noreturn)); -extern int __cpu_up (unsigned int cpu); -extern void __init smp_build_cpu_map(void); - -extern void __init init_smp_config (void); -extern void smp_do_timer (struct pt_regs *regs); - -extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info, - int retry, int wait); -extern void smp_send_reschedule (int cpu); -extern void lock_ipi_calllock(void); -extern void unlock_ipi_calllock(void); -extern void identify_siblings (struct cpuinfo_ia64 *); - -#else - -#define cpu_logical_id(i) 0 -#define cpu_physical_id(i) ia64_get_lid() - -#endif /* CONFIG_SMP */ -#endif /* _ASM_IA64_SMP_H */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux/slab.h --- a/xen/include/asm-ia64/linux/slab.h Thu Mar 2 09:59:34 2006 +++ /dev/null Thu Mar 2 10:00:49 2006 @@ -1,137 +0,0 @@ -/* - * linux/mm/slab.h - * Written by Mark Hemment, 1996. - * (markhe@xxxxxxxxxxxxxxxxx) - */ - -#ifndef _LINUX_SLAB_H -#define _LINUX_SLAB_H - -#if defined(__KERNEL__) - -typedef struct kmem_cache_s kmem_cache_t; - -#include <linux/config.h> /* kmalloc_sizes.h needs CONFIG_ options */ -#include <linux/gfp.h> -#include <linux/init.h> -#include <linux/types.h> -#include <asm/page.h> /* kmalloc_sizes.h needs PAGE_SIZE */ -#include <asm/cache.h> /* kmalloc_sizes.h needs L1_CACHE_BYTES */ - -/* flags for kmem_cache_alloc() */ -#define SLAB_NOFS GFP_NOFS -#define SLAB_NOIO GFP_NOIO -#define SLAB_ATOMIC GFP_ATOMIC -#define SLAB_USER GFP_USER -#define SLAB_KERNEL GFP_KERNEL -#define SLAB_DMA GFP_DMA - -#define SLAB_LEVEL_MASK GFP_LEVEL_MASK - -#define SLAB_NO_GROW __GFP_NO_GROW /* don't grow a cache */ - -/* flags to pass to kmem_cache_create(). - * The first 3 are only valid when the allocator as been build - * SLAB_DEBUG_SUPPORT. - */ -#define SLAB_DEBUG_FREE 0x00000100UL /* Peform (expensive) checks on free */ -#define SLAB_DEBUG_INITIAL 0x00000200UL /* Call constructor (as verifier) */ -#define SLAB_RED_ZONE 0x00000400UL /* Red zone objs in a cache */ -#define SLAB_POISON 0x00000800UL /* Poison objects */ -#define SLAB_NO_REAP 0x00001000UL /* never reap from the cache */ -#define SLAB_HWCACHE_ALIGN 0x00002000UL /* align objs on a h/w cache lines */ -#define SLAB_CACHE_DMA 0x00004000UL /* use GFP_DMA memory */ -#define SLAB_MUST_HWCACHE_ALIGN 0x00008000UL /* force alignment */ -#define SLAB_STORE_USER 0x00010000UL /* store the last owner for bug hunting */ -#define SLAB_RECLAIM_ACCOUNT 0x00020000UL /* track pages allocated to indicate - what is reclaimable later*/ -#define SLAB_PANIC 0x00040000UL /* panic if kmem_cache_create() fails */ -#define SLAB_DESTROY_BY_RCU 0x00080000UL /* defer freeing pages to RCU */ - -/* flags passed to a constructor func */ -#define SLAB_CTOR_CONSTRUCTOR 0x001UL /* if not set, then deconstructor */ -#define SLAB_CTOR_ATOMIC 0x002UL /* tell constructor it can't sleep */ -#define SLAB_CTOR_VERIFY 0x004UL /* tell constructor it's a verify call */ - -/* prototypes */ -extern void __init kmem_cache_init(void); - -extern kmem_cache_t *kmem_cache_create(const char *, size_t, size_t, unsigned long, - void (*)(void *, kmem_cache_t *, unsigned long), - void (*)(void *, kmem_cache_t *, unsigned long)); -extern int kmem_cache_destroy(kmem_cache_t *); -extern int kmem_cache_shrink(kmem_cache_t *); -extern void *kmem_cache_alloc(kmem_cache_t *, unsigned int __nocast); -extern void kmem_cache_free(kmem_cache_t *, void *); -extern unsigned int kmem_cache_size(kmem_cache_t *); -extern const char *kmem_cache_name(kmem_cache_t *); -extern kmem_cache_t *kmem_find_general_cachep(size_t size, unsigned int __nocast gfpflags); - -/* Size description struct for general caches. */ -struct cache_sizes { - size_t cs_size; - kmem_cache_t *cs_cachep; - kmem_cache_t *cs_dmacachep; -}; -extern struct cache_sizes malloc_sizes[]; -extern void *__kmalloc(size_t, unsigned int __nocast); - -static inline void *kmalloc(size_t size, unsigned int __nocast flags) -{ - if (__builtin_constant_p(size)) { - int i = 0; -#define CACHE(x) \ - if (size <= x) \ - goto found; \ - else \ - i++; -#include "kmalloc_sizes.h" -#undef CACHE - { - extern void __you_cannot_kmalloc_that_much(void); - __you_cannot_kmalloc_that_much(); - } -found: - return kmem_cache_alloc((flags & GFP_DMA) ? - malloc_sizes[i].cs_dmacachep : - malloc_sizes[i].cs_cachep, flags); - } - return __kmalloc(size, flags); -} - -extern void *kcalloc(size_t, size_t, unsigned int __nocast); -extern void kfree(const void *); -extern unsigned int ksize(const void *); - -#ifdef CONFIG_NUMA -extern void *kmem_cache_alloc_node(kmem_cache_t *, int flags, int node); -extern void *kmalloc_node(size_t size, unsigned int __nocast flags, int node); -#else -static inline void *kmem_cache_alloc_node(kmem_cache_t *cachep, int flags, int node) -{ - return kmem_cache_alloc(cachep, flags); -} -static inline void *kmalloc_node(size_t size, unsigned int __nocast flags, int node) -{ - return kmalloc(size, flags); -} -#endif - -extern int FASTCALL(kmem_cache_reap(int)); -extern int FASTCALL(kmem_ptr_validate(kmem_cache_t *cachep, void *ptr)); - -/* System wide caches */ -extern kmem_cache_t *vm_area_cachep; -extern kmem_cache_t *names_cachep; -extern kmem_cache_t *files_cachep; -extern kmem_cache_t *filp_cachep; -extern kmem_cache_t *fs_cachep; -extern kmem_cache_t *signal_cachep; -extern kmem_cache_t *sighand_cachep; -extern kmem_cache_t *bio_cachep; - -extern atomic_t slab_reclaim_pages; - -#endif /* __KERNEL__ */ - -#endif /* _LINUX_SLAB_H */ diff -r 7edd64c8bb36 -r eeac4fdf02ed xen/include/asm-ia64/linux/threads.h --- a/xen/include/asm-ia64/linux/threads.h Thu Mar 2 09:59:34 2006 +++ /dev/null Thu Mar 2 10:00:49 2006 @@ -1,36 +0,0 @@ -#ifndef _LINUX_THREADS_H -#define _LINUX_THREADS_H - -#include <linux/config.h> - -/* - * The default limit for the nr of threads is now in - * /proc/sys/kernel/threads-max. - */ - -/* - * Maximum supported processors that can run under SMP. This value is - * set via configure setting. The maximum is equal to the size of the - * bitmasks used on that platform, i.e. 32 or 64. Setting this smaller - * saves quite a bit of memory. - */ -#ifdef CONFIG_SMP -#define NR_CPUS CONFIG_NR_CPUS -#else -#define NR_CPUS 1 -#endif - -#define MIN_THREADS_LEFT_FOR_ROOT 4 - -/* - * This controls the default maximum pid allocated to a process - */ -#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000) - -/* - * A maximum of 4 million PIDs should be enough for a while: - */ -#define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \ - (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT)) - -#endif _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |