diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2008-02-28 05:57:45 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2008-02-28 05:57:45 +0000 |
commit | fc3e04f6d8e5738a42791d5328cf62de257a454a (patch) | |
tree | 61269e557c9c8210458daa18cd870abd26fd88cd /gdb/gdbserver/linux-ppc-low.c | |
parent | 47afaecdf523c9cebf0ec5fd4b5cc45fa4535432 (diff) | |
download | gdb-fc3e04f6d8e5738a42791d5328cf62de257a454a.tar.gz |
ChangeLog:
* regformats/reg-ppc.dat: Rename "ps" to "msr".
* regformats/reg-ppc64.dat: Likewise.
gdbserver/ChangeLog:
* configure.srv [powerpc64-*-linux*]: Add all files mentioned for
powerpc-*-linux* to srv_regobj and reg_xmlfiles.
* linux-ppc-low.c (ppc_get_pc): Support bi-arch operation.
(ppc_set_pc): Likewise.
(ppc_arch_setup): New function.
(ppc_fill_gregset): Call ppc_collect_ptrace_register instead
of collect_register.
(the_low_target): Use ppc_arch_setup as arch_setup initializer.
Diffstat (limited to 'gdb/gdbserver/linux-ppc-low.c')
-rw-r--r-- | gdb/gdbserver/linux-ppc-low.c | 81 |
1 files changed, 56 insertions, 25 deletions
diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c index a1ade344336..8eb6b1f6ab7 100644 --- a/gdb/gdbserver/linux-ppc-low.c +++ b/gdb/gdbserver/linux-ppc-low.c @@ -138,18 +138,65 @@ ppc_supply_ptrace_register (int regno, const char *buf) static CORE_ADDR ppc_get_pc (void) { - unsigned long pc; - - collect_register_by_name ("pc", &pc); - return (CORE_ADDR) pc; + if (register_size (0) == 4) + { + unsigned int pc; + collect_register_by_name ("pc", &pc); + return (CORE_ADDR) pc; + } + else + { + unsigned long pc; + collect_register_by_name ("pc", &pc); + return (CORE_ADDR) pc; + } } static void ppc_set_pc (CORE_ADDR pc) { - unsigned long newpc = pc; + if (register_size (0) == 4) + { + unsigned int newpc = pc; + supply_register_by_name ("pc", &newpc); + } + else + { + unsigned long newpc = pc; + supply_register_by_name ("pc", &newpc); + } +} + +static void +ppc_arch_setup (void) +{ +#ifdef __powerpc64__ + long msr; - supply_register_by_name ("pc", &newpc); + /* On a 64-bit host, assume 64-bit inferior process. */ +#ifdef __ALTIVEC__ + init_registers_powerpc_64 (); +#else + init_registers_ppc64 (); +#endif + + /* Only if the high bit of the MSR is set, we actually have + a 64-bit inferior. */ + collect_register_by_name ("msr", &msr); + if (msr < 0) + return; +#endif + + /* OK, we have a 32-bit inferior. */ +#ifdef __ALTIVEC__ + init_registers_powerpc_32 (); +#else +#ifdef __SPE__ + init_registers_powerpc_e500 (); +#else + init_registers_ppc (); +#endif +#endif } /* Correct in either endianness. @@ -179,10 +226,10 @@ static void ppc_fill_gregset (void *buf) int i; for (i = 0; i < 32; i++) - collect_register (i, (char *) buf + ppc_regmap[i]); + ppc_collect_ptrace_register (i, (char *) buf + ppc_regmap[i]); for (i = 64; i < 70; i++) - collect_register (i, (char *) buf + ppc_regmap[i]); + ppc_collect_ptrace_register (i, (char *) buf + ppc_regmap[i]); } #ifdef __ALTIVEC__ @@ -285,23 +332,7 @@ struct regset_info target_regsets[] = { }; struct linux_target_ops the_low_target = { -#ifdef __powerpc64__ -#ifdef __ALTIVEC__ - init_registers_powerpc_64, -#else - init_registers_ppc64, -#endif -#else -#ifdef __ALTIVEC__ - init_registers_powerpc_32, -#else -#ifdef __SPE__ - init_registers_powerpc_e500, -#else - init_registers_ppc, -#endif -#endif -#endif + ppc_arch_setup, ppc_num_regs, ppc_regmap, ppc_cannot_fetch_register, |