[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [IA64] kexec: add __va_efi



# HG changeset patch
# User Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
# Date 1216696502 -32400
# Node ID 54060aec0dc1cd06202293eceb1615dc7e041c3e
# Parent  fb5cfb8b122e118f9ceca2a9dd93467e8dad3f0e
[IA64] kexec: add __va_efi

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 <horms@xxxxxxxxxxxx>
---
 xen/arch/ia64/linux-xen/sal.c  |    4 ++--
 xen/include/asm-ia64/xenpage.h |    9 +++++++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff -r fb5cfb8b122e -r 54060aec0dc1 xen/arch/ia64/linux-xen/sal.c
--- a/xen/arch/ia64/linux-xen/sal.c     Tue Jul 22 12:15:02 2008 +0900
+++ b/xen/arch/ia64/linux-xen/sal.c     Tue Jul 22 12:15:02 2008 +0900
@@ -121,8 +121,8 @@ sal_desc_entry_point (void *p)
 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
diff -r fb5cfb8b122e -r 54060aec0dc1 xen/include/asm-ia64/xenpage.h
--- a/xen/include/asm-ia64/xenpage.h    Tue Jul 22 12:15:02 2008 +0900
+++ b/xen/include/asm-ia64/xenpage.h    Tue Jul 22 12:15:02 2008 +0900
@@ -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 */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.