Blame SOURCES/github_a6cd8408_mach-m.patch

2e409b
commit a6cd8408d1d214a67ed0c4b09343fec77a8e2ae7
2e409b
Author: Dave Anderson <anderson@redhat.com>
2e409b
Date:   Thu May 31 11:43:14 2018 -0400
2e409b
2e409b
    Fix for the x86 and x86_64 "mach -m" option on Linux 4.12 and later
2e409b
    kernels to account for the structure name changes "e820map" to
2e409b
    "e820_table", and "e820entry" to "e820_entry", and for the symbol
2e409b
    name change from "e820" to "e820_table".  Also updated the display
2e409b
    output to properly translate E820_PRAM and E820_RESERVED_KERN entries.
2e409b
    Without the patch on all kernels, E820_PRAM and E820_RESERVED_KERN
2e409b
    entries show "type 12" and "type 128" respectively.  Without the
2e409b
    patch on Linux 4.12 and later kernels, the command fails with the
2e409b
    error message "mach: cannot resolve e820".
2e409b
    (anderson@redhat.com)
2e409b
2e409b
diff --git a/x86.c b/x86.c
2e409b
index 47767b6..88562b6 100644
2e409b
--- a/x86.c
2e409b
+++ b/x86.c
2e409b
@@ -1,8 +1,8 @@
2e409b
 /* x86.c - core analysis suite
2e409b
  *
2e409b
  * Portions Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
2e409b
- * Copyright (C) 2002-2014,2017 David Anderson
2e409b
- * Copyright (C) 2002-2014,2017 Red Hat, Inc. All rights reserved.
2e409b
+ * Copyright (C) 2002-2014,2017-2018 David Anderson
2e409b
+ * Copyright (C) 2002-2014,2017-2018 Red Hat, Inc. All rights reserved.
2e409b
  *
2e409b
  * This program is free software; you can redistribute it and/or modify
2e409b
  * it under the terms of the GNU General Public License as published by
2e409b
@@ -1967,15 +1967,27 @@ x86_init(int when)
2e409b
 		}
2e409b
 		MEMBER_OFFSET_INIT(thread_struct_cr3, "thread_struct", "cr3");
2e409b
 		STRUCT_SIZE_INIT(cpuinfo_x86, "cpuinfo_x86");
2e409b
-		STRUCT_SIZE_INIT(e820map, "e820map");
2e409b
-		STRUCT_SIZE_INIT(e820entry, "e820entry");
2e409b
 		STRUCT_SIZE_INIT(irq_ctx, "irq_ctx");
2e409b
+		if (STRUCT_EXISTS("e820map")) {
2e409b
+			STRUCT_SIZE_INIT(e820map, "e820map");
2e409b
+			MEMBER_OFFSET_INIT(e820map_nr_map, "e820map", "nr_map");
2e409b
+		} else {
2e409b
+			STRUCT_SIZE_INIT(e820map, "e820_table");
2e409b
+			MEMBER_OFFSET_INIT(e820map_nr_map, "e820_table", "nr_entries");
2e409b
+		}
2e409b
+		if (STRUCT_EXISTS("e820entry")) {
2e409b
+			STRUCT_SIZE_INIT(e820entry, "e820entry");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_addr, "e820entry", "addr");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_size, "e820entry", "size");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_type, "e820entry", "type");
2e409b
+		} else {
2e409b
+			STRUCT_SIZE_INIT(e820entry, "e820_entry");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_addr, "e820_entry", "addr");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_size, "e820_entry", "size");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_type, "e820_entry", "type");
2e409b
+		}
2e409b
 		if (!VALID_STRUCT(irq_ctx))
2e409b
 			STRUCT_SIZE_INIT(irq_ctx, "irq_stack");
2e409b
-		MEMBER_OFFSET_INIT(e820map_nr_map, "e820map", "nr_map");
2e409b
-		MEMBER_OFFSET_INIT(e820entry_addr, "e820entry", "addr");
2e409b
-		MEMBER_OFFSET_INIT(e820entry_size, "e820entry", "size");
2e409b
-		MEMBER_OFFSET_INIT(e820entry_type, "e820entry", "type");
2e409b
 		if (KVMDUMP_DUMPFILE())
2e409b
 			set_kvm_iohole(NULL);
2e409b
 		if (symbol_exists("irq_desc"))
2e409b
@@ -4415,33 +4427,54 @@ static char *e820type[] = {
2e409b
 static void
2e409b
 x86_display_memmap(void)
2e409b
 {
2e409b
-	ulong e820;
2e409b
-	int nr_map, i;
2e409b
-	char *buf, *e820entry_ptr;
2e409b
-	ulonglong addr, size;
2e409b
-	ulong type;
2e409b
+        ulong e820;
2e409b
+        int nr_map, i;
2e409b
+        char *buf, *e820entry_ptr;
2e409b
+        ulonglong addr, size;
2e409b
+        uint type;
2e409b
+
2e409b
+	if (kernel_symbol_exists("e820")) {
2e409b
+		if (get_symbol_type("e820", NULL, NULL) == TYPE_CODE_PTR)
2e409b
+			get_symbol_data("e820", sizeof(void *), &e820);
2e409b
+		else
2e409b
+			e820 = symbol_value("e820");
2e409b
+
2e409b
+	} else if (kernel_symbol_exists("e820_table"))
2e409b
+		get_symbol_data("e820_table", sizeof(void *), &e820);
2e409b
+	else
2e409b
+		error(FATAL, "neither e820 or e820_table symbols exist\n");
2e409b
 
2e409b
-	e820 = symbol_value("e820");
2e409b
-	buf = (char *)GETBUF(SIZE(e820map));
2e409b
+	if (CRASHDEBUG(1)) {
2e409b
+		if (STRUCT_EXISTS("e820map"))
2e409b
+			dump_struct("e820map", e820, RADIX(16));
2e409b
+		else if (STRUCT_EXISTS("e820_table"))
2e409b
+			dump_struct("e820_table", e820, RADIX(16));
2e409b
+	}
2e409b
+        buf = (char *)GETBUF(SIZE(e820map));
2e409b
 
2e409b
-        readmem(e820, KVADDR, &buf[0], SIZE(e820map), 
2e409b
-		"e820map", FAULT_ON_ERROR);
2e409b
+        readmem(e820, KVADDR, &buf[0], SIZE(e820map),
2e409b
+                "e820map", FAULT_ON_ERROR);
2e409b
 
2e409b
-	nr_map = INT(buf + OFFSET(e820map_nr_map));
2e409b
+        nr_map = INT(buf + OFFSET(e820map_nr_map));
2e409b
 
2e409b
-	fprintf(fp, "      PHYSICAL ADDRESS RANGE         TYPE\n");
2e409b
+        fprintf(fp, "      PHYSICAL ADDRESS RANGE         TYPE\n");
2e409b
 
2e409b
-	for (i = 0; i < nr_map; i++) {
2e409b
-		e820entry_ptr = buf + sizeof(int) + (SIZE(e820entry) * i);
2e409b
-		addr = ULONGLONG(e820entry_ptr + OFFSET(e820entry_addr));
2e409b
-		size = ULONGLONG(e820entry_ptr + OFFSET(e820entry_size));
2e409b
-		type = ULONG(e820entry_ptr + OFFSET(e820entry_type));
2e409b
+        for (i = 0; i < nr_map; i++) {
2e409b
+                e820entry_ptr = buf + sizeof(int) + (SIZE(e820entry) * i);
2e409b
+                addr = ULONGLONG(e820entry_ptr + OFFSET(e820entry_addr));
2e409b
+                size = ULONGLONG(e820entry_ptr + OFFSET(e820entry_size));
2e409b
+                type = UINT(e820entry_ptr + OFFSET(e820entry_type));
2e409b
 		fprintf(fp, "%016llx - %016llx  ", addr, addr+size);
2e409b
-		if (type >= (sizeof(e820type)/sizeof(char *)))
2e409b
-			fprintf(fp, "type %ld\n", type);
2e409b
-		else
2e409b
+		if (type >= (sizeof(e820type)/sizeof(char *))) {
2e409b
+			if (type == 12)
2e409b
+				fprintf(fp, "E820_PRAM\n");
2e409b
+			else if (type == 128)
2e409b
+				fprintf(fp, "E820_RESERVED_KERN\n");
2e409b
+			else
2e409b
+				fprintf(fp, "type %d\n", type);
2e409b
+		} else
2e409b
 			fprintf(fp, "%s\n", e820type[type]);
2e409b
-	}
2e409b
+        }
2e409b
 }
2e409b
 
2e409b
 /*
2e409b
diff --git a/x86_64.c b/x86_64.c
2e409b
index 921552b..1d5e155 100644
2e409b
--- a/x86_64.c
2e409b
+++ b/x86_64.c
2e409b
@@ -415,12 +415,26 @@ x86_64_init(int when)
2e409b
 			STRUCT_SIZE_INIT(gate_struct, "gate_desc");
2e409b
 		else
2e409b
 			STRUCT_SIZE_INIT(gate_struct, "gate_struct");
2e409b
-                STRUCT_SIZE_INIT(e820map, "e820map");
2e409b
-                STRUCT_SIZE_INIT(e820entry, "e820entry");
2e409b
-                MEMBER_OFFSET_INIT(e820map_nr_map, "e820map", "nr_map");
2e409b
-                MEMBER_OFFSET_INIT(e820entry_addr, "e820entry", "addr");
2e409b
-                MEMBER_OFFSET_INIT(e820entry_size, "e820entry", "size");
2e409b
-                MEMBER_OFFSET_INIT(e820entry_type, "e820entry", "type");
2e409b
+
2e409b
+		if (STRUCT_EXISTS("e820map")) {
2e409b
+			STRUCT_SIZE_INIT(e820map, "e820map");
2e409b
+			MEMBER_OFFSET_INIT(e820map_nr_map, "e820map", "nr_map");
2e409b
+		} else {
2e409b
+			STRUCT_SIZE_INIT(e820map, "e820_table");
2e409b
+			MEMBER_OFFSET_INIT(e820map_nr_map, "e820_table", "nr_entries");
2e409b
+		}
2e409b
+		if (STRUCT_EXISTS("e820entry")) {
2e409b
+			STRUCT_SIZE_INIT(e820entry, "e820entry");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_addr, "e820entry", "addr");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_size, "e820entry", "size");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_type, "e820entry", "type");
2e409b
+		} else {
2e409b
+			STRUCT_SIZE_INIT(e820entry, "e820_entry");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_addr, "e820_entry", "addr");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_size, "e820_entry", "size");
2e409b
+			MEMBER_OFFSET_INIT(e820entry_type, "e820_entry", "type");
2e409b
+		}
2e409b
+
2e409b
 		if (KVMDUMP_DUMPFILE())
2e409b
 			set_kvm_iohole(NULL);
2e409b
 		MEMBER_OFFSET_INIT(thread_struct_rip, "thread_struct", "rip");
2e409b
@@ -5643,12 +5657,23 @@ x86_64_display_memmap(void)
2e409b
         ulonglong addr, size;
2e409b
         uint type;
2e409b
 
2e409b
-	if (get_symbol_type("e820", NULL, NULL) == TYPE_CODE_PTR)
2e409b
-		get_symbol_data("e820", sizeof(void *), &e820);
2e409b
+	if (kernel_symbol_exists("e820")) {
2e409b
+		if (get_symbol_type("e820", NULL, NULL) == TYPE_CODE_PTR)
2e409b
+			get_symbol_data("e820", sizeof(void *), &e820);
2e409b
+		else
2e409b
+			e820 = symbol_value("e820");
2e409b
+
2e409b
+	} else if (kernel_symbol_exists("e820_table"))
2e409b
+		get_symbol_data("e820_table", sizeof(void *), &e820);
2e409b
 	else
2e409b
-		e820 = symbol_value("e820");
2e409b
-	if (CRASHDEBUG(1))
2e409b
-		dump_struct("e820map", e820, RADIX(16));
2e409b
+		error(FATAL, "neither e820 or e820_table symbols exist\n");
2e409b
+
2e409b
+	if (CRASHDEBUG(1)) {
2e409b
+		if (STRUCT_EXISTS("e820map"))
2e409b
+			dump_struct("e820map", e820, RADIX(16));
2e409b
+		else if (STRUCT_EXISTS("e820_table"))
2e409b
+			dump_struct("e820_table", e820, RADIX(16));
2e409b
+	}
2e409b
         buf = (char *)GETBUF(SIZE(e820map));
2e409b
 
2e409b
         readmem(e820, KVADDR, &buf[0], SIZE(e820map),
2e409b
@@ -5664,9 +5689,14 @@ x86_64_display_memmap(void)
2e409b
                 size = ULONGLONG(e820entry_ptr + OFFSET(e820entry_size));
2e409b
                 type = UINT(e820entry_ptr + OFFSET(e820entry_type));
2e409b
 		fprintf(fp, "%016llx - %016llx  ", addr, addr+size);
2e409b
-		if (type >= (sizeof(e820type)/sizeof(char *)))
2e409b
-			fprintf(fp, "type %d\n", type);
2e409b
-		else
2e409b
+		if (type >= (sizeof(e820type)/sizeof(char *))) {
2e409b
+			if (type == 12)
2e409b
+				fprintf(fp, "E820_PRAM\n");
2e409b
+			else if (type == 128)
2e409b
+				fprintf(fp, "E820_RESERVED_KERN\n");
2e409b
+			else
2e409b
+				fprintf(fp, "type %d\n", type);
2e409b
+		} else
2e409b
 			fprintf(fp, "%s\n", e820type[type]);
2e409b
         }
2e409b
 }