ia64/xen-unstable
changeset 8919:d940ec92958d
[IA64] SMP_HOST: map pal code on smp host
On up host, only when rr7 is changed, efi_map_pal_code() is called to
remap pal code on new rr7. But on smp host, efi_map_pal_code is also
called to map pal code for other processors, which may not satisfy rr7
change condition, thus pal code may not be mapped in some processors,
while ia64_pal_halt_light called in startup_cpu_idle_loop will cause
machine crash.
Signed-off-by: Anthony Xu <anthony.xu@intel.com>
On up host, only when rr7 is changed, efi_map_pal_code() is called to
remap pal code on new rr7. But on smp host, efi_map_pal_code is also
called to map pal code for other processors, which may not satisfy rr7
change condition, thus pal code may not be mapped in some processors,
while ia64_pal_halt_light called in startup_cpu_idle_loop will cause
machine crash.
Signed-off-by: Anthony Xu <anthony.xu@intel.com>
author | awilliam@xenbuild.aw |
---|---|
date | Fri Feb 24 14:03:07 2006 -0700 (2006-02-24) |
parents | c18c63f87b7d |
children | 6c43118bdba8 |
files | xen/arch/ia64/linux-xen/efi.c |
line diff
1.1 --- a/xen/arch/ia64/linux-xen/efi.c Fri Feb 24 13:38:26 2006 -0700 1.2 +++ b/xen/arch/ia64/linux-xen/efi.c Fri Feb 24 14:03:07 2006 -0700 1.3 @@ -534,32 +534,9 @@ efi_map_pal_code (void) 1.4 { 1.5 #ifdef XEN 1.6 u64 psr; 1.7 - static unsigned long last_rr7 = 0; 1.8 - unsigned long current_rr7 = ia64_get_rr(7L<<61); 1.9 - 1.10 - // this routine is called only once in Linux but may be called 1.11 - // multiple times in Xen. However, we only need to flush and 1.12 - // reset itr[IA64_TR_PALCODE] if rr7 changes 1.13 if (!pal_vaddr) { 1.14 pal_vaddr = efi_get_pal_addr (); 1.15 - last_rr7 = current_rr7; 1.16 } 1.17 - else if (last_rr7 == current_rr7) return; 1.18 - else { 1.19 - last_rr7 = current_rr7; 1.20 - printk("efi_map_pal_code,remapping pal w/rr7=%lx\n",last_rr7); 1.21 - } 1.22 - 1.23 - printf("efi_map_pal_code: about to ia64_ptr(%d,%p,%p)\n", 1.24 - 0x1, GRANULEROUNDDOWN((unsigned long) pal_vaddr), 1.25 - IA64_GRANULE_SHIFT); 1.26 - ia64_ptr(0x1, GRANULEROUNDDOWN((unsigned long) pal_vaddr), 1.27 - IA64_GRANULE_SHIFT); 1.28 - ia64_srlz_i(); 1.29 - printf("efi_map_pal_code: about to ia64_itr(%p,%p,%p,%p,%p)\n", 1.30 - 0x1, IA64_TR_PALCODE, GRANULEROUNDDOWN((unsigned long) pal_vaddr), 1.31 - pte_val(pfn_pte(__pa(pal_vaddr) >> PAGE_SHIFT, PAGE_KERNEL)), 1.32 - IA64_GRANULE_SHIFT); 1.33 #else 1.34 void *pal_vaddr = efi_get_pal_addr (); 1.35 u64 psr;