[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] target-openrisc: Fix exception handling status
From: |
Stafford Horne |
Subject: |
Re: [Qemu-devel] [PATCH] target-openrisc: Fix exception handling status registers |
Date: |
Wed, 8 Feb 2017 23:01:20 +0900 |
User-agent: |
Mutt/1.7.1 (2016-10-04) |
On Mon, Feb 06, 2017 at 09:53:26PM -0800, Richard Henderson wrote:
> On 02/01/2017 02:04 AM, Stafford Horne wrote:
> > For kernel builds I have created toolchain binaries here:
> >
> > http://shorne.noip.me/crosstool/files/bin/x86_64/5.4.0/
> >
> > These should work.
>
> This gdb crashes on the first "stepi" that I issue. To reproduce,
>
> $ cat z.c
> int main() { return 0; }
> $ or1k-musl-linux-gcc -g z.c
> $ qemu-or32 -g 10001 ./a.out
>
> // another window
>
> $ or1k-musl-linux-gdb ./a.out
> (gdb) target remote localhost:10001
> // should see that the pc is at _start
> (gdb) stepi
> // crash
>
> I won't be able to debug this myself until I can build my own gdb.
Hello,
The gdb branch I use is the following, it is tracking very close to
upsstream:
address@hidden:stffrdhrn/binutils-gdb.git or1k-upstream
I have sent this for review to the gdb list and currently waiting on
comments for version 4. Most of the code is the same as in openrisc
github. However, I have just rebased and cleaned up for upstreaming.
Note, I can get basic programs running fine on your qemu branch using
linux-user i.e.
$ cat main.c
#include <stdio.h>
int main() {
printf("hello");
return 0;
}
$ or1k-linux-musl-gcc -g -static main.c
$ ./qemu/build/or32-linux-user/qemu-or32 ./a.out
hello
However, when debugging I ran into a few errors.
1. qemu aborts the program and sends SIGILL to gdb, this is caused by
the openrisc loop in linux-user missing handlers for EXCP_INTERRUPT
and EXCP_DEBUG, I patched that see below:
2. After patching I got 1 step to work then gdb crashes with SIGSEGV
Currently looking at it, Interestingly the code that is failing is
in gdb/or1k-tdep.c: or1k_single_step_through_delay()
cgen_lookup_insn() - returns NULL (shouldnt happen though)
then NULL is dereferenced
Interesting because it seems you wrote cgen_lookup_insn :)
I am investigating more, but it seems like gdb issue.
Notes on the debugger:
- The support for linux user processes is not implemented. Eventually
I think it will crash somewhere. But it shouldnt crash where it is.
- I tested the same program with the baremetal (newlib) toolchain
* gdb native sim - OK can debug
* or1ksim (via target remote) - Crashes same as QEMU
-Stafford
Patch for qemu issue mentioned in (1) above.
>From 777bd1c6641ea919799579dfbc99db4338db11bf Mon Sep 17 00:00:00 2001
From: Stafford Horne <address@hidden>
Date: Wed, 8 Feb 2017 22:20:01 +0900
Subject: [PATCH] linux-user: openrisc: Implement EXCP_INTERRUPT and EXCP_DEBUG
These were not implemented. They are required escpecially if we
want to debug user processes in openrisc.
Signed-off-by: Stafford Horne <address@hidden>
---
linux-user/main.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/linux-user/main.c b/linux-user/main.c
index 94a636f..1c33378 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -2468,6 +2468,7 @@ void cpu_loop(CPUOpenRISCState *env)
{
CPUState *cs = CPU(openrisc_env_get_cpu(env));
int trapnr, gdbsig;
+ target_siginfo_t info;
abi_long ret;
for (;;) {
@@ -2542,6 +2543,23 @@ void cpu_loop(CPUOpenRISCState *env)
case EXCP_ATOMIC:
cpu_exec_step_atomic(cs);
break;
+ case EXCP_INTERRUPT:
+ /* just indicate that signals should be handled asap */
+ break;
+ case EXCP_DEBUG:
+ {
+ int sig;
+
+ sig = gdb_handlesig(cs, TARGET_SIGTRAP);
+ if (sig)
+ {
+ info.si_signo = sig;
+ info.si_errno = 0;
+ info.si_code = TARGET_TRAP_BRKPT;
+ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
+ }
+ }
+ break;
default:
EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x - aborting\n",
trapnr);
--
2.9.3