Blame SOURCES/0019-x86_64-Correct-the-identifier-when-locating-the-call.patch

56ae9b
From 93cd670426aaf4951bceb8f24f0ce63c24e16f5d Mon Sep 17 00:00:00 2001
56ae9b
From: Tao Liu <ltao@redhat.com>
56ae9b
Date: Wed, 16 Nov 2022 20:09:22 +0800
56ae9b
Subject: [PATCH 19/28] x86_64: Correct the identifier when locating the call
56ae9b
 instruction
56ae9b
56ae9b
The previous implementation to locate the call instruction is
56ae9b
to strstr "call", then check whether the previous char is ' '
56ae9b
or '\t'. The implementation is problematic. For example it
56ae9b
cannot resolve the following disassembly string:
56ae9b
56ae9b
"0xffffffffc0995378 <nfs41_callback_svc+344>:\tcall   0xffffffff8ecfa4c0 <schedule>\n"
56ae9b
56ae9b
strstr will locate the "_call" and char check fails,
56ae9b
as a result, extract_hex fails to get the calling address.
56ae9b
56ae9b
NOTE: the issue is more likely to be reproduced when patch[1] applied.
56ae9b
Because without patch[1], the disassembly string will be as follows,
56ae9b
so the issue is no longer reproducible.
56ae9b
56ae9b
"0xffffffffc0995378:\tcall   0xffffffff8ecfa4c0 <schedule>\n"
56ae9b
56ae9b
Before the patch:
56ae9b
    crash> bt 1472
56ae9b
    PID: 1472     TASK: ffff8c121fa72f70  CPU: 18   COMMAND: "nfsv4.1-svc"
56ae9b
     #0 [ffff8c16231a3db8] __schedule at ffffffff8ecf9ef3
56ae9b
     #1 [ffff8c16231a3e40] schedule at ffffffff8ecfa4e9
56ae9b
56ae9b
After the patch:
56ae9b
    crash> bt 1472
56ae9b
    PID: 1472     TASK: ffff8c121fa72f70  CPU: 18   COMMAND: "nfsv4.1-svc"
56ae9b
     #0 [ffff8c16231a3db8] __schedule at ffffffff8ecf9ef3
56ae9b
     #1 [ffff8c16231a3e40] schedule at ffffffff8ecfa4e9
56ae9b
     #2 [ffff8c16231a3e50] nfs41_callback_svc at ffffffffc099537d [nfsv4]
56ae9b
     #3 [ffff8c16231a3ec8] kthread at ffffffff8e6b966f
56ae9b
     #4 [ffff8c16231a3f50] ret_from_fork at ffffffff8ed07898
56ae9b
56ae9b
This patch fix the issue by strstr "\tcall" and " call", to
56ae9b
locate the correct call instruction.
56ae9b
56ae9b
[1]: https://listman.redhat.com/archives/crash-utility/2022-August/010085.html
56ae9b
56ae9b
Signed-off-by: Tao Liu <ltao@redhat.com>
56ae9b
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
56ae9b
---
56ae9b
 x86_64.c | 3 +--
56ae9b
 1 file changed, 1 insertion(+), 2 deletions(-)
56ae9b
56ae9b
diff --git a/x86_64.c b/x86_64.c
56ae9b
index b2a536e4b19c..292c240e887e 100644
56ae9b
--- a/x86_64.c
56ae9b
+++ b/x86_64.c
56ae9b
@@ -4429,8 +4429,7 @@ x86_64_function_called_by(ulong rip)
56ae9b
 	if (gdb_pass_through(buf, pc->tmpfile2, GNU_RETURN_ON_ERROR)) {
56ae9b
 	        rewind(pc->tmpfile2);
56ae9b
 	        while (fgets(buf, BUFSIZE, pc->tmpfile2)) {
56ae9b
-			if ((p1 = strstr(buf, "callq")) &&
56ae9b
-			    whitespace(*(p1-1))) { 
56ae9b
+			if ((p1 = strstr(buf, " callq")) || (p1 = strstr(buf, "\tcallq"))) {
56ae9b
 				if (extract_hex(p1, &value, NULLCHAR, TRUE)) 
56ae9b
 					break;
56ae9b
 			}
56ae9b
-- 
56ae9b
2.37.1
56ae9b