|
|
|
|
|
|
|
|
|
|
xen-ia64-devel
[Xen-ia64-devel] [patch 8/8] Kexec: Simplify EFI check in ia64_do_page_f
This simplifies the check in ia64_do_page_fault() for an EFI mapping. It
the course of doing this it elimiates the expensive call to
efi_mem_attributes(). And the check against guest_mode(regs), as suggested
by Yamahata-san. Neither of these checks are neccessary now that a special
RID is used for EFI, as a fault occur for these virtual addresses with the
EFI RID set if they are actually EFI addresses.
This also mirrors the check which is used in assembly in
efi_mem_attributes(). The reason that the C version was more comprehensive
relates to the way that the EFI mapping code patches evolved and put
simply, I was being very defensive while I was trying to get things right.
The assembly code came later, and thus I was more comfortable with using
fewer checks at that time.
Cc: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
Cc: Tristan Gingold <tgingold@xxxxxxx>
Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
Index: xen-unstable.hg/xen/arch/ia64/xen/faults.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/faults.c 2007-10-23
14:00:34.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/faults.c 2007-10-23 14:10:12.000000000
+0900
@@ -184,25 +184,22 @@ void ia64_do_page_fault(unsigned long ad
}
again:
- if (!guest_mode(regs)) {
- if (address >> 59 == __IA64_EFI_CACHED_OFFSET >> 59) {
- attr = efi_mem_attributes(address &
- ~__IA64_EFI_CACHED_OFFSET);
- if (! (attr & EFI_MEMORY_RUNTIME &&
- attr & EFI_MEMORY_WB &&
- ia64_get_rr(7) == XEN_EFI_RID) )
- attr = 0;
- }
- else if (address >> 59 == __IA64_EFI_UNCACHED_OFFSET >> 59) {
- attr = efi_mem_attributes(address &
- ~__IA64_EFI_UNCACHED_OFFSET);
- if (! ((attr & EFI_MEMORY_RUNTIME) &&
- (attr & (EFI_MEMORY_UC|EFI_MEMORY_WC|
- EFI_MEMORY_WT)) &&
- ia64_get_rr(6) == XEN_EFI_RID) )
- attr = 0;
- }
- }
+ /* All that matters here is that if we are accessing EFI memory
+ * we note that by setting EFI_MEMORY_WB for cached access
+ * or EFI_MEMORY_UC for uncached access. The actuall efi attibutes
+ * are not of any interest as we can deduce the needed values.
+ * This avoids an expensive call to efi_mem_attributes().
+ *
+ * The RID check prevents domains from accessing this memory.
+ *
+ * This check is also duplicated in assembly in alt_dtlb_miss
+ */
+ if (address >> 59 == __IA64_EFI_CACHED_OFFSET >> 59 &&
+ ia64_get_rr(7) == XEN_EFI_RID)
+ attr = EFI_MEMORY_WB;
+ else if (address >> 59 == __IA64_EFI_UNCACHED_OFFSET >> 59 &&
+ ia64_get_rr(6) == XEN_EFI_RID)
+ attr = EFI_MEMORY_UC;
fault = vcpu_translate(current, address, is_data, &pteval,
&itir, &iha, attr);
--
--
Horms
H: http://www.vergenet.net/~horms/
W: http://www.valinux.co.jp/en/
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|
|
|
|
|