From 6f69e520676f5f434cf43c250865036b3d516429 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Mon, 18 Jan 2016 15:03:18 +0000 Subject: [PATCH] Replace some $ARCH_{get,set}_pc with linux_{get,set}_pc_64bit This patch is the follow-up of https://sourceware.org/ml/gdb-patches/2016-01/msg00164.html to provide linux_{get,set}_pc_64bit functions. Rebuild GDBserver with tilegx-linux-gcc. Not tested. I think about pc in Tile-GX a little bit. Looks current Tile-GX supports debugging 32-bit program (multi-arch), but PC is always 64-bit. See this thread https://sourceware.org/ml/gdb-patches/2013-02/msg00113.html and GDBserver reads PC as 64-bit through ptrace. However, if the inferior is 32-bit, the PC in the target description and regcache is 32-bit, so only 32-bit contents are sent back GDB. Anyway, Tile-GX GDBserver may have some problems here, but this patch doesn't change anything. gdb/gdbserver: 2016-01-18 Yao Qi * linux-low.c (linux_set_pc_64bit): New function. (linux_get_pc_64bit): New function. * linux-low.h (linux_set_pc_64bit, linux_get_pc_64bit): Declare. * linux-sparc-low.c (debug_threads): Remove declaration. (sparc_get_pc): Remove. (the_low_target): Use linux_get_pc_64bit instead of sparc_get_pc. * linux-tile-low.c (tile_get_pc, tile_set_pc): Remove. (the_low_target): Use linux_get_pc_64bit and linux_set_pc_64bit. --- gdb/gdbserver/ChangeLog | 14 ++++++++++++++ gdb/gdbserver/linux-low.c | 26 ++++++++++++++++++++++++++ gdb/gdbserver/linux-low.h | 3 +++ gdb/gdbserver/linux-sparc-low.c | 14 +------------- gdb/gdbserver/linux-tile-low.c | 21 ++------------------- 5 files changed, 46 insertions(+), 32 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 9dc7c2f..4eb92db 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,19 @@ 2016-01-18 Yao Qi + * linux-low.c (linux_set_pc_64bit): New function. + (linux_get_pc_64bit): New function. + * linux-low.h (linux_set_pc_64bit, linux_get_pc_64bit): + Declare. + * linux-sparc-low.c (debug_threads): Remove declaration. + (sparc_get_pc): Remove. + (the_low_target): Use linux_get_pc_64bit instead of + sparc_get_pc. + * linux-tile-low.c (tile_get_pc, tile_set_pc): Remove. + (the_low_target): Use linux_get_pc_64bit and + linux_set_pc_64bit. + +2016-01-18 Yao Qi + * linux-arm-low.c (debug_threads): Remove declaration. (arm_get_pc, arm_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 8f5ab0b..1f3fc08 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -7283,6 +7283,32 @@ linux_get_pc_32bit (struct regcache *regcache) return pc; } +/* Default implementation of linux_target_ops method "set_pc" for + 64-bit pc register which is literally named "pc". */ + +void +linux_set_pc_64bit (struct regcache *regcache, CORE_ADDR pc) +{ + uint64_t newpc = pc; + + supply_register_by_name (regcache, "pc", &newpc); +} + +/* Default implementation of linux_target_ops method "get_pc" for + 64-bit pc register which is literally named "pc". */ + +CORE_ADDR +linux_get_pc_64bit (struct regcache *regcache) +{ + uint64_t pc; + + collect_register_by_name (regcache, "pc", &pc); + if (debug_threads) + debug_printf ("stop pc is 0x%" PRIx64 "\n", pc); + return pc; +} + + static struct target_ops linux_target_ops = { linux_create_inferior, linux_post_create_inferior, diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h index 98a331d..4845862 100644 --- a/gdb/gdbserver/linux-low.h +++ b/gdb/gdbserver/linux-low.h @@ -395,6 +395,9 @@ void initialize_low_arch (void); void linux_set_pc_32bit (struct regcache *regcache, CORE_ADDR pc); CORE_ADDR linux_get_pc_32bit (struct regcache *regcache); +void linux_set_pc_64bit (struct regcache *regcache, CORE_ADDR pc); +CORE_ADDR linux_get_pc_64bit (struct regcache *regcache); + /* From thread-db.c */ int thread_db_init (void); void thread_db_detach (struct process_info *); diff --git a/gdb/gdbserver/linux-sparc-low.c b/gdb/gdbserver/linux-sparc-low.c index 1e82ec5..70c5c93 100644 --- a/gdb/gdbserver/linux-sparc-low.c +++ b/gdb/gdbserver/linux-sparc-low.c @@ -223,18 +223,6 @@ sparc_store_fpregset (struct regcache *regcache, const void *buf) supply_register (regcache, i, ((char *) buf) + sparc_regmap[i]); } -extern int debug_threads; - -static CORE_ADDR -sparc_get_pc (struct regcache *regcache) -{ - unsigned long pc; - collect_register_by_name (regcache, "pc", &pc); - if (debug_threads) - debug_printf ("stop pc is %08lx\n", pc); - return pc; -} - static const gdb_byte sparc_breakpoint[INSN_SIZE] = { 0x91, 0xd0, 0x20, 0x01 }; @@ -315,7 +303,7 @@ struct linux_target_ops the_low_target = { sparc_cannot_fetch_register, sparc_cannot_store_register, NULL, /* fetch_register */ - sparc_get_pc, + linux_get_pc_64bit, /* No sparc_set_pc is needed. */ NULL, NULL, /* breakpoint_kind_from_pc */ diff --git a/gdb/gdbserver/linux-tile-low.c b/gdb/gdbserver/linux-tile-low.c index aaaa5c7..45d63d6 100644 --- a/gdb/gdbserver/linux-tile-low.c +++ b/gdb/gdbserver/linux-tile-low.c @@ -68,23 +68,6 @@ tile_cannot_store_register (int regno) return 1; } -static CORE_ADDR -tile_get_pc (struct regcache *regcache) -{ - unsigned long pc; - - collect_register_by_name (regcache, "pc", &pc); - return pc; -} - -static void -tile_set_pc (struct regcache *regcache, CORE_ADDR pc) -{ - unsigned long newpc = pc; - - supply_register_by_name (regcache, "pc", &newpc); -} - static uint64_t tile_breakpoint = 0x400b3cae70166000ULL; #define tile_breakpoint_len 8 @@ -197,8 +180,8 @@ struct linux_target_ops the_low_target = tile_cannot_fetch_register, tile_cannot_store_register, NULL, - tile_get_pc, - tile_set_pc, + linux_get_pc_64bit, + linux_set_pc_64bit, NULL, /* breakpoint_kind_from_pc */ tile_sw_breakpoint_from_kind, NULL, -- 2.7.4