From: David Mosberger <davidm@napali.hpl.hp.com>
To: Kevin Buettner <kevinb@redhat.com>,
jjohnstn@redhat.com, ac131313@redhat.com, bjorn_helgaas@hp.com
Cc: gdb-patches@sources.redhat.com, davidm@hpl.hp.com,
linux-ia64@vger.kernel.org
Subject: make inferior calls work on ia64 even when syscall is pending
Date: Wed, 31 Dec 2003 20:19:00 -0000 [thread overview]
Message-ID: <16371.12104.503371.251351@napali.hpl.hp.com> (raw)
In-Reply-To: <1031213040137.ZM23568@localhost.localdomain>
Problem:
$ cat t.c
int main () {
char ch;
return read(0, &ch, 1);
}
$ gcc -g t.c
$ gdb a.out
GNU gdb 6.0-debian
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "ia64-linux"...
(gdb) r
Starting program: /home/davidm/tmp/a.out
[user hits Ctrl-C]
Program received signal SIGINT, Interrupt.
0x20000000001cc401 in read () from /lib/tls/libc.so.6.1
(gdb) call write(1, "hello\n", 6)
Program received signal SIGSEGV, Segmentation fault.
0x2000000000020650 in __libc_memalign () from /lib/ld-linux-ia64.so.2
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (malloc) will be abandoned.
(gdb)
The attached patch below fixes this problem. It took me a while to
understand what's going on, but in retrospect, the situation is
completely analogous to x86 linux: when interrupting execution in a
restartable syscall, gdb needs to cancel restarting of the syscall
before it can run an inferior call. Otherwise, instead of executing
at the desired IP, we'll end up calling IP-1 (in my test-case, this
ended up calling into the tail of memalign, when the intended target
was malloc() to allocate memory for the string "hello\n"...).
The fix is for gdb to clear r10 when changing the IP. This will
ensure that the kernel won't treat the value in r8 as an error-code
and effectively cancels the system-call restart.
It turns out that the kernel also needs a small patch, because it
currently checks r10 _before_ waking up the debugger, so that there
was no way for the debugger to cancel system-call restart. See this
patch:
http://lia64.bkbits.net:8080/to-linus-2.5/patch@1.1513
(Bjorn, this is also needed for Linux v2.4.)
With both the kernel and gdb fixed, I see four new passes in the
GDB test-suite:
+PASS: gdb.base/interrupt.exp: call function when asleep
+PASS: gdb.base/interrupt.exp: call function a second time
+PASS: gdb.base/interrupt.exp: continue
+PASS: gdb.base/interrupt.exp: send end of file
=== gdb Summary ===
-# of expected passes 9928
+# of expected passes 9932
# of unexpected failures 119
# of unexpected successes 4
# of expected failures 58
If the gdb patch looks OK, please check it in.
Thanks!
--david
2003-12-31 David Mosberger <davidm@hpl.hp.com>
* ia64-tdep.c (ia64_write_pc): Clear r10 after writing the
instruction-pointer (PC) to prevent the kernel from attempting to
restart an interrupt system call.
Index: ia64-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ia64-tdep.c,v
retrieving revision 1.106
diff -u -r1.106 ia64-tdep.c
--- ia64-tdep.c 13 Dec 2003 03:51:56 -0000 1.106
+++ ia64-tdep.c 31 Dec 2003 19:49:49 -0000
@@ -683,6 +683,17 @@
write_register_pid (IA64_PSR_REGNUM, psr_value, ptid);
write_register_pid (IA64_IP_REGNUM, new_pc, ptid);
+
+ /* We must be careful with modifying the instruction-pointer: if we
+ just interrupt a system call, the kernel would ordinarily try to
+ restart it when we resume the inferior, which typically results
+ in SIGSEGV or SIGILL. We prevent this by clearing r10, which
+ will tell the kernel that r8 does NOT contain a valid error code
+ and hence it will skip system-call restart.
+
+ The clearing of r10 is safe as long as ia64_write_pc() is only
+ called as part of setting up an inferior call. */
+ write_register (IA64_GR10_REGNUM, 0);
}
#define IS_NaT_COLLECTION_ADDR(addr) ((((addr) >> 3) & 0x3f) == 0x3f)
next prev parent reply other threads:[~2003-12-31 20:19 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-10-31 19:25 RFA: ia64 portion of libunwind patch J. Johnston
2003-10-31 20:46 ` Andrew Cagney
2003-10-31 22:55 ` David Mosberger
2003-11-07 21:47 ` Andrew Cagney
2003-11-07 22:43 ` David Mosberger
2003-11-07 23:01 ` Andrew Cagney
2003-11-07 23:12 ` David Mosberger
2003-11-07 23:38 ` Andrew Cagney
2003-11-07 23:55 ` David Mosberger
2003-11-08 0:07 ` Andrew Cagney
2003-11-08 0:13 ` Kevin Buettner
2003-11-08 0:27 ` Andrew Cagney
2003-11-08 7:21 ` David Mosberger
2003-11-09 0:13 ` Andrew Cagney
2003-11-10 22:10 ` David Mosberger
2003-11-10 22:43 ` Andrew Cagney
2003-11-10 23:01 ` David Mosberger
2003-11-26 0:11 ` David Mosberger
2003-12-04 2:15 ` David Mosberger
2003-12-04 3:15 ` Kevin Buettner
2003-12-04 23:57 ` J. Johnston
2003-12-05 0:39 ` David Mosberger
2003-12-10 20:58 ` J. Johnston
2003-12-10 22:15 ` David Mosberger
2003-12-12 22:25 ` Kevin Buettner
[not found] ` <davidm@napali.hpl.hp.com>
2003-12-13 4:01 ` Kevin Buettner
2003-12-31 20:19 ` David Mosberger [this message]
2003-12-31 23:37 ` make inferior calls work on ia64 even when syscall is pending Mark Kettenis
2004-01-01 2:43 ` David Mosberger
2004-02-13 1:14 ` David Mosberger
2004-02-13 15:00 ` Mark Kettenis
2004-02-13 15:09 ` Andrew Cagney
2004-02-13 15:12 ` Andrew Cagney
2004-02-13 22:07 ` David Mosberger
2004-02-17 16:21 ` Andrew Cagney
2004-02-23 19:58 ` Kevin Buettner
2004-02-23 21:15 ` Kevin Buettner
2003-11-09 1:34 ` RFA: ia64 portion of libunwind patch Marcel Moolenaar
2003-11-10 21:54 ` David Mosberger
2003-11-10 23:18 ` Marcel Moolenaar
2003-10-31 21:36 ` Marcel Moolenaar
2003-10-31 23:00 ` David Mosberger
2003-10-31 23:42 ` Andrew Cagney
2003-10-31 23:59 ` David Mosberger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=16371.12104.503371.251351@napali.hpl.hp.com \
--to=davidm@napali.hpl.hp.com \
--cc=ac131313@redhat.com \
--cc=bjorn_helgaas@hp.com \
--cc=davidm@hpl.hp.com \
--cc=gdb-patches@sources.redhat.com \
--cc=jjohnstn@redhat.com \
--cc=kevinb@redhat.com \
--cc=linux-ia64@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox