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 | |
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')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/gdbserver/configure.srv | 11 | ||||
-rw-r--r-- | gdb/gdbserver/linux-ppc-low.c | 81 |
3 files changed, 75 insertions, 28 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 84df67f93b8..a59668cc644 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,16 @@ 2008-02-28 Ulrich Weigand <uweigand@de.ibm.com> + * 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. + +2008-02-28 Ulrich Weigand <uweigand@de.ibm.com> + * configure.srv [powerpc64-*-linux*]: Use linux-ppc-low.o instead of linux-ppc64-low.o. * linux-ppc64-low.c: Remove file. diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index 543533343fe..c5e555298f6 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -106,12 +106,17 @@ case "${target}" in srv_linux_usrregs=yes srv_linux_thread_db=yes ;; - powerpc64-*-linux*) srv_regobj="reg-ppc64.o powerpc-64.o" + powerpc64-*-linux*) srv_regobj="reg-ppc.o powerpc-32.o powerpc-e500.o" + srv_regobj="${srv_regobj} reg-ppc64.o powerpc-64.o" srv_tgtobj="linux-low.o linux-ppc-low.o" - srv_xmlfiles="rs6000/powerpc-64.xml" + srv_xmlfiles="rs6000/powerpc-32.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml" + srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu.xml" + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500.xml" + srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml" + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64.xml" + srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml" srv_linux_usrregs=yes srv_linux_regsets=yes srv_linux_thread_db=yes 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, |