;;
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
;;
* 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
bsw.1
;;
#else // CONFIG_VTI
+ mov IA64_KR(CURRENT)=r2
+ mov IA64_KR(CURRENT_STACK)=r16
#endif // CONFIG_VTI
mov r13=r2
/*
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);
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
* 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();
/* 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
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");
dom0 = do_createdomain(0, 0);