WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

[Xen-ia64-devel] [patch 13/14] ia64: kexec: add __va_efi

To: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-ia64-devel] [patch 13/14] ia64: kexec: add __va_efi
From: Simon Horman <horms@xxxxxxxxxxxx>
Date: Mon, 14 Jul 2008 19:21:51 +1000
Cc: Aron Griffis <aron@xxxxxx>, Isaku Yamahata <yamahata@xxxxxxxxxxxxx>, Alex Williamson <alex.williamson@xxxxxx>
Delivery-date: Mon, 14 Jul 2008 02:37:02 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20080714092138.629986006@xxxxxxxxxxxx>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: quilt/0.46-1
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>

--- 

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.

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)    ((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__);

-- 

-- 
Horms


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

<Prev in Thread] Current Thread [Next in Thread>