summaryrefslogtreecommitdiff
path: root/gdb/gdbserver/linux-ppc-low.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2008-02-28 05:57:45 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2008-02-28 05:57:45 +0000
commitfc3e04f6d8e5738a42791d5328cf62de257a454a (patch)
tree61269e557c9c8210458daa18cd870abd26fd88cd /gdb/gdbserver/linux-ppc-low.c
parent47afaecdf523c9cebf0ec5fd4b5cc45fa4535432 (diff)
downloadgdb-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.c81
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,