Blame SOURCES/0001-x86-Fix-failure-of-collecting-vsyscall-mapping-due-t.patch

de9238
From 03f9360715731f18e4fdae7b30aa34b30dddcd57 Mon Sep 17 00:00:00 2001
de9238
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
de9238
Date: Sat, 26 Mar 2022 21:42:02 +0900
de9238
Subject: [PATCH 1/5] x86: Fix failure of collecting vsyscall mapping due to
de9238
 change of enum type of vsyscall_mode
de9238
de9238
vsyscall mapping fails to get collected because the commit
de9238
bd49e16e3339 (x86/vsyscall: Add a new vsyscall=xonly mode) merged at
de9238
kernel v5.2-rc7 added constant XONLY to the anonymous enumeration type
de9238
of variable vsyscall_mode, which made the value of constant NONE
de9238
change from 1 to 2.
de9238
de9238
This commit fixes the issue by checking the value of constant NONE
de9238
using gdb's print command and typeof operator since there's no utility
de9238
function to handle such anonymous enumeration type currently in crash
de9238
utility.
de9238
de9238
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
de9238
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
de9238
---
de9238
 src/libgcore/gcore_x86.c | 56 ++++++++++++++++++++++++++++++++++++++--
de9238
 1 file changed, 54 insertions(+), 2 deletions(-)
de9238
de9238
diff --git a/src/libgcore/gcore_x86.c b/src/libgcore/gcore_x86.c
de9238
index 08e573c741f6..f334a85d4240 100644
de9238
--- a/src/libgcore/gcore_x86.c
de9238
+++ b/src/libgcore/gcore_x86.c
de9238
@@ -41,6 +41,9 @@ struct gcore_x86_table
de9238
 static struct gcore_x86_table gcore_x86_table;
de9238
 struct gcore_x86_table *gxt = &gcore_x86_table;
de9238
 
de9238
+static void gdb_run_command(char *cmd, char *buf, size_t size);
de9238
+static int get_vsyscall_mode_none(void);
de9238
+
de9238
 #ifdef X86_64
de9238
 static ulong gcore_x86_64_get_old_rsp(int cpu);
de9238
 static ulong gcore_x86_64_get_per_cpu__old_rsp(int cpu);
de9238
@@ -2367,6 +2370,54 @@ int gcore_is_arch_32bit_emulation(struct task_context *tc)
de9238
 	return FALSE;
de9238
 }
de9238
 
de9238
+static void gdb_run_command(char *cmd, char *buf, size_t size)
de9238
+{
de9238
+	open_tmpfile();
de9238
+	if (!gdb_pass_through(cmd,
de9238
+			      pc->tmpfile,
de9238
+			      GNU_RETURN_ON_ERROR)) {
de9238
+		close_tmpfile();
de9238
+		error(FATAL, "gdb command failed: %s", cmd);
de9238
+	}
de9238
+	rewind(pc->tmpfile);
de9238
+	fgets(buf, size, pc->tmpfile);
de9238
+	close_tmpfile();
de9238
+}
de9238
+
de9238
+static int get_vsyscall_mode_none(void)
de9238
+{
de9238
+	static int none = -1;
de9238
+	char cmd[32], buf[BUFSIZE];
de9238
+	int i;
de9238
+
de9238
+	if (none != -1)
de9238
+		return none;
de9238
+
de9238
+	/*
de9238
+	 * Variable vsyscall_mode is of anonymous enumeration
de9238
+	 * type. Because there's no utility function in crash utility
de9238
+	 * to get value of each constant in specified anonymous
de9238
+	 * enumeration type, we have no choice but rely on gdb's print
de9238
+	 * command in combination with typeof operator.
de9238
+	 */
de9238
+	for (i = 0; i < 10; ++i) {
de9238
+		snprintf(cmd, sizeof(cmd), "p (typeof(vsyscall_mode))%d", i);
de9238
+		gdb_run_command(cmd, buf, sizeof(buf));
de9238
+		if (strstr(buf, "NONE"))
de9238
+			return none = i;
de9238
+	}
de9238
+
de9238
+	/*
de9238
+	 * When the above logic doesn't work as expected, use 2, which
de9238
+	 * is the value on the definition where vsyscall_mode was
de9238
+	 * first introduced at the commit 3ae36655b97a (x86-64: Rework
de9238
+	 * vsyscall emulation and add vsyscall= parameter).
de9238
+	 */
de9238
+	none = 2;
de9238
+
de9238
+	return none;
de9238
+}
de9238
+
de9238
 /**
de9238
  * Return an address to gate_vma.
de9238
  */
de9238
@@ -2377,7 +2428,8 @@ ulong gcore_arch_get_gate_vma(void)
de9238
 		return 0UL;
de9238
 
de9238
 	if (symbol_exists("vsyscall_mode")) {
de9238
-		enum { ENUMERATE, NONE } vsyscall_mode;
de9238
+		int vsyscall_mode;
de9238
+		int none = get_vsyscall_mode_none();
de9238
 
de9238
 		readmem(symbol_value("vsyscall_mode"),
de9238
 			KVADDR,
de9238
@@ -2386,7 +2438,7 @@ ulong gcore_arch_get_gate_vma(void)
de9238
 			"gcore_arch_get_gate_vma: vsyscall_mode",
de9238
 			gcore_verbose_error_handle());
de9238
 
de9238
-		if (vsyscall_mode == NONE)
de9238
+		if (vsyscall_mode == none)
de9238
 			return 0UL;
de9238
 	}
de9238
 
de9238
-- 
de9238
2.37.1
de9238