# HG changeset patch
# User fred@xxxxxxxxxxxxxxxxxxxxx
# Node ID 5f1ed597f1072b86d5c59a588c3ac2aefd0b7450
# Parent 1ec2225aa8c696ca4e96e0fc27b4eafe36a9633f
Ensure percpu data area not used before the TR is set.
diff -r 1ec2225aa8c6 -r 5f1ed597f107 xen/arch/ia64/ivt.S
--- a/xen/arch/ia64/ivt.S Sat Aug 20 05:19:39 2005
+++ b/xen/arch/ia64/ivt.S Wed Aug 24 02:43:18 2005
@@ -136,7 +136,11 @@
;;
rsm psr.dt // use physical addressing for
data
mov r31=pr // save the predicate registers
+#ifdef XEN
+ movl r19=THIS_CPU(cpu_kr)+IA64_KR_PT_BASE_OFFSET;;
+#else
mov r19=IA64_KR(PT_BASE) // get page table base address
+#endif
shl r21=r16,3 // shift bit 60 into sign bit
shr.u r17=r16,61 // get the region number into
r17
;;
@@ -503,7 +507,11 @@
* Clobbered: b0, r18, r19, r21, psr.dt (cleared)
*/
rsm psr.dt // switch to using physical
data addressing
+#ifdef XEN
+ movl r19=THIS_CPU(cpu_kr)+IA64_KR_PT_BASE_OFFSET;;
+#else
mov r19=IA64_KR(PT_BASE) // get the page table base
address
+#endif
shl r21=r16,3 // shift bit 60 into sign bit
;;
shr.u r17=r16,61 // get the region number into
r17
diff -r 1ec2225aa8c6 -r 5f1ed597f107 xen/arch/ia64/linux-xen/head.S
--- a/xen/arch/ia64/linux-xen/head.S Sat Aug 20 05:19:39 2005
+++ b/xen/arch/ia64/linux-xen/head.S Wed Aug 24 02:43:18 2005
@@ -226,6 +226,8 @@
bsw.1
;;
#else // CONFIG_VTI
+ mov IA64_KR(CURRENT)=r2
+ mov IA64_KR(CURRENT_STACK)=r16
#endif // CONFIG_VTI
mov r13=r2
/*
diff -r 1ec2225aa8c6 -r 5f1ed597f107 xen/arch/ia64/linux-xen/setup.c
--- a/xen/arch/ia64/linux-xen/setup.c Sat Aug 20 05:19:39 2005
+++ b/xen/arch/ia64/linux-xen/setup.c Wed Aug 24 02:43:18 2005
@@ -260,9 +260,9 @@
phys_iobase = efi_get_iobase();
if (phys_iobase)
/* set AR.KR0 since this is all we use it for anyway */
- __get_cpu_var(cpu_kr)._kr[IA64_KR_IO_BASE]=phys_iobase;
+ ia64_set_kr(IA64_KR_IO_BASE, phys_iobase);
else {
- phys_iobase=__get_cpu_var(cpu_kr)._kr[IA64_KR_IO_BASE];
+ phys_iobase = ia64_get_kr(IA64_KR_IO_BASE);
printk(KERN_INFO "No I/O port range found in EFI memory map,
falling back "
"to AR.KR0\n");
printk(KERN_INFO "I/O port base = 0x%lx\n", phys_iobase);
@@ -609,8 +609,6 @@
setup_per_cpu_areas (void)
{
/* start_kernel() requires this... */
- __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT] = current;
- __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT_STACK] = -1;
}
static void
@@ -668,8 +666,8 @@
* physical addresses of per cpu variables with a simple:
* phys = ar.k3 + &per_cpu_var
*/
-// ia64_set_kr(IA64_KR_PER_CPU_DATA,
-// ia64_tpa(cpu_data) - (long) __per_cpu_start);
+ ia64_set_kr(IA64_KR_PER_CPU_DATA,
+ ia64_tpa(cpu_data) - (long) __per_cpu_start);
get_max_cacheline_size();
@@ -699,7 +697,7 @@
/* Clear the stack memory reserved for pt_regs: */
memset(ia64_task_regs(current), 0, sizeof(struct pt_regs));
- __get_cpu_var(cpu_kr)._kr[IA64_KR_FPU_OWNER] = 0;
+ ia64_set_kr(IA64_KR_FPU_OWNER, 0);
/*
* Initialize default control register to defer all speculative faults.
The
diff -r 1ec2225aa8c6 -r 5f1ed597f107 xen/arch/ia64/xensetup.c
--- a/xen/arch/ia64/xensetup.c Sat Aug 20 05:19:39 2005
+++ b/xen/arch/ia64/xensetup.c Wed Aug 24 02:43:18 2005
@@ -260,6 +260,14 @@
do_initcalls();
printk("About to call sort_main_extable()\n");
sort_main_extable();
+
+ /* surrender usage of kernel registers to domain, use percpu area instead
*/
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_IO_BASE] = ia64_get_kr(IA64_KR_IO_BASE);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_PER_CPU_DATA] =
ia64_get_kr(IA64_KR_PER_CPU_DATA);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT_STACK] =
ia64_get_kr(IA64_KR_CURRENT_STACK);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_FPU_OWNER] =
ia64_get_kr(IA64_KR_FPU_OWNER);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT] = ia64_get_kr(IA64_KR_CURRENT);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_PT_BASE] = ia64_get_kr(IA64_KR_PT_BASE);
/* Create initial domain 0. */
printk("About to call do_createdomain()\n");
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|