Currently makedumpfile fails if large page or change override bits
are set for region or segment table entries:

Excluding free pages               : [  0 %]
_kl_rsg_table_deref_s390x: Bad region/segment table entry.
readmem: Can't convert a virtual address(3d1015fc028) to physical address.
readmem: type_addr: 0, addr:3d1015fc028, size:8
reset_bitmap_of_free_pages: Can't get prev list_head.
_kl_rsg_table_deref_s390x: Bad region/segment table entry.
readmem: Can't convert a virtual address(3d1015fc028) to physical address.
readmem: type_addr: 0, addr:3d1015fc028, size:8
reset_bitmap_of_free_pages: Can't get prev list_head.
makedumpfile Failed.

Large page support is already implemented for the makedumpfile page table
walk. Only the check is invalid. To fix this we now allow the bits in
rsg_table_entry_bad().

Signed-off-by: Michael Holzheu <[email protected]>
---
 arch/s390x.c   |    4 +++-
 makedumpfile.h |    1 +
 2 files changed, 4 insertions(+), 1 deletion(-)

--- a/arch/s390x.c
+++ b/arch/s390x.c
@@ -133,7 +133,9 @@ rsg_table_entry_bad(unsigned long entry,
 {
        unsigned long mask = ~_REGION_ENTRY_INVALID
                                & ~_REGION_ENTRY_TYPE_MASK
-                               & ~_REGION_ENTRY_LENGTH;
+                               & ~_REGION_ENTRY_LENGTH
+                               & ~_SEGMENT_ENTRY_LARGE
+                               & ~_SEGMENT_ENTRY_CO;
 
        if (level)
                mask &= ~_REGION_ENTRY_ORIGIN;
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -617,6 +617,7 @@ do { \
 /* Bits in the segment table entry */
 #define _SEGMENT_ENTRY_ORIGIN  ~0x7ffUL
 #define _SEGMENT_ENTRY_LARGE   0x400
+#define _SEGMENT_ENTRY_CO      0x100
 #define _SEGMENT_PAGE_SHIFT    31
 #define _SEGMENT_INDEX_SHIFT   20
 


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to