+2007-10-15 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * features/Makefile (WHICH): Add PowerPC register definitions.
+ (rs6000/powerpc-32-expedite, rs6000/powerpc-e500-expedite)
+ (rs6000/powerpc-64-expedite): New macros.
+ ($(outdir)/%.dat): Handle subdirectories.
+ * regformats/rs6000/powerpc-32.dat, regformats/rs6000/powerpc-64.dat,
+ regformats/rs6000/powerpc-e500.dat: New generated files.
+
2007-10-15 Daniel Jacobowitz <dan@codesourcery.com>
* ppc-linux-nat.c (ppc_linux_read_description): New.
# in the GDB repository. To generate C files:
# make GDB=/path/to/gdb XMLTOC="xml files" cfiles
-WHICH = arm-with-iwmmxt mips-linux mips64-linux
+WHICH = arm-with-iwmmxt mips-linux mips64-linux \
+ rs6000/powerpc-32 rs6000/powerpc-e500 rs6000/powerpc-64
# Record which registers should be sent to GDB by default after stop.
arm-with-iwmmxt-expedite = r11,sp,pc
mips-linux-expedite = r29,pc
mips64-linux-expedite = r29,pc
+rs6000/powerpc-32-expedite = r1,pc
+rs6000/powerpc-e500-expedite = r1,pc
+rs6000/powerpc-64-expedite = r1,pc
XSLTPROC = xsltproc
outdir = ../regformats
$(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
echo "# DO NOT EDIT: generated from $<" > $(outdir)/$*.tmp
- echo "name:`echo $* | sed 's/-/_/g'`" >> $(outdir)/$*.tmp
+ echo "name:`echo $(notdir $*) | sed 's/-/_/g'`" >> $(outdir)/$*.tmp
echo "expedite:$($*-expedite)" >> $(outdir)/$*.tmp
- $(XSLTPROC) --xinclude number-regs.xsl $< | \
+ $(XSLTPROC) --path "$(PWD)" --xinclude number-regs.xsl $< | \
$(XSLTPROC) sort-regs.xsl - | \
$(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp
sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat
+2007-10-15 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * Makefile.in (clean): Remove new files.
+ (powerpc-32.o, powerpc-32.c, powerpc-e500.o, powerpc-e500.c)
+ (powerpc-64.o, powerpc-64.c): New rules.
+ * configure.srv: Use alternate register sets for powerpc64-*-linux*
+ with AltiVec, powerpc-*-linux* with AltiVec, and powerpc-*-linux*
+ with SPE.
+ * linux-ppc-low.c (ppc_regmap): Do not fetch the FP registers for
+ SPE targets.
+ (ppc_cannot_store_register): Do not check for FPSCR for SPE targets.
+ (PTRACE_GETVRREGS, PTRACE_SETVRREGS, SIZEOF_VRREGS, ppc_fill_vrregset)
+ (ppc_store_vrregset, PTRACE_GETEVRREGS, PTRACE_SETEVRREGS)
+ (struct gdb_evrregset_t, ppc_fill_evrregset, ppc_store_evrregset): New.
+ (target_regsets): Add AltiVec and SPE register sets.
+ * configure.ac: Check for AltiVec and SPE.
+ * linux-ppc64-low.c (PTRACE_GETVRREGS, PTRACE_SETVRREGS, SIZEOF_VRREGS)
+ (ppc_fill_vrregset, ppc_store_vrregset): New.
+ (target_regsets): Add AltiVec register set.
+ * configure: Regenerated.
+
2007-09-19 Daniel Jacobowitz <dan@codesourcery.com>
* linux-low.c (O_LARGEFILE): Define.
rm -f reg-ppc.c reg-sh.c reg-spu.c reg-x86-64.c reg-i386-linux.c
rm -f reg-cris.c reg-crisv32.c reg-x86-64-linux.c
rm -f arm-with-iwmmxt.c mips-linux.c mips64-linux.c
+ rm -f powerpc-32.c powerpc-64.c powerpc-e500.c
rm -f xml-builtin.c stamp-xml target.xml
maintainer-clean realclean distclean: clean
reg-ppc64.o : reg-ppc64.c $(regdef_h)
reg-ppc64.c : $(srcdir)/../regformats/reg-ppc64.dat $(regdat_sh)
sh $(regdat_sh) $(srcdir)/../regformats/reg-ppc64.dat reg-ppc64.c
+powerpc-32.o : powerpc-32.c $(regdef_h)
+powerpc-32.c : $(srcdir)/../regformats/rs6000/powerpc-32.dat $(regdat_sh)
+ sh $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-32.dat powerpc-32.c
+powerpc-e500.o : powerpc-e500.c $(regdef_h)
+powerpc-e500.c : $(srcdir)/../regformats/rs6000/powerpc-e500.dat $(regdat_sh)
+ sh $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-e500.dat powerpc-e500.c
+powerpc-64.o : powerpc-64.c $(regdef_h)
+powerpc-64.c : $(srcdir)/../regformats/rs6000/powerpc-64.dat $(regdat_sh)
+ sh $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-64.dat powerpc-64.c
reg-s390.o : reg-s390.c $(regdef_h)
reg-s390.c : $(srcdir)/../regformats/reg-s390.dat $(regdat_sh)
sh $(regdat_sh) $(srcdir)/../regformats/reg-s390.dat reg-s390.c
echo "$as_me:$LINENO: result: $gdb_cv_arm_iwmmxt" >&5
echo "${ECHO_T}$gdb_cv_arm_iwmmxt" >&6
;;
+ powerpc*-*-*)
+ echo "$as_me:$LINENO: checking if Altivec is selected" >&5
+echo $ECHO_N "checking if Altivec is selected... $ECHO_C" >&6
+if test "${gdb_cv_ppc_altivec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $CFLAGS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef __ALTIVEC__
+got it
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "got it" >/dev/null 2>&1; then
+ gdb_cv_ppc_altivec=yes
+else
+ gdb_cv_ppc_altivec=no
+fi
+rm -f conftest*
+
+ CPPFLAGS="$save_CPPFLAGS"
+fi
+echo "$as_me:$LINENO: result: $gdb_cv_ppc_altivec" >&5
+echo "${ECHO_T}$gdb_cv_ppc_altivec" >&6
+ echo "$as_me:$LINENO: checking if SPE is selected" >&5
+echo $ECHO_N "checking if SPE is selected... $ECHO_C" >&6
+if test "${gdb_cv_ppc_spe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $CFLAGS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef __SPE__
+got it
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "got it" >/dev/null 2>&1; then
+ gdb_cv_ppc_spe=yes
+else
+ gdb_cv_ppc_spe=no
+fi
+rm -f conftest*
+
+ CPPFLAGS="$save_CPPFLAGS"
+fi
+echo "$as_me:$LINENO: result: $gdb_cv_ppc_spe" >&5
+echo "${ECHO_T}$gdb_cv_ppc_spe" >&6
+ ;;
esac
. ${srcdir}/configure.srv
[gdb_cv_arm_iwmmxt=no])
CPPFLAGS="$save_CPPFLAGS"])
;;
+ powerpc*-*-*)
+ AC_CACHE_CHECK([if Altivec is selected], [gdb_cv_ppc_altivec],
+ [save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $CFLAGS"
+ AC_EGREP_CPP([got it], [
+#ifdef __ALTIVEC__
+got it
+#endif
+ ], [gdb_cv_ppc_altivec=yes],
+ [gdb_cv_ppc_altivec=no])
+ CPPFLAGS="$save_CPPFLAGS"])
+ AC_CACHE_CHECK([if SPE is selected], [gdb_cv_ppc_spe],
+ [save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $CFLAGS"
+ AC_EGREP_CPP([got it], [
+#ifdef __SPE__
+got it
+#endif
+ ], [gdb_cv_ppc_spe=yes],
+ [gdb_cv_ppc_spe=no])
+ CPPFLAGS="$save_CPPFLAGS"])
+ ;;
esac
. ${srcdir}/configure.srv
srv_linux_usrregs=yes
srv_linux_thread_db=yes
;;
- powerpc64-*-linux*) srv_regobj=reg-ppc64.o
- srv_tgtobj="linux-low.o linux-ppc64-low.o"
+ powerpc64-*-linux*) srv_tgtobj="linux-low.o linux-ppc64-low.o"
srv_linux_usrregs=yes
srv_linux_regsets=yes
srv_linux_thread_db=yes
+ if test $gdb_cv_ppc_altivec = yes; then
+ srv_regobj=powerpc-64.o
+ srv_xmltarget=rs6000/powerpc-64.xml
+ srv_xmlfiles="rs6000/power-altivec.xml"
+ srv_xmlfiles="$srv_xmlfiles rs6000/power64-core.xml"
+ srv_xmlfiles="$srv_xmlfiles rs6000/power-fpu.xml"
+ else
+ srv_regobj=reg-ppc64.o
+ fi
;;
- powerpc-*-linux*) srv_regobj=reg-ppc.o
- srv_tgtobj="linux-low.o linux-ppc-low.o"
+ powerpc-*-linux*) srv_tgtobj="linux-low.o linux-ppc-low.o"
srv_linux_usrregs=yes
srv_linux_regsets=yes
srv_linux_thread_db=yes
+ if test $gdb_cv_ppc_altivec = yes; then
+ srv_regobj=powerpc-32.o
+ srv_xmltarget=rs6000/powerpc-32.xml
+ srv_xmlfiles="rs6000/power-altivec.xml"
+ srv_xmlfiles="$srv_xmlfiles rs6000/power-core.xml"
+ srv_xmlfiles="$srv_xmlfiles rs6000/power-fpu.xml"
+ elif test $gdb_cv_ppc_spe = yes; then
+ srv_regobj=powerpc-e500.o
+ srv_xmltarget=rs6000/powerpc-e500.xml
+ srv_xmlfiles="rs6000/power-spe.xml"
+ srv_xmlfiles="$srv_xmlfiles rs6000/power-core.xml"
+ else
+ srv_regobj=reg-ppc.o
+ fi
;;
s390-*-linux*) srv_regobj=reg-s390.o
srv_tgtobj="linux-low.o linux-s390-low.o"
PT_R20 * 4, PT_R21 * 4, PT_R22 * 4, PT_R23 * 4,
PT_R24 * 4, PT_R25 * 4, PT_R26 * 4, PT_R27 * 4,
PT_R28 * 4, PT_R29 * 4, PT_R30 * 4, PT_R31 * 4,
+#ifdef __SPE__
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+#else
PT_FPR0*4, PT_FPR0*4 + 8, PT_FPR0*4+16, PT_FPR0*4+24,
PT_FPR0*4+32, PT_FPR0*4+40, PT_FPR0*4+48, PT_FPR0*4+56,
PT_FPR0*4+64, PT_FPR0*4+72, PT_FPR0*4+80, PT_FPR0*4+88,
PT_FPR0*4+160, PT_FPR0*4+168, PT_FPR0*4+176, PT_FPR0*4+184,
PT_FPR0*4+192, PT_FPR0*4+200, PT_FPR0*4+208, PT_FPR0*4+216,
PT_FPR0*4+224, PT_FPR0*4+232, PT_FPR0*4+240, PT_FPR0*4+248,
+#endif
PT_NIP * 4, PT_MSR * 4, PT_CCR * 4, PT_LNK * 4,
- PT_CTR * 4, PT_XER * 4, PT_FPSCR * 4, };
+#ifdef __SPE__
+ PT_CTR * 4, PT_XER * 4, -1
+#else
+ PT_CTR * 4, PT_XER * 4, PT_FPSCR * 4
+#endif
+ };
static int
ppc_cannot_store_register (int regno)
{
+#ifndef __SPE__
/* Some kernels do not allow us to store fpscr. */
if (regno == find_regno ("fpscr"))
return 2;
+#endif
return 0;
}
collect_register (i, (char *) buf + ppc_regmap[i]);
}
+#ifdef __ALTIVEC__
+
+#ifndef PTRACE_GETVRREGS
+#define PTRACE_GETVRREGS 18
+#define PTRACE_SETVRREGS 19
+#endif
+
+#define SIZEOF_VRREGS 33*16+4
+
+static void
+ppc_fill_vrregset (void *buf)
+{
+ int i, base;
+ char *regset = buf;
+
+ base = find_regno ("vr0");
+ for (i = 0; i < 32; i++)
+ collect_register (base + i, ®set[i * 16]);
+
+ collect_register_by_name ("vscr", ®set[32 * 16 + 12]);
+ collect_register_by_name ("vrsave", ®set[33 * 16]);
+}
+
+static void
+ppc_store_vrregset (const void *buf)
+{
+ int i, base;
+ const char *regset = buf;
+
+ base = find_regno ("vr0");
+ for (i = 0; i < 32; i++)
+ supply_register (base + i, ®set[i * 16]);
+
+ supply_register_by_name ("vscr", ®set[32 * 16 + 12]);
+ supply_register_by_name ("vrsave", ®set[33 * 16]);
+}
+
+#endif /* __ALTIVEC__ */
+
+#ifdef __SPE__
+
+#ifndef PTRACE_GETEVRREGS
+#define PTRACE_GETEVRREGS 20
+#define PTRACE_SETEVRREGS 21
+#endif
+
+struct gdb_evrregset_t
+{
+ unsigned long evr[32];
+ unsigned long long acc;
+ unsigned long spefscr;
+};
+
+static void
+ppc_fill_evrregset (void *buf)
+{
+ int i, ev0;
+ struct gdb_evrregset_t *regset = buf;
+
+ ev0 = find_regno ("ev0h");
+ for (i = 0; i < 32; i++)
+ collect_register (ev0 + i, ®set->evr[i]);
+
+ collect_register_by_name ("acc", ®set->acc);
+ collect_register_by_name ("spefscr", ®set->spefscr);
+}
+
+static void
+ppc_store_evrregset (const void *buf)
+{
+ int i, ev0;
+ const struct gdb_evrregset_t *regset = buf;
+
+ ev0 = find_regno ("ev0h");
+ for (i = 0; i < 32; i++)
+ supply_register (ev0 + i, ®set->evr[i]);
+
+ supply_register_by_name ("acc", ®set->acc);
+ supply_register_by_name ("spefscr", ®set->spefscr);
+}
+#endif /* __SPE__ */
+
struct regset_info target_regsets[] = {
+ /* List the extra register sets before GENERAL_REGS. That way we will
+ fetch them every time, but still fall back to PTRACE_PEEKUSER for the
+ general registers. Some kernels support these, but not the newer
+ PPC_PTRACE_GETREGS. */
+#ifdef __ALTIVEC__
+ { PTRACE_GETVRREGS, PTRACE_SETVRREGS, SIZEOF_VRREGS, EXTENDED_REGS,
+ ppc_fill_vrregset, ppc_store_vrregset },
+#endif
+#ifdef __SPE__
+ { PTRACE_GETEVRREGS, PTRACE_SETEVRREGS, 32 * 4 + 8 + 4, EXTENDED_REGS,
+ ppc_fill_evrregset, ppc_store_evrregset },
+#endif
{ 0, 0, 0, GENERAL_REGS, ppc_fill_gregset, NULL },
{ 0, 0, -1, -1, NULL, NULL }
};
collect_register (i, (char *) buf + ppc_regmap[i]);
}
+#ifdef __ALTIVEC__
+
+#ifndef PTRACE_GETVRREGS
+#define PTRACE_GETVRREGS 18
+#define PTRACE_SETVRREGS 19
+#endif
+
+#define SIZEOF_VRREGS 33*16+4
+
+static void
+ppc_fill_vrregset (void *buf)
+{
+ int i, base;
+ char *regset = buf;
+
+ base = find_regno ("vr0");
+ for (i = 0; i < 32; i++)
+ collect_register (base + i, ®set[i * 16]);
+
+ collect_register_by_name ("vscr", ®set[32 * 16 + 12]);
+ collect_register_by_name ("vrsave", ®set[33 * 16]);
+}
+
+static void
+ppc_store_vrregset (const void *buf)
+{
+ int i, base;
+ const char *regset = buf;
+
+ base = find_regno ("vr0");
+ for (i = 0; i < 32; i++)
+ supply_register (base + i, ®set[i * 16]);
+
+ supply_register_by_name ("vscr", ®set[32 * 16 + 12]);
+ supply_register_by_name ("vrsave", ®set[33 * 16]);
+}
+
+#endif /* __ALTIVEC__ */
+
struct regset_info target_regsets[] = {
+ /* List the extra register sets before GENERAL_REGS. That way we will
+ fetch them every time, but still fall back to PTRACE_PEEKUSER for the
+ general registers. Some kernels support these, but not the newer
+ PPC_PTRACE_GETREGS. */
+#ifdef __ALTIVEC__
+ { PTRACE_GETVRREGS, PTRACE_SETVRREGS, SIZEOF_VRREGS, EXTENDED_REGS,
+ ppc_fill_vrregset, ppc_store_vrregset },
+#endif
{ 0, 0, 0, GENERAL_REGS, ppc_fill_gregset, NULL },
{ 0, 0, -1, -1, NULL, NULL }
};
--- /dev/null
+# DO NOT EDIT: generated from rs6000/powerpc-32.xml
+name:powerpc_32
+expedite:r1,pc
+32:r0
+32:r1
+32:r2
+32:r3
+32:r4
+32:r5
+32:r6
+32:r7
+32:r8
+32:r9
+32:r10
+32:r11
+32:r12
+32:r13
+32:r14
+32:r15
+32:r16
+32:r17
+32:r18
+32:r19
+32:r20
+32:r21
+32:r22
+32:r23
+32:r24
+32:r25
+32:r26
+32:r27
+32:r28
+32:r29
+32:r30
+32:r31
+64:f0
+64:f1
+64:f2
+64:f3
+64:f4
+64:f5
+64:f6
+64:f7
+64:f8
+64:f9
+64:f10
+64:f11
+64:f12
+64:f13
+64:f14
+64:f15
+64:f16
+64:f17
+64:f18
+64:f19
+64:f20
+64:f21
+64:f22
+64:f23
+64:f24
+64:f25
+64:f26
+64:f27
+64:f28
+64:f29
+64:f30
+64:f31
+32:pc
+32:msr
+32:cr
+32:lr
+32:ctr
+32:xer
+32:fpscr
+128:vr0
+128:vr1
+128:vr2
+128:vr3
+128:vr4
+128:vr5
+128:vr6
+128:vr7
+128:vr8
+128:vr9
+128:vr10
+128:vr11
+128:vr12
+128:vr13
+128:vr14
+128:vr15
+128:vr16
+128:vr17
+128:vr18
+128:vr19
+128:vr20
+128:vr21
+128:vr22
+128:vr23
+128:vr24
+128:vr25
+128:vr26
+128:vr27
+128:vr28
+128:vr29
+128:vr30
+128:vr31
+32:vscr
+32:vrsave
--- /dev/null
+# DO NOT EDIT: generated from rs6000/powerpc-64.xml
+name:powerpc_64
+expedite:r1,pc
+64:r0
+64:r1
+64:r2
+64:r3
+64:r4
+64:r5
+64:r6
+64:r7
+64:r8
+64:r9
+64:r10
+64:r11
+64:r12
+64:r13
+64:r14
+64:r15
+64:r16
+64:r17
+64:r18
+64:r19
+64:r20
+64:r21
+64:r22
+64:r23
+64:r24
+64:r25
+64:r26
+64:r27
+64:r28
+64:r29
+64:r30
+64:r31
+64:f0
+64:f1
+64:f2
+64:f3
+64:f4
+64:f5
+64:f6
+64:f7
+64:f8
+64:f9
+64:f10
+64:f11
+64:f12
+64:f13
+64:f14
+64:f15
+64:f16
+64:f17
+64:f18
+64:f19
+64:f20
+64:f21
+64:f22
+64:f23
+64:f24
+64:f25
+64:f26
+64:f27
+64:f28
+64:f29
+64:f30
+64:f31
+64:pc
+64:msr
+32:cr
+64:lr
+64:ctr
+32:xer
+32:fpscr
+128:vr0
+128:vr1
+128:vr2
+128:vr3
+128:vr4
+128:vr5
+128:vr6
+128:vr7
+128:vr8
+128:vr9
+128:vr10
+128:vr11
+128:vr12
+128:vr13
+128:vr14
+128:vr15
+128:vr16
+128:vr17
+128:vr18
+128:vr19
+128:vr20
+128:vr21
+128:vr22
+128:vr23
+128:vr24
+128:vr25
+128:vr26
+128:vr27
+128:vr28
+128:vr29
+128:vr30
+128:vr31
+32:vscr
+32:vrsave
--- /dev/null
+# DO NOT EDIT: generated from rs6000/powerpc-e500.xml
+name:powerpc_e500
+expedite:r1,pc
+32:r0
+32:r1
+32:r2
+32:r3
+32:r4
+32:r5
+32:r6
+32:r7
+32:r8
+32:r9
+32:r10
+32:r11
+32:r12
+32:r13
+32:r14
+32:r15
+32:r16
+32:r17
+32:r18
+32:r19
+32:r20
+32:r21
+32:r22
+32:r23
+32:r24
+32:r25
+32:r26
+32:r27
+32:r28
+32:r29
+32:r30
+32:r31
+32:ev0h
+32:ev1h
+32:ev2h
+32:ev3h
+32:ev4h
+32:ev5h
+32:ev6h
+32:ev7h
+32:ev8h
+32:ev9h
+32:ev10h
+32:ev11h
+32:ev12h
+32:ev13h
+32:ev14h
+32:ev15h
+32:ev16h
+32:ev17h
+32:ev18h
+32:ev19h
+32:ev20h
+32:ev21h
+32:ev22h
+32:ev23h
+32:ev24h
+32:ev25h
+32:ev26h
+32:ev27h
+32:ev28h
+32:ev29h
+32:ev30h
+32:ev31h
+32:pc
+32:msr
+32:cr
+32:lr
+32:ctr
+32:xer
+0:
+64:acc
+32:spefscr