# 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
|