If the task is a user program, the sp can be points to anywhere,
because we can modify sp in assembly.
For example:
.globl main
.type main, @function
main:
finit
subq $16, (%rsp)
movq $0, (%rsp)
.loop:
jmp .loop
>From 54c6731785ee6edbe684dc15ece5b56a074f5847 Mon Sep 17 00:00:00 2001
From: Wen Congyang <[email protected]>
Date: Fri, 23 Sep 2011 02:18:21 -0400
Subject: [PATCH] do not check sp if ip points to user space
---
kvmdump.c | 3 +--
netdump.c | 2 +-
x86_64.c | 2 +-
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/kvmdump.c b/kvmdump.c
index 451145b..10160c7 100644
--- a/kvmdump.c
+++ b/kvmdump.c
@@ -438,8 +438,7 @@ get_kvmdump_regs(struct bt_info *bt, ulong *ipp, ulong *spp)
return;
}
- if (!is_kernel_text(ip) &&
- in_user_stack(bt->tc->task, sp))
+ if (!is_kernel_text(ip))
bt->flags |= BT_USER_SPACE;
}
diff --git a/netdump.c b/netdump.c
index 1e9960c..2039342 100644
--- a/netdump.c
+++ b/netdump.c
@@ -2513,7 +2513,7 @@ next_sysrq:
return;
}
- if (!is_kernel_text(ip) && in_user_stack(bt->tc->task, sp)) {
+ if (!is_kernel_text(ip)) {
bt->flags |= BT_USER_SPACE;
*eip = ip;
*esp = sp;
diff --git a/x86_64.c b/x86_64.c
index 7296ec5..51ebf4f 100644
--- a/x86_64.c
+++ b/x86_64.c
@@ -4374,7 +4374,7 @@ skip_stage:
if (ur_rip && ur_rsp) {
*rip = ur_rip;
*rsp = ur_rsp;
- if (!is_kernel_text(ur_rip) && in_user_stack(bt->tc->task, ur_rsp))
+ if (!is_kernel_text(ur_rip))
bt_in->flags |= BT_USER_SPACE;
return;
}
--
1.7.1
--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility