From 8dc2b43563c5162a4f0275ff11a4128267830357 Mon Sep 17 00:00:00 2001 From: Dave Lambley Date: Tue, 31 Oct 2023 19:22:52 +0000 Subject: [PATCH] Debug on SWI support --- src/armul/arm.c | 1 + src/armul/rsp-server.c | 19 ++++++++++++++++++- src/armul/rsp-server.h | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/armul/arm.c b/src/armul/arm.c index 5464c04..3e79d80 100644 --- a/src/armul/arm.c +++ b/src/armul/arm.c @@ -176,6 +176,7 @@ ARMul_OSHandleSWI(ARMul_State *state, ARMword number) abort(); } else { + rsp_check_swi(number); swi_trap(number); } return 1; /* tells ARMulator not to try OS SWI trap */ diff --git a/src/armul/rsp-server.c b/src/armul/rsp-server.c index e6e85c0..08a6c44 100644 --- a/src/armul/rsp-server.c +++ b/src/armul/rsp-server.c @@ -45,6 +45,7 @@ #include #include #include +#include /* Define to log each packet */ #define RSP_TRACE 0 @@ -121,6 +122,7 @@ static struct int client_fd; /*!< FD for talking to GDB */ int sigval; /*!< GDB signal for any exception */ struct mp_entry *mp_hash[MP_HASH_SIZE]; /*!< Matchpoint hash table */ + bool catch_syscalls; } rsp; /* Forward declarations of static functions */ @@ -206,6 +208,7 @@ rsp_init () rsp.stalled = 0; rsp.client_fd = -1; /* i.e. invalid */ rsp.sigval = 0; /* No exception */ + rsp.catch_syscalls = false; /* Set up the matchpoint hash table */ mp_hash_init (); @@ -1640,7 +1643,7 @@ rsp_query (struct rsp_buf *buf) char reply[GDB_BUF_MAX]; - sprintf (reply, "PacketSize=%x;xmlRegisters=arm;swbreak-;hwbreak+;qXfer:features:read+;qXfer:auxv:read+;qHostInfo:+;vContSupported+", GDB_BUF_MAX); + sprintf (reply, "PacketSize=%x;xmlRegisters=arm;swbreak-;hwbreak+;qXfer:features:read+;qXfer:auxv:read+;qHostInfo:+;vContSupported+;QCatchSyscalls+", GDB_BUF_MAX); put_str_packet (reply); } else if (0 == strncmp ("qSymbol:", buf->data, strlen ("qSymbol:"))) @@ -1719,6 +1722,12 @@ rsp_query (struct rsp_buf *buf) put_str_packet (""); } } + else if (strcmp(buf->data, "QCatchSyscalls:1") == 0) { + rsp.catch_syscalls = true; + } + else if (strcmp(buf->data, "QCatchSyscalls:0") == 0) { + rsp.catch_syscalls = false; + } else { fprintf (stderr, "Unrecognized RSP query '%s': ignored\n", buf->data); @@ -2096,6 +2105,14 @@ extern void rsp_check_instruction ( ARMword pc ) { } } +extern void rsp_check_swi ( ARMword number ) { + if (rsp.catch_syscalls) { + rsp.sigval = TARGET_SIGNAL_TRAP; + handle_rsp(); + } +} + + extern void rsp_check_memory_read( ARMword addr ) { int m = mp_hash_lookup( WP_READ, addr ) || mp_hash_lookup( WP_ACCESS, addr ); diff --git a/src/armul/rsp-server.h b/src/armul/rsp-server.h index bed659e..9449f3f 100644 --- a/src/armul/rsp-server.h +++ b/src/armul/rsp-server.h @@ -33,6 +33,7 @@ extern void handle_rsp (); extern void rsp_exception (unsigned long int except); extern void rsp_check_instruction ( ARMword pc ); +extern void rsp_check_swi ( ARMword nuber ); extern void rsp_check_memory_read( ARMword addr ); extern void rsp_check_memory_write( ARMword addr ); -- 2.11.4.GIT