sal_desc_entry_point() converts physical addresses into virtual
addresses using __va() and these virtual addresses are used
to register the SAL and PAL handlers - which exist in firmware
memory.

As the mapping of firmware memory is being moved from
a PAGE_OFFSET of (0xf << 60) to a PAGE_OFFSET of (0xe << 60),
__va() does not provide the correct virtual address.

By adding __va_efi(), which uses EFI_PAGE_OFFSET=(0xe << 60),
and using this in sal_desc_entry_point(), the correct address is
used.

On an HP rx2600 this eliminates the problem where the SAL rendezvous address
can't be registered and subsequently the boot fails. I suspect it
solves similar problems that have been seen on other HP machines too.

Actually, its rather amazing that the HP rx2620 and Tiger2 that
I have been using work without this fix.

Signed-off-by: Simon Horman <[EMAIL PROTECTED]>

--- 

I will post a fresh series of patches shortly - I have to run to a meeting
soon, but I'm pretty excited about this and wanted to get it out there.

I have found that the following patches works on HP rx2620, HP 2600
and Tiger 2.

* The "ia64: kexec: Map EFI memory in the same location as Linux" series
  of 15 patches that I posed to xen-ia64-devel on the 4th March.
  http://lists.xensource.com/archives/html/xen-ia64-devel/2008-03/msg00020.html

* Omit patch 13/15
  "ia64: kexec: Set page size identity mapping of EFI in alt_itlb_miss"

  This patch causes problems on machines that it is supposed to
  fix problems on - obviously I made a mistake when collating fixes.

* Optionally omit the following patches, as they don't seem to be used,
  although they don't seem to cause much harm either.

  09/15 "ia64: kexec: Add identity mapping of EFI memory to dtlb_miss"
  10/15 "ia64: kexec: identity mapping of EFI memory to itlb_miss"
  11/15 "ia64: kexec: Set protection key of identity mapping of EFI in
         alt_dtlb_miss"
  12/15 "ia64: kexec: Set protection key of identity mapping of EFI in
         alt_itlb_miss"

* Add this patch

Special thanks to Alex Williamson for giving me access to an
HP rx2620 so that I could debug this problem.


Mon, 14 Jul 2008 21:41:34 +1000
* Cast result to void to get rid of warnings.
  Thanks to Yamahata-san

Index: xen-unstable.hg/xen/arch/ia64/linux-xen/sal.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/sal.c  2008-07-14 
13:19:53.000000000 +1000
+++ xen-unstable.hg/xen/arch/ia64/linux-xen/sal.c       2008-07-14 
13:31:21.000000000 +1000
@@ -121,8 +121,8 @@ static void __init
 sal_desc_entry_point (void *p)
 {
        struct ia64_sal_desc_entry_point *ep = p;
-       ia64_pal_handler_init(__va(ep->pal_proc));
-       ia64_sal_handler_init(__va(ep->sal_proc), __va(ep->gp));
+       ia64_pal_handler_init(__va_efi(ep->pal_proc));
+       ia64_sal_handler_init(__va_efi(ep->sal_proc), __va_efi(ep->gp));
 }
 
 #ifdef CONFIG_SMP
Index: xen-unstable.hg/xen/include/asm-ia64/xenpage.h
===================================================================
--- xen-unstable.hg.orig/xen/include/asm-ia64/xenpage.h 2008-07-14 
13:19:53.000000000 +1000
+++ xen-unstable.hg/xen/include/asm-ia64/xenpage.h      2008-07-14 
13:57:07.000000000 +1000
@@ -97,5 +97,14 @@ static inline u64 pa_clear_uc(u64 paddr)
 /* It is sometimes very useful to have unsigned long as result.  */
 #define __va_ul(x)     ({xen_va _v; _v.l = (long) (x); _v.f.reg = -1; _v.l;})
 
+/* __va_efi() should just call __va() until the use of
+ * __IA64_EFI_CACHED_OFFSET is activated in efi_enter_virtual_mode()
+ */
+#if 0
+#define __va_efi(x)    ((void*)((unsigned long)(x) | __IA64_EFI_CACHED_OFFSET))
+#else
+#define __va_efi(x)    __va(x)
+#endif
+
 #endif
 #endif /* _ASM_IA64_XENPAGE_H */
Index: xen-unstable.hg/xen/arch/ia64/linux-xen/efi.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/efi.c  2008-07-14 
13:32:55.000000000 +1000
+++ xen-unstable.hg/xen/arch/ia64/linux-xen/efi.c       2008-07-14 
13:49:00.000000000 +1000
@@ -424,7 +424,7 @@ efi_get_pal_addr (void)
                        md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT),
                        vaddr & mask, (vaddr & mask) + IA64_GRANULE_SIZE);
 #endif
-               return __va(md->phys_addr);
+               return __va_efi(md->phys_addr);
        }
        printk(KERN_WARNING "%s: no PAL-code memory-descriptor found\n",
               __FUNCTION__);

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@lists.xensource.com
http://lists.xensource.com/xen-ia64-devel

Reply via email to