This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[rfa, v3] Fix inferior calls during interrupted system calls on PowerPC


Daniel Jacobowitz wrote:

> I am not terribly concerned about breaking old GDBs.  I think keeping
> new GDB able to connect to old stubs is important, but if there's a
> feature to add that means a new stub requires a new GDB that's usually
> easy to accomodate - host programs are easier to upgrade than target
> programs.  We could switch the default case to use XML-generated
> data files and add these.
>
> I'd like to fix this on SPE too but there's clearly no obligation on
> you to do that; next time we're working through our GDB test results
> here at CodeSourcery we'll encounter the failure and hopefully notice
> and fix it.

It looks like the gdbserver part actually becomes simpler when changing
all variants at the same time: ppc_num_regs can just be increased by 2.

I'm now generating the full set of XML files:

powerpc-32.xml         - 32-bit, no vector registers, no Linux registers
powerpc-altivec32.xml  - 32-bit, AltiVec registers, no Linux registers
powerpc-e500.xml       - 32-bit, SPE registers, no Linux registers
powerpc-64.xml         - 64-bit, no vector registers, no Linux registers
powerpc-altivec64.xml  - 64-bit, AltiVec registers, no Linux registers

powerpc-32l.xml        - 32-bit, no vector registers, Linux registers
powerpc-altivec32l.xml - 32-bit, AltiVec registers, Linux registers
powerpc-e500l.xml      - 32-bit, SPE registers, Linux registers
powerpc-64l.xml        - 64-bit, no vector registers, Linux registers
powerpc-altivec64l.xml - 64-bit, AltiVec registers, Linux registers

As gdbserver only supports Linux targets, I'm only generating regformats
files for the last set of five.  The old reg-ppc.dat and reg-ppc64.dat
are removed.

>Unless there's a need to keep the Linux-specific register feature in
>rs6000-tdep.c, it can go in ppc-linux-tdep.c; see mips-linux-tdep.c's
>handling of the restart register for an example.  Or is it more
>complicated to get the numbering right that way?

I see; this works just fine, and allows to keep support for the Linux
registers fully in ppc-linux-tdep and ppc-linux-nat.  Thanks for the tip!

I've retested the patch below on powerpc-linux and powerpc64-linux, both
natively and using a local gdbserver.  Fixes all interrupt.exp failures.

There are still a couple of questions:

- powerpc-32.xml and powerpc-64.xml used to provide AltiVec registers,
  and now they don't.  To compensate for that, I've switched the generic
  "powerpc" and "powerpc64" targets in rs6000.c:variants back to use
  the new AltiVec target descriptions.

  However, I'm wondering why those were using AltiVec in the first place;
  shouldn't the generic description be compatible with old gdbserver
  implementations (that do not use AltiVec)?

- In the SPE register set for gdbserver, register numbers 71 and 72 were
  already used for "acc" and "spefscr".  As it is much simpler to always
  use the same numbers for "orig_r3" and "trap", I've moved those SPE
  registers to 73 and 74.  I *think* this shouldn't break anything as
  those numbers were only ever used with XML target descriptions ...

- Should we attempt to detect SPE registers in core files?

- I didn't test on SPE or non-AltiVec systems.

- In initial testing I was running into gdbserver crashed in ext-attach.exp,
  because it would continue to use "current_inferior" after detaching, which
  would access already free'd memory.  For some reason, this never showed up
  as a problem before this patch  ...

  I've fixed this by resetting current_inferior in clear_inferiors.


Bye,
Ulrich


ChangeLog:

	* Makefile.in (ppc_linux_tdep_h): New macro.
	(powerpc_32l_c, powerpc_altivec32_c, powerpc_altivec32l_c): Likewise.
	(powerpc_64l_c, powerpc_altivec64_c, powerpc_altivec64l_c): Likewise.
	(powerpc_e500l_c): Likewise.
	(ppc-linux-nat.o): Update dependencies.
	(ppc-linux-tdep.o): Update dependencies.
	(rs6000-tdep.o): Update dependencies.

	* ppc-tdep.h (ppc_linux_memory_remove_breakpoint): Remove.
	(ppc_linux_svr4_fetch_link_map_offsets): Remove.
	(ppc_linux_gregset, ppc_linux_fpregset): Move to ppc-linux-tdep.h
	(ppc_supply_reg, ppc_collect_reg): Add prototypes.
	(tdesc_powerpc_e500): Remove.

	* rs6000.c: Include "features/rs6000/powerpc-altivec32.c"
	and "features/rs6000/powerpc-altivec64.c".
	(ppc_supply_reg, ppc_collect_reg): Make global.
	(variants): Use tdesc_powerpc_32 for "powerpc" and
	tdesc_powerpc_altivec64 for "powerpc64".
	(_initialize_rs6000_tdep): Initialize AltiVec descriptions.

	* ppc-linux-tdep.h: New file.

	* ppc-linux-tdep.c: Include "ppc-linux-tdep.c".
	Include "features/rs6000/powerpc-32l.c".
	Include "features/rs6000/powerpc-altivec32l.c".
	Include "features/rs6000/powerpc-64l.c".
	Include "features/rs6000/powerpc-altivec64l.c".
	Include "features/rs6000/powerpc-e500l.c".
	(ppc_linux_supply_gregset): New function.
	(ppc_linux_collect_gregset): Handle orig_r3 and trap registers.
	(ppc32_linux_gregset): Use ppc_linux_supply_gregset.
	(ppc64_linux_gregset): Likewise.
	(ppc_linux_sigtramp_cache): Handle orig_r3 and trap registers.
	(ppc_linux_trap_reg_p): New function.
	(ppc_linux_write_pc): New function.
	(ppc_linux_core_read_description): New function.
	(ppc_linux_init_abi): Install ppc_linux_write_pc and
	ppc_linux_core_read_description.  Install orig_r3 and trap
	registers if present in the target description.
	(_initialize_ppc_linux_tdep): Initialize Linux target descriptions.

	* ppc-linux-nat.c: Include "ppc-linux-tdep.h".
	(PT_ORIG_R3, PT_TRAP): Define if necessary.
	(ppc_register_u_addr): Handle orig_r3 and trap registers.
	(fetch_ppc_registers): Likewise.
	(store_ppc_registers): Likewise.
	(store_register): Likewise.
	(ppc_linux_read_description): Check whether AltiVec is supported.
	Check whether inferior is 32-bit or 64-bit.  Return the appropriate
	Linux target description.

	* features/Makefile (WHICH): Use rs6000/powerpc-32l and
	rs6000/powerpc-altivec32l instead of rs6000/powerpc-32.
	Use rs6000/powerpc-64l and rs6000/powerpc-altivec64l instead
	of rs6000/powerpc-64.  Use rs6000/powerpc-e500l instead of
	rs6000/powerpc-e500.  Update -expedite variables accordingly.

	* features/rs6000/power-spe.xml: Use regnum 73 for "acc".
	* features/rs6000/powerpc-32.xml: Do not include power-altivec.xml.
	* features/rs6000/powerpc-64.xml: Do not include power-altivec.xml.
	* features/rs6000/powerpc-e500.c: Regenerate.
	* features/rs6000/powerpc-32.c: Regenerate.
	* features/rs6000/powerpc-64.c: Regenerate.

	* features/rs6000/power-linux.xml: New file.
	* features/rs6000/power64-linux.xml: New file.
	* features/rs6000/powerpc-32l.xml: New file.
	* features/rs6000/powerpc-altivec32l.xml: New file.
	* features/rs6000/powerpc-64l.xml: New file.
	* features/rs6000/powerpc-altivec64l.xml: New file.
	* features/rs6000/powerpc-e500l.xml: New file.
	* features/rs6000/powerpc-32l.c: New (generated) file.
	* features/rs6000/powerpc-altivec32l.c: New (generated) file.
	* features/rs6000/powerpc-64l.c: New (generated) file.
	* features/rs6000/powerpc-altivec64l.c: New (generated) file.
	* features/rs6000/powerpc-e500l.xml: New (generated) file.

        * regformats/reg-ppc.dat: Remove.
        * regformats/reg-ppc64.dat: Remove.
        * regformats/rs6000/powerpc-32.dat: Remove.
        * regformats/rs6000/powerpc-64.dat: Remove.
        * regformats/rs6000/powerpc-e500.dat: Remove.
        * regformats/rs6000/powerpc-32l.dat: New (generated) file.
        * regformats/rs6000/powerpc-altivec32l.dat: New (generated) file.
        * regformats/rs6000/powerpc-64l.dat: New (generated) file.
        * regformats/rs6000/powerpc-altivec64l.dat: New (generated) file.
        * regformats/rs6000/powerpc-e500l.dat: New (generated) file.

gdbserver/ChangeLog:

	* configure.srv (powerpc*-*-linux*): Set srv_regobj to
	powerpc-32l.o, powerpc-altivec32l.o, powerpc-e500l.o,
	powerpc-64l.o, and powerpc-altivec64l.o.
	Remove rs6000/powerpc-32.xml, rs6000/powerpc-64.xml, and
	rs6000/powerpc-e500.xml; add rs6000/powerpc-32l.xml,
	rs6000/powerpc-altivec32l.xml, rs6000/powerpc-e500l.xml,
	rs6000/powerpc-64l.xml, rs6000/powerpc-altivec64l.xml,
	rs6000/power-linux.xml, and rs6000/power64-linux.xml
	to srv_xmlfiles.

	* Makefile.in (reg-ppc.o, reg-ppc.c): Remove, replace by ...
	(powerpc-32l.o, powerpc-32l.c): ... these new rules.
	(powerpc-32.o, powerpc-32.c): Remove, replace by ...
	(powerpc-altivec32l.o, powerpc-altivec32l.c): ... these new rules.
	(powerpc-e500.o, powerpc-e500.c): Remove, replace by ...
	(powerpc-e500l.o, powerpc-e500l.c): ... these new rules.
	(reg-ppc64.o, reg-ppc64.c): Remove, replace by ...
	(powerpc-64l.o, powerpc-64l.c): ... these new rules.
	(powerpc-64.o, powerpc-64.c): Remove, replace by ...
	(powerpc-altivec64l.o, powerpc-altivec64l.c): ... these new rules.
	(clean): Update.

	* linux-ppc-low.c (init_registers_ppc): Remove, replace by ...
	(init_registers_powerpc_32l): ... this new prototype.
	(init_registers_powerpc_32): Remove, replace by ...
	(init_registers_powerpc_altivec32l): ... this new prototype.
	(init_registers_powerpc_e500): Remove, replace by ...
	(init_registers_powerpc_e500l): ... this new prototype.
	(init_registers_ppc64): Remove, replace by ...
	(init_registers_powerpc_64l): ... this new prototype.
	(init_registers_powerpc_64): Remove, replace by ...
	(init_registers_powerpc_altivec64l): ... this new prototype.
	(ppc_num_regs): Set to 73.
	(PT_ORIG_R3, PT_TRAP): Define if necessary.
	(ppc_regmap, ppc_regmap_e500): Add values for orig_r3 and trap.
	(ppc_cannot_store_register): Handle orig_r3 and trap.
	(ppc_arch_setup): Update init_registers_... calls.
	(ppc_fill_gregset): Handle orig_r3 and trap.

	* inferiors.c (clear_inferiors): Reset current_inferior.



diff -urNp gdb-orig/gdb/features/Makefile gdb-head/gdb/features/Makefile
--- gdb-orig/gdb/features/Makefile	2008-04-23 00:13:17.000000000 +0200
+++ gdb-head/gdb/features/Makefile	2008-05-03 13:21:36.486342945 +0200
@@ -32,15 +32,18 @@
 #   make GDB=/path/to/gdb XMLTOC="xml files" cfiles
 
 WHICH = arm-with-iwmmxt mips-linux mips64-linux \
-	rs6000/powerpc-32 rs6000/powerpc-e500 rs6000/powerpc-64
+	rs6000/powerpc-32l rs6000/powerpc-altivec32l rs6000/powerpc-e500l \
+	rs6000/powerpc-64l rs6000/powerpc-altivec64l
 
 # 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
+rs6000/powerpc-32l-expedite = r1,pc
+rs6000/powerpc-altivec32l-expedite = r1,pc
+rs6000/powerpc-e500l-expedite = r1,pc
+rs6000/powerpc-64l-expedite = r1,pc
+rs6000/powerpc-altivec64l-expedite = r1,pc
 
 XSLTPROC = xsltproc
 outdir = ../regformats
diff -urNp gdb-orig/gdb/features/rs6000/power64-linux.xml gdb-head/gdb/features/rs6000/power64-linux.xml
--- gdb-orig/gdb/features/rs6000/power64-linux.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/power64-linux.xml	2008-05-03 13:29:04.145866172 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.power.linux">
+  <reg name="orig_r3" bitsize="64" regnum="71"/>
+  <reg name="trap" bitsize="64"/>
+</feature>
diff -urNp gdb-orig/gdb/features/rs6000/power-linux.xml gdb-head/gdb/features/rs6000/power-linux.xml
--- gdb-orig/gdb/features/rs6000/power-linux.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/power-linux.xml	2008-05-03 13:28:41.907742949 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.power.linux">
+  <reg name="orig_r3" bitsize="32" regnum="71"/>
+  <reg name="trap" bitsize="32"/>
+</feature>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-32.c gdb-head/gdb/features/rs6000/powerpc-32.c
--- gdb-orig/gdb/features/rs6000/powerpc-32.c	2008-03-04 21:13:10.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-32.c	2008-05-03 13:30:40.801582287 +0200
@@ -89,76 +89,5 @@ initialize_tdesc_powerpc_32 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
-
-  field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
-
-  field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
-
-  field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
-
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
-  field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
-  field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
-  tdesc_record_type (feature, type);
-
-  tdesc_create_reg (feature, "vr0", 71, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr1", 72, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr2", 73, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr3", 74, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr4", 75, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr5", 76, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr6", 77, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr7", 78, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr8", 79, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr9", 80, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr10", 81, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr11", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr12", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr13", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr14", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr15", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr16", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr17", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr18", 89, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr19", 90, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr20", 91, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr21", 92, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr22", 93, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr23", 94, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr24", 95, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr25", 96, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr26", 97, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr27", 98, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr28", 99, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr29", 100, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr30", 101, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr31", 102, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vscr", 103, 1, "vector", 32, "int");
-  tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
-
   tdesc_powerpc_32 = result;
 }
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-32l.c gdb-head/gdb/features/rs6000/powerpc-32l.c
--- gdb-orig/gdb/features/rs6000/powerpc-32l.c	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-32l.c	2008-05-03 13:30:40.832577827 +0200
@@ -0,0 +1,97 @@
+/* THIS FILE IS GENERATED.  Original: powerpc-32l.xml */
+
+#include "defs.h"
+#include "gdbtypes.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_powerpc_32l;
+static void
+initialize_tdesc_powerpc_32l (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct type *field_type, *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
+
+  tdesc_powerpc_32l = result;
+}
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-32l.xml gdb-head/gdb/features/rs6000/powerpc-32l.xml
--- gdb-orig/gdb/features/rs6000/powerpc-32l.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-32l.xml	2008-05-03 13:04:11.038030096 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code.  A UISA-only
+     view of the PowerPC.  Includes Linux-only special "registers".  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>powerpc:common</architecture>
+  <xi:include href="power-core.xml"/>
+  <xi:include href="power-fpu.xml"/>
+  <xi:include href="power-linux.xml"/>
+</target>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-32.xml gdb-head/gdb/features/rs6000/powerpc-32.xml
--- gdb-orig/gdb/features/rs6000/powerpc-32.xml	2008-01-01 23:53:14.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-32.xml	2008-05-03 13:02:16.715197138 +0200
@@ -13,5 +13,4 @@
   <architecture>powerpc:common</architecture>
   <xi:include href="power-core.xml"/>
   <xi:include href="power-fpu.xml"/>
-  <xi:include href="power-altivec.xml"/>
 </target>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-64.c gdb-head/gdb/features/rs6000/powerpc-64.c
--- gdb-orig/gdb/features/rs6000/powerpc-64.c	2008-03-04 21:13:10.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-64.c	2008-05-03 13:30:40.980690432 +0200
@@ -89,76 +89,5 @@ initialize_tdesc_powerpc_64 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
-
-  field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
-
-  field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
-
-  field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
-
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
-  field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
-  field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
-  tdesc_record_type (feature, type);
-
-  tdesc_create_reg (feature, "vr0", 71, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr1", 72, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr2", 73, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr3", 74, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr4", 75, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr5", 76, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr6", 77, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr7", 78, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr8", 79, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr9", 80, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr10", 81, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr11", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr12", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr13", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr14", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr15", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr16", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr17", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr18", 89, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr19", 90, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr20", 91, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr21", 92, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr22", 93, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr23", 94, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr24", 95, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr25", 96, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr26", 97, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr27", 98, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr28", 99, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr29", 100, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr30", 101, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vr31", 102, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "vscr", 103, 1, "vector", 32, "int");
-  tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
-
   tdesc_powerpc_64 = result;
 }
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-64l.c gdb-head/gdb/features/rs6000/powerpc-64l.c
--- gdb-orig/gdb/features/rs6000/powerpc-64l.c	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-64l.c	2008-05-03 13:30:41.010686115 +0200
@@ -0,0 +1,97 @@
+/* THIS FILE IS GENERATED.  Original: powerpc-64l.xml */
+
+#include "defs.h"
+#include "gdbtypes.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_powerpc_64l;
+static void
+initialize_tdesc_powerpc_64l (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct type *field_type, *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
+
+  tdesc_powerpc_64l = result;
+}
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-64l.xml gdb-head/gdb/features/rs6000/powerpc-64l.xml
--- gdb-orig/gdb/features/rs6000/powerpc-64l.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-64l.xml	2008-05-03 13:06:01.665996306 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code.  A UISA-only
+     view of the PowerPC.  Includes Linux-only special "registers".  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>powerpc:common64</architecture>
+  <xi:include href="power64-core.xml"/>
+  <xi:include href="power-fpu.xml"/>
+  <xi:include href="power64-linux.xml"/>
+</target>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-64.xml gdb-head/gdb/features/rs6000/powerpc-64.xml
--- gdb-orig/gdb/features/rs6000/powerpc-64.xml	2008-01-01 23:53:14.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-64.xml	2008-05-03 13:06:39.743234876 +0200
@@ -13,5 +13,4 @@
   <architecture>powerpc:common64</architecture>
   <xi:include href="power64-core.xml"/>
   <xi:include href="power-fpu.xml"/>
-  <xi:include href="power-altivec.xml"/>
 </target>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-altivec32.c gdb-head/gdb/features/rs6000/powerpc-altivec32.c
--- gdb-orig/gdb/features/rs6000/powerpc-altivec32.c	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-altivec32.c	2008-05-03 13:30:40.862707410 +0200
@@ -0,0 +1,164 @@
+/* THIS FILE IS GENERATED.  Original: powerpc-altivec32.xml */
+
+#include "defs.h"
+#include "gdbtypes.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_powerpc_altivec32;
+static void
+initialize_tdesc_powerpc_altivec32 (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct type *field_type, *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  type = init_vector_type (field_type, 4);
+  TYPE_NAME (type) = xstrdup ("v4f");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int32");
+  type = init_vector_type (field_type, 4);
+  TYPE_NAME (type) = xstrdup ("v4i32");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int16");
+  type = init_vector_type (field_type, 8);
+  TYPE_NAME (type) = xstrdup ("v8i16");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int8");
+  type = init_vector_type (field_type, 16);
+  TYPE_NAME (type) = xstrdup ("v16i8");
+  tdesc_record_type (feature, type);
+
+  type = init_composite_type (NULL, TYPE_CODE_UNION);
+  TYPE_NAME (type) = xstrdup ("vec128");
+  field_type = tdesc_named_type (feature, "uint128");
+  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  field_type = tdesc_named_type (feature, "v4f");
+  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
+  TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
+  tdesc_record_type (feature, type);
+
+  tdesc_create_reg (feature, "vr0", 71, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr1", 72, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr2", 73, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr3", 74, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr4", 75, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr5", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr6", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr7", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr8", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr9", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr10", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr11", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr12", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr13", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr14", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr15", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr16", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr17", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr18", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr19", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr20", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr21", 92, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr22", 93, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr23", 94, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr24", 95, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr25", 96, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr26", 97, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr27", 98, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr28", 99, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr29", 100, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr30", 101, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr31", 102, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vscr", 103, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
+
+  tdesc_powerpc_altivec32 = result;
+}
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-altivec32l.c gdb-head/gdb/features/rs6000/powerpc-altivec32l.c
--- gdb-orig/gdb/features/rs6000/powerpc-altivec32l.c	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-altivec32l.c	2008-05-03 13:30:40.893702950 +0200
@@ -0,0 +1,168 @@
+/* THIS FILE IS GENERATED.  Original: powerpc-altivec32l.xml */
+
+#include "defs.h"
+#include "gdbtypes.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_powerpc_altivec32l;
+static void
+initialize_tdesc_powerpc_altivec32l (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct type *field_type, *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  type = init_vector_type (field_type, 4);
+  TYPE_NAME (type) = xstrdup ("v4f");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int32");
+  type = init_vector_type (field_type, 4);
+  TYPE_NAME (type) = xstrdup ("v4i32");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int16");
+  type = init_vector_type (field_type, 8);
+  TYPE_NAME (type) = xstrdup ("v8i16");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int8");
+  type = init_vector_type (field_type, 16);
+  TYPE_NAME (type) = xstrdup ("v16i8");
+  tdesc_record_type (feature, type);
+
+  type = init_composite_type (NULL, TYPE_CODE_UNION);
+  TYPE_NAME (type) = xstrdup ("vec128");
+  field_type = tdesc_named_type (feature, "uint128");
+  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  field_type = tdesc_named_type (feature, "v4f");
+  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
+  TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
+  tdesc_record_type (feature, type);
+
+  tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
+
+  tdesc_powerpc_altivec32l = result;
+}
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-altivec32l.xml gdb-head/gdb/features/rs6000/powerpc-altivec32l.xml
--- gdb-orig/gdb/features/rs6000/powerpc-altivec32l.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-altivec32l.xml	2008-05-03 13:04:02.600048248 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code.  A UISA-only
+     view of the PowerPC.  Includes Linux-only special "registers" and AltiVec
+     vector registers.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>powerpc:common</architecture>
+  <xi:include href="power-core.xml"/>
+  <xi:include href="power-fpu.xml"/>
+  <xi:include href="power-linux.xml"/>
+  <xi:include href="power-altivec.xml"/>
+</target>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-altivec32.xml gdb-head/gdb/features/rs6000/powerpc-altivec32.xml
--- gdb-orig/gdb/features/rs6000/powerpc-altivec32.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-altivec32.xml	2008-05-03 13:17:17.755352300 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code.  A UISA-only
+     view of the PowerPC.  Includes AltiVec vector registers.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>powerpc:common</architecture>
+  <xi:include href="power-core.xml"/>
+  <xi:include href="power-fpu.xml"/>
+  <xi:include href="power-altivec.xml"/>
+</target>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-altivec64.c gdb-head/gdb/features/rs6000/powerpc-altivec64.c
--- gdb-orig/gdb/features/rs6000/powerpc-altivec64.c	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-altivec64.c	2008-05-03 13:30:41.040681799 +0200
@@ -0,0 +1,164 @@
+/* THIS FILE IS GENERATED.  Original: powerpc-altivec64.xml */
+
+#include "defs.h"
+#include "gdbtypes.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_powerpc_altivec64;
+static void
+initialize_tdesc_powerpc_altivec64 (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct type *field_type, *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  type = init_vector_type (field_type, 4);
+  TYPE_NAME (type) = xstrdup ("v4f");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int32");
+  type = init_vector_type (field_type, 4);
+  TYPE_NAME (type) = xstrdup ("v4i32");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int16");
+  type = init_vector_type (field_type, 8);
+  TYPE_NAME (type) = xstrdup ("v8i16");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int8");
+  type = init_vector_type (field_type, 16);
+  TYPE_NAME (type) = xstrdup ("v16i8");
+  tdesc_record_type (feature, type);
+
+  type = init_composite_type (NULL, TYPE_CODE_UNION);
+  TYPE_NAME (type) = xstrdup ("vec128");
+  field_type = tdesc_named_type (feature, "uint128");
+  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  field_type = tdesc_named_type (feature, "v4f");
+  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
+  TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
+  tdesc_record_type (feature, type);
+
+  tdesc_create_reg (feature, "vr0", 71, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr1", 72, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr2", 73, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr3", 74, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr4", 75, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr5", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr6", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr7", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr8", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr9", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr10", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr11", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr12", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr13", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr14", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr15", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr16", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr17", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr18", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr19", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr20", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr21", 92, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr22", 93, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr23", 94, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr24", 95, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr25", 96, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr26", 97, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr27", 98, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr28", 99, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr29", 100, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr30", 101, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr31", 102, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vscr", 103, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
+
+  tdesc_powerpc_altivec64 = result;
+}
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-altivec64l.c gdb-head/gdb/features/rs6000/powerpc-altivec64l.c
--- gdb-orig/gdb/features/rs6000/powerpc-altivec64l.c	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-altivec64l.c	2008-05-03 13:30:41.071677338 +0200
@@ -0,0 +1,168 @@
+/* THIS FILE IS GENERATED.  Original: powerpc-altivec64l.xml */
+
+#include "defs.h"
+#include "gdbtypes.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_powerpc_altivec64l;
+static void
+initialize_tdesc_powerpc_altivec64l (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct type *field_type, *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  type = init_vector_type (field_type, 4);
+  TYPE_NAME (type) = xstrdup ("v4f");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int32");
+  type = init_vector_type (field_type, 4);
+  TYPE_NAME (type) = xstrdup ("v4i32");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int16");
+  type = init_vector_type (field_type, 8);
+  TYPE_NAME (type) = xstrdup ("v8i16");
+  tdesc_record_type (feature, type);
+
+  field_type = tdesc_named_type (feature, "int8");
+  type = init_vector_type (field_type, 16);
+  TYPE_NAME (type) = xstrdup ("v16i8");
+  tdesc_record_type (feature, type);
+
+  type = init_composite_type (NULL, TYPE_CODE_UNION);
+  TYPE_NAME (type) = xstrdup ("vec128");
+  field_type = tdesc_named_type (feature, "uint128");
+  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  field_type = tdesc_named_type (feature, "v4f");
+  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
+  TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
+  tdesc_record_type (feature, type);
+
+  tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
+
+  tdesc_powerpc_altivec64l = result;
+}
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-altivec64l.xml gdb-head/gdb/features/rs6000/powerpc-altivec64l.xml
--- gdb-orig/gdb/features/rs6000/powerpc-altivec64l.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-altivec64l.xml	2008-05-03 13:05:51.433873302 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code.  A UISA-only
+     view of the PowerPC.  Includes Linux-only special "registers" and AltiVec
+     vector registers.   -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>powerpc:common64</architecture>
+  <xi:include href="power64-core.xml"/>
+  <xi:include href="power-fpu.xml"/>
+  <xi:include href="power64-linux.xml"/>
+  <xi:include href="power-altivec.xml"/>
+</target>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-altivec64.xml gdb-head/gdb/features/rs6000/powerpc-altivec64.xml
--- gdb-orig/gdb/features/rs6000/powerpc-altivec64.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-altivec64.xml	2008-05-03 13:17:33.874426505 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code.  A UISA-only
+     view of the PowerPC.  Includes AltiVec vector registers.   -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>powerpc:common64</architecture>
+  <xi:include href="power64-core.xml"/>
+  <xi:include href="power-fpu.xml"/>
+  <xi:include href="power-altivec.xml"/>
+</target>
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-e500.c gdb-head/gdb/features/rs6000/powerpc-e500.c
--- gdb-orig/gdb/features/rs6000/powerpc-e500.c	2008-03-04 21:13:10.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-e500.c	2008-05-03 13:30:40.922698777 +0200
@@ -87,8 +87,8 @@ initialize_tdesc_powerpc_e500 (void)
   tdesc_create_reg (feature, "ev29h", 61, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ev30h", 62, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ev31h", 63, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "acc", 71, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "spefscr", 72, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "acc", 73, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "spefscr", 74, 1, NULL, 32, "int");
 
   tdesc_powerpc_e500 = result;
 }
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-e500l.c gdb-head/gdb/features/rs6000/powerpc-e500l.c
--- gdb-orig/gdb/features/rs6000/powerpc-e500l.c	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-e500l.c	2008-05-03 13:30:40.951694605 +0200
@@ -0,0 +1,98 @@
+/* THIS FILE IS GENERATED.  Original: powerpc-e500l.xml */
+
+#include "defs.h"
+#include "gdbtypes.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_powerpc_e500l;
+static void
+initialize_tdesc_powerpc_e500l (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct type *field_type, *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.spe");
+  tdesc_create_reg (feature, "ev0h", 32, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev1h", 33, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev2h", 34, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev3h", 35, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev4h", 36, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev5h", 37, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev6h", 38, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev7h", 39, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev8h", 40, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev9h", 41, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev10h", 42, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev11h", 43, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev12h", 44, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev13h", 45, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev14h", 46, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev15h", 47, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev16h", 48, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev17h", 49, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev18h", 50, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev19h", 51, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev20h", 52, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev21h", 53, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev22h", 54, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev23h", 55, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev24h", 56, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev25h", 57, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev26h", 58, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev27h", 59, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev28h", 60, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev29h", 61, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev30h", 62, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "ev31h", 63, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "acc", 73, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "spefscr", 74, 1, NULL, 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
+
+  tdesc_powerpc_e500l = result;
+}
diff -urNp gdb-orig/gdb/features/rs6000/powerpc-e500l.xml gdb-head/gdb/features/rs6000/powerpc-e500l.xml
--- gdb-orig/gdb/features/rs6000/powerpc-e500l.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/features/rs6000/powerpc-e500l.xml	2008-05-03 13:15:33.575521955 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>powerpc:e500</architecture>
+  <xi:include href="power-core.xml"/>
+  <xi:include href="power-spe.xml"/>
+  <xi:include href="power-linux.xml"/>
+</target>
diff -urNp gdb-orig/gdb/features/rs6000/power-spe.xml gdb-head/gdb/features/rs6000/power-spe.xml
--- gdb-orig/gdb/features/rs6000/power-spe.xml	2008-01-01 23:53:14.000000000 +0100
+++ gdb-head/gdb/features/rs6000/power-spe.xml	2008-05-03 13:29:24.297024453 +0200
@@ -40,6 +40,6 @@
   <reg name="ev30h" bitsize="32"/>
   <reg name="ev31h" bitsize="32"/>
 
-  <reg name="acc" bitsize="64" regnum="71"/>
+  <reg name="acc" bitsize="64" regnum="73"/>
   <reg name="spefscr" bitsize="32"/>
 </feature>
diff -urNp gdb-orig/gdb/gdbserver/configure.srv gdb-head/gdb/gdbserver/configure.srv
--- gdb-orig/gdb/gdbserver/configure.srv	2008-04-23 00:13:17.000000000 +0200
+++ gdb-head/gdb/gdbserver/configure.srv	2008-05-03 14:47:35.123001861 +0200
@@ -106,17 +106,24 @@ case "${target}" in
 			srv_linux_usrregs=yes
 			srv_linux_thread_db=yes
 			;;
-  powerpc*-*-linux*)	srv_regobj="reg-ppc.o powerpc-32.o powerpc-e500.o"
-			srv_regobj="${srv_regobj} reg-ppc64.o powerpc-64.o"
+  powerpc*-*-linux*)	srv_regobj="powerpc-32l.o"
+			srv_regobj="${srv_regobj} powerpc-altivec32l.o"
+			srv_regobj="${srv_regobj} powerpc-e500l.o"
+			srv_regobj="${srv_regobj} powerpc-64l.o"
+			srv_regobj="${srv_regobj} powerpc-altivec64l.o"
 			srv_tgtobj="linux-low.o linux-ppc-low.o"
-			srv_xmlfiles="rs6000/powerpc-32.xml"
+			srv_xmlfiles="rs6000/powerpc-32l.xml"
+			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-altivec32l.xml"
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml"
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml"
+			srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux.xml"
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu.xml"
-			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500.xml"
+			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml"
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml"
-			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64.xml"
+			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml"
+			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-altivec64l.xml"
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml"
+			srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml"
 			srv_linux_usrregs=yes
 			srv_linux_regsets=yes
 			srv_linux_thread_db=yes
diff -urNp gdb-orig/gdb/gdbserver/inferiors.c gdb-head/gdb/gdbserver/inferiors.c
--- gdb-orig/gdb/gdbserver/inferiors.c	2008-01-01 23:53:14.000000000 +0100
+++ gdb-head/gdb/gdbserver/inferiors.c	2008-05-03 15:56:08.517570424 +0200
@@ -302,6 +302,8 @@ clear_inferiors (void)
 
   clear_list (&all_threads);
   clear_list (&all_dlls);
+
+  current_inferior = NULL;
 }
 
 /* Two utility functions for a truly degenerate inferior_list: a simple
diff -urNp gdb-orig/gdb/gdbserver/linux-ppc-low.c gdb-head/gdb/gdbserver/linux-ppc-low.c
--- gdb-orig/gdb/gdbserver/linux-ppc-low.c	2008-04-23 00:13:17.000000000 +0200
+++ gdb-head/gdb/gdbserver/linux-ppc-low.c	2008-05-03 13:38:36.120381603 +0200
@@ -31,18 +31,26 @@
 static unsigned long ppc_hwcap;
 
 
-/* Defined in auto-generated file reg-ppc.c.  */
-void init_registers_ppc (void);
-/* Defined in auto-generated file powerpc-32.c.  */
-void init_registers_powerpc_32 (void);
-/* Defined in auto-generated file powerpc-e500.c.  */
-void init_registers_powerpc_e500 (void);
-/* Defined in auto-generated file reg-ppc64.c.  */
-void init_registers_ppc64 (void);
-/* Defined in auto-generated file powerpc-64.c.  */
-void init_registers_powerpc_64 (void);
-
-#define ppc_num_regs 71
+/* Defined in auto-generated file powerpc-32l.c.  */
+void init_registers_powerpc_32l (void);
+/* Defined in auto-generated file powerpc-altivec32l.c.  */
+void init_registers_powerpc_altivec32l (void);
+/* Defined in auto-generated file powerpc-e500l.c.  */
+void init_registers_powerpc_e500l (void);
+/* Defined in auto-generated file powerpc-64l.c.  */
+void init_registers_powerpc_64l (void);
+/* Defined in auto-generated file powerpc-altivec64l.c.  */
+void init_registers_powerpc_altivec64l (void);
+
+#define ppc_num_regs 73
+
+/* This sometimes isn't defined.  */
+#ifndef PT_ORIG_R3
+#define PT_ORIG_R3 34
+#endif
+#ifndef PT_TRAP
+#define PT_TRAP 40
+#endif
 
 #ifdef __powerpc64__
 /* We use a constant for FPSCR instead of PT_FPSCR, because
@@ -65,7 +73,8 @@ static int ppc_regmap[] =
   PT_FPR0*8+192,  PT_FPR0*8+200,  PT_FPR0*8+208,  PT_FPR0*8+216,
   PT_FPR0*8+224,  PT_FPR0*8+232,  PT_FPR0*8+240,  PT_FPR0*8+248,
   PT_NIP * 8,    PT_MSR * 8,    PT_CCR * 8,    PT_LNK * 8,
-  PT_CTR * 8,    PT_XER * 8,    PT_FPR0*8 + 256 };
+  PT_CTR * 8,    PT_XER * 8,    PT_FPR0*8 + 256,
+  PT_ORIG_R3 * 8, PT_TRAP * 8 };
 #else
 /* Currently, don't check/send MQ.  */
 static int ppc_regmap[] =
@@ -86,7 +95,8 @@ static int ppc_regmap[] =
   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,
   PT_NIP * 4,    PT_MSR * 4,    PT_CCR * 4,    PT_LNK * 4,
-  PT_CTR * 4,    PT_XER * 4,    PT_FPSCR * 4
+  PT_CTR * 4,    PT_XER * 4,    PT_FPSCR * 4,
+  PT_ORIG_R3 * 4, PT_TRAP * 4
  };
 
 static int ppc_regmap_e500[] =
@@ -107,7 +117,8 @@ static int ppc_regmap_e500[] =
   -1,            -1,            -1,            -1,
   -1,            -1,            -1,            -1,
   PT_NIP * 4,    PT_MSR * 4,    PT_CCR * 4,    PT_LNK * 4,
-  PT_CTR * 4,    PT_XER * 4,    -1
+  PT_CTR * 4,    PT_XER * 4,    -1,
+  PT_ORIG_R3 * 4, PT_TRAP * 4
  };
 #endif
 
@@ -120,6 +131,11 @@ ppc_cannot_store_register (int regno)
     return 2;
 #endif
 
+  /* Some kernels do not allow us to store orig_r3 or trap.  */
+  if (regno == find_regno ("orig_r3")
+      || regno == find_regno ("trap"))
+    return 2;
+
   return 0;
 }
 
@@ -226,7 +242,7 @@ ppc_arch_setup (void)
   /* On a 64-bit host, assume 64-bit inferior process with no
      AltiVec registers.  Reset ppc_hwcap to ensure that the
      collect_register call below does not fail.  */
-  init_registers_ppc64 ();
+  init_registers_powerpc_64l ();
   ppc_hwcap = 0;
 
   /* Only if the high bit of the MSR is set, we actually have
@@ -236,18 +252,18 @@ ppc_arch_setup (void)
     {
       ppc_get_hwcap (&ppc_hwcap);
       if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
-	init_registers_powerpc_64 ();
+	init_registers_powerpc_altivec64l ();
 
       return;
     }
 #endif
 
   /* OK, we have a 32-bit inferior.  */
-  init_registers_ppc ();
+  init_registers_powerpc_32l ();
 
   ppc_get_hwcap (&ppc_hwcap);
   if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
-    init_registers_powerpc_32 ();
+    init_registers_powerpc_altivec32l ();
 
   /* On 32-bit machines, check for SPE registers.
      Set the low target's regmap field as appropriately.  */
@@ -255,7 +271,7 @@ ppc_arch_setup (void)
   the_low_target.regmap = ppc_regmap;
   if (ppc_hwcap & PPC_FEATURE_HAS_SPE)
     {
-      init_registers_powerpc_e500 ();
+      init_registers_powerpc_e500l ();
       the_low_target.regmap = ppc_regmap_e500;
    }
 #endif
@@ -292,6 +308,9 @@ static void ppc_fill_gregset (void *buf)
 
   for (i = 64; i < 70; i++)
     ppc_collect_ptrace_register (i, (char *) buf + ppc_regmap[i]);
+
+  for (i = 71; i < 73; i++)
+    ppc_collect_ptrace_register (i, (char *) buf + ppc_regmap[i]);
 }
 
 #ifndef PTRACE_GETVRREGS
diff -urNp gdb-orig/gdb/gdbserver/Makefile.in gdb-head/gdb/gdbserver/Makefile.in
--- gdb-orig/gdb/gdbserver/Makefile.in	2008-04-23 00:13:17.000000000 +0200
+++ gdb-head/gdb/gdbserver/Makefile.in	2008-05-03 13:41:15.929716676 +0200
@@ -219,10 +219,11 @@ clean:
 	rm -f version.c
 	rm -f gdbserver$(EXEEXT) gdbreplay$(EXEEXT) core make.log
 	rm -f reg-arm.c reg-i386.c reg-ia64.c reg-m32r.c reg-m68k.c
-	rm -f reg-ppc.c reg-sh.c reg-spu.c reg-x86-64.c reg-i386-linux.c
+	rm -f 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 reg-xtensa.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 powerpc-32l.c powerpc-64l.c powerpc-e500l.c
+	rm -f powerpc-altivec32l.c powerpc-altivec64l.c
 	rm -f xml-builtin.c stamp-xml
 
 maintainer-clean realclean distclean: clean
@@ -360,21 +361,21 @@ mips-linux.c : $(srcdir)/../regformats/m
 mips64-linux.o : mips64-linux.c $(regdef_h)
 mips64-linux.c : $(srcdir)/../regformats/mips64-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/mips64-linux.dat mips64-linux.c
-reg-ppc.o : reg-ppc.c $(regdef_h)
-reg-ppc.c : $(srcdir)/../regformats/reg-ppc.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-ppc.dat reg-ppc.c
-reg-ppc64.o : reg-ppc64.c $(regdef_h)
-reg-ppc64.c : $(srcdir)/../regformats/reg-ppc64.dat $(regdat_sh)
-	$(SHELL) $(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)
-	$(SHELL) $(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)
-	$(SHELL) $(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)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-64.dat powerpc-64.c
+powerpc-32l.o : powerpc-32l.c $(regdef_h)
+powerpc-32l.c : $(srcdir)/../regformats/rs6000/powerpc-32l.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-32l.dat powerpc-32l.c
+powerpc-altivec32l.o : powerpc-altivec32l.c $(regdef_h)
+powerpc-altivec32l.c : $(srcdir)/../regformats/rs6000/powerpc-altivec32l.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-altivec32l.dat powerpc-altivec32l.c
+powerpc-e500l.o : powerpc-e500l.c $(regdef_h)
+powerpc-e500l.c : $(srcdir)/../regformats/rs6000/powerpc-e500l.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-e500l.dat powerpc-e500l.c
+powerpc-64l.o : powerpc-64l.c $(regdef_h)
+powerpc-64l.c : $(srcdir)/../regformats/rs6000/powerpc-64l.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-64l.dat powerpc-64l.c
+powerpc-altivec64l.o : powerpc-altivec64l.c $(regdef_h)
+powerpc-altivec64l.c : $(srcdir)/../regformats/rs6000/powerpc-altivec64l.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/rs6000/powerpc-altivec64l.dat powerpc-altivec64l.c
 reg-s390.o : reg-s390.c $(regdef_h)
 reg-s390.c : $(srcdir)/../regformats/reg-s390.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-s390.dat reg-s390.c
diff -urNp gdb-orig/gdb/Makefile.in gdb-head/gdb/Makefile.in
--- gdb-orig/gdb/Makefile.in	2008-05-03 01:59:47.000000000 +0200
+++ gdb-head/gdb/Makefile.in	2008-05-03 16:05:18.401845318 +0200
@@ -859,6 +859,7 @@ p_lang_h = p-lang.h
 ppcnbsd_tdep_h = ppcnbsd-tdep.h
 ppcobsd_tdep_h = ppcobsd-tdep.h
 ppc_tdep_h = ppc-tdep.h
+ppc_linux_tdep_h = ppc-linux-tdep.h
 proc_utils_h = proc-utils.h
 prologue_value_h = prologue-value.h
 regcache_h = regcache.h
@@ -970,6 +971,9 @@ arm_with_iwmmxt_c = $(srcdir)/features/a
 mips_linux_c = $(srcdir)/features/mips-linux.c $(features_headers)
 mips64_linux_c = $(srcdir)/features/mips64-linux.c $(features_headers)
 powerpc_32_c = $(srcdir)/features/rs6000/powerpc-32.c $(features_headers)
+powerpc_32l_c = $(srcdir)/features/rs6000/powerpc-32l.c $(features_headers)
+powerpc_altivec32_c = $(srcdir)/features/rs6000/powerpc-altivec32.c $(features_headers)
+powerpc_altivec32l_c = $(srcdir)/features/rs6000/powerpc-altivec32l.c $(features_headers)
 powerpc_403_c = $(srcdir)/features/rs6000/powerpc-403.c $(features_headers)
 powerpc_403gc_c = $(srcdir)/features/rs6000/powerpc-403gc.c $(features_headers)
 powerpc_505_c = $(srcdir)/features/rs6000/powerpc-505.c $(features_headers)
@@ -978,10 +982,14 @@ powerpc_602_c = $(srcdir)/features/rs600
 powerpc_603_c = $(srcdir)/features/rs6000/powerpc-603.c $(features_headers)
 powerpc_604_c = $(srcdir)/features/rs6000/powerpc-604.c $(features_headers)
 powerpc_64_c = $(srcdir)/features/rs6000/powerpc-64.c $(features_headers)
+powerpc_64l_c = $(srcdir)/features/rs6000/powerpc-64l.c $(features_headers)
+powerpc_altivec64_c = $(srcdir)/features/rs6000/powerpc-altivec64.c $(features_headers)
+powerpc_altivec64l_c = $(srcdir)/features/rs6000/powerpc-altivec64l.c $(features_headers)
 powerpc_7400_c = $(srcdir)/features/rs6000/powerpc-7400.c $(features_headers)
 powerpc_750_c = $(srcdir)/features/rs6000/powerpc-750.c $(features_headers)
 powerpc_860_c = $(srcdir)/features/rs6000/powerpc-860.c $(features_headers)
 powerpc_e500_c = $(srcdir)/features/rs6000/powerpc-e500.c $(features_headers)
+powerpc_e500l_c = $(srcdir)/features/rs6000/powerpc-e500l.c $(features_headers)
 rs6000_c = $(srcdir)/features/rs6000/rs6000.c $(features_headers)
 
 # Header files that need to have srcdir added.  Note that in the cases
@@ -2592,13 +2600,15 @@ ppcbug-rom.o: ppcbug-rom.c $(defs_h) $(g
 	$(serial_h) $(regcache_h)
 ppc-linux-nat.o: ppc-linux-nat.c $(defs_h) $(gdb_string_h) $(frame_h) \
 	$(inferior_h) $(gdbcore_h) $(regcache_h) $(gdb_assert_h) \
-	$(gdb_wait_h) $(gregset_h) $(ppc_tdep_h) $(target_h) \
-	$(linux_nat_h)
+	$(gdb_wait_h) $(gregset_h) $(ppc_tdep_h) $(ppc_linux_tdep_h) \
+	$(target_h) $(linux_nat_h)
 ppc-linux-tdep.o: ppc-linux-tdep.c $(defs_h) $(frame_h) $(inferior_h) \
 	$(symtab_h) $(target_h) $(gdbcore_h) $(gdbcmd_h) $(symfile_h) \
 	$(objfiles_h) $(regcache_h) $(value_h) $(osabi_h) $(regset_h) \
-	$(solib_svr4_h) $(ppc_tdep_h) $(trad_frame_h) $(frame_unwind_h) \
-	$(tramp_frame_h)
+	$(solib_svr4_h) $(ppc_tdep_h) $(ppc_linux_tdep_h) $(trad_frame_h) \
+	$(frame_unwind_h) $(tramp_frame_h) \
+	$(powerpc_32l_c) $(powerpc_altivec32l_c) $(powerpc_e500l_c) \
+	$(powerpc_64l_c) $(powerpc_altivec64l_c)
 ppcnbsd-nat.o: ppcnbsd-nat.c $(defs_h) $(inferior_h) $(gdb_assert_h) \
 	$(gdbcore_h) $(regcache_h) $(bsd_kvm_h) $(ppc_tdep_h) \
 	$(ppcnbsd_tdep_h) $(inf_ptrace_h)
@@ -2684,10 +2694,11 @@ rs6000-tdep.o: rs6000-tdep.c $(defs_h) $
 	$(ppc_tdep_h) $(gdb_assert_h) $(dis_asm_h) $(trad_frame_h) \
 	$(frame_unwind_h) $(frame_base_h) $(rs6000_tdep_h) $(dwarf2_frame_h) \
 	$(target_descriptions) $(user_regs_h) $(elf_ppc_h) \
-	$(powerpc_32_c) $(powerpc_403_c) $(powerpc_403gc_c) $(powerpc_505_c) \
-	$(powerpc_601_c) $(powerpc_602_c) $(powerpc_603_c) $(powerpc_604_c) \
-	$(powerpc_64_c) $(powerpc_7400_c) $(powerpc_750_c) $(powerpc_860_c) \
-	$(powerpc_e500_c) $(rs6000_c)
+	$(powerpc_32_c) $(powerpc_altivec32_c) $(powerpc_403_c) \
+	$(powerpc_403gc_c) $(powerpc_505_c)  $(powerpc_601_c) \
+	$(powerpc_602_c) $(powerpc_603_c) $(powerpc_604_c) \
+	$(powerpc_64_c) $(powerpc_altivec64_c) $(powerpc_7400_c) \
+	$(powerpc_750_c) $(powerpc_860_c) $(powerpc_e500_c) $(rs6000_c)
 rs6000-aix-tdep.o: rs6000-aix-tdep.c $(defs_h) $(gdb_string_h) $(osabi_h) \
 	$(regcache_h) $(regset_h) $(rs6000_tdep_h) $(ppc_tdep_h)
 s390-nat.o: s390-nat.c $(defs_h) $(regcache_h) $(inferior_h) \
diff -urNp gdb-orig/gdb/ppc-linux-nat.c gdb-head/gdb/ppc-linux-nat.c
--- gdb-orig/gdb/ppc-linux-nat.c	2008-05-02 13:30:34.000000000 +0200
+++ gdb-head/gdb/ppc-linux-nat.c	2008-05-03 14:51:06.602744944 +0200
@@ -42,6 +42,15 @@
 /* Prototypes for supply_gregset etc. */
 #include "gregset.h"
 #include "ppc-tdep.h"
+#include "ppc-linux-tdep.h"
+
+/* This sometimes isn't defined.  */
+#ifndef PT_ORIG_R3
+#define PT_ORIG_R3 34
+#endif
+#ifndef PT_TRAP
+#define PT_TRAP 40
+#endif
 
 /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a
    configure time check.  Some older glibc's (for instance 2.2.1)
@@ -200,6 +209,10 @@ ppc_register_u_addr (struct gdbarch *gdb
 #endif
   if (regno == tdep->ppc_ps_regnum)
     u_addr = PT_MSR * wordsize;
+  if (regno == PPC_ORIG_R3_REGNUM)
+    u_addr = PT_ORIG_R3 * wordsize;
+  if (regno == PPC_TRAP_REGNUM)
+    u_addr = PT_TRAP * wordsize;
   if (tdep->ppc_fpscr_regnum >= 0
       && regno == tdep->ppc_fpscr_regnum)
     {
@@ -476,6 +489,11 @@ fetch_ppc_registers (struct regcache *re
     fetch_register (regcache, tid, tdep->ppc_xer_regnum);
   if (tdep->ppc_mq_regnum != -1)
     fetch_register (regcache, tid, tdep->ppc_mq_regnum);
+  if (ppc_linux_trap_reg_p (gdbarch))
+    {
+      fetch_register (regcache, tid, PPC_ORIG_R3_REGNUM);
+      fetch_register (regcache, tid, PPC_TRAP_REGNUM);
+    }
   if (tdep->ppc_fpscr_regnum != -1)
     fetch_register (regcache, tid, tdep->ppc_fpscr_regnum);
   if (have_ptrace_getvrregs)
@@ -676,9 +694,12 @@ store_register (const struct regcache *r
       regaddr += sizeof (long);
 
       if (errno == EIO 
-          && regno == tdep->ppc_fpscr_regnum)
+          && (regno == tdep->ppc_fpscr_regnum
+	      || regno == PPC_ORIG_R3_REGNUM
+	      || regno == PPC_TRAP_REGNUM))
 	{
-	  /* Some older kernel versions don't allow fpscr to be written.  */
+	  /* Some older kernel versions don't allow fpscr, orig_r3
+	     or trap to be written.  */
 	  continue;
 	}
 
@@ -765,6 +786,11 @@ store_ppc_registers (const struct regcac
     store_register (regcache, tid, tdep->ppc_mq_regnum);
   if (tdep->ppc_fpscr_regnum != -1)
     store_register (regcache, tid, tdep->ppc_fpscr_regnum);
+  if (ppc_linux_trap_reg_p (gdbarch))
+    {
+      store_register (regcache, tid, PPC_ORIG_R3_REGNUM);
+      store_register (regcache, tid, PPC_TRAP_REGNUM);
+    }
   if (have_ptrace_getvrregs)
     if (tdep->ppc_vr0_regnum != -1 && tdep->ppc_vrsave_regnum != -1)
       store_altivec_registers (regcache, tid);
@@ -962,28 +988,51 @@ fill_fpregset (const struct regcache *re
 static const struct target_desc *
 ppc_linux_read_description (struct target_ops *ops)
 {
+  int altivec = 0;
+
+  int tid = TIDGET (inferior_ptid);
+  if (tid == 0)
+    tid = PIDGET (inferior_ptid);
+
   if (have_ptrace_getsetevrregs)
     {
       struct gdb_evrregset_t evrregset;
-      int tid = TIDGET (inferior_ptid);
-
-      if (tid == 0)
-	tid = PIDGET (inferior_ptid);
 
       if (ptrace (PTRACE_GETEVRREGS, tid, 0, &evrregset) >= 0)
-        return tdesc_powerpc_e500;
-      else
-        {
-          /* EIO means that the PTRACE_GETEVRREGS request isn't supported.  */
-          if (errno == EIO)
-	    return NULL;
-	  else
-            /* Anything else needs to be reported.  */
-            perror_with_name (_("Unable to fetch SPE registers"));
-	}
+        return tdesc_powerpc_e500l;
+
+      /* EIO means that the PTRACE_GETEVRREGS request isn't supported.
+	 Anything else needs to be reported.  */
+      else if (errno != EIO)
+	perror_with_name (_("Unable to fetch SPE registers"));
     }
 
-  return NULL;
+  if (have_ptrace_getvrregs)
+    {
+      gdb_vrregset_t vrregset;
+
+      if (ptrace (PTRACE_GETVRREGS, tid, 0, &vrregset) >= 0)
+        altivec = 1;
+
+      /* EIO means that the PTRACE_GETVRREGS request isn't supported.
+	 Anything else needs to be reported.  */
+      else if (errno != EIO)
+	perror_with_name (_("Unable to fetch AltiVec registers"));
+    }
+
+  /* Check for 64-bit inferior process.  This is the case when the host is
+     64-bit, and in addition the top bit of the MSR register is set.  */
+#ifdef __powerpc64__
+  {
+    long msr;
+    errno = 0;
+    msr = (long) ptrace (PTRACE_PEEKUSER, tid, PT_MSR * 8, 0);
+    if (errno == 0 && msr < 0)
+      return altivec? tdesc_powerpc_altivec64l : tdesc_powerpc_64l;
+  }
+#endif
+
+  return altivec? tdesc_powerpc_altivec32l : tdesc_powerpc_32l;
 }
 
 void _initialize_ppc_linux_nat (void);
diff -urNp gdb-orig/gdb/ppc-linux-tdep.c gdb-head/gdb/ppc-linux-tdep.c
--- gdb-orig/gdb/ppc-linux-tdep.c	2008-05-01 01:20:00.000000000 +0200
+++ gdb-head/gdb/ppc-linux-tdep.c	2008-05-03 14:50:33.028523663 +0200
@@ -34,10 +34,17 @@
 #include "regset.h"
 #include "solib-svr4.h"
 #include "ppc-tdep.h"
+#include "ppc-linux-tdep.h"
 #include "trad-frame.h"
 #include "frame-unwind.h"
 #include "tramp-frame.h"
 
+#include "features/rs6000/powerpc-32l.c"
+#include "features/rs6000/powerpc-altivec32l.c"
+#include "features/rs6000/powerpc-64l.c"
+#include "features/rs6000/powerpc-altivec64l.c"
+#include "features/rs6000/powerpc-e500l.c"
+
 static CORE_ADDR
 ppc_linux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
@@ -620,17 +627,60 @@ ppc_linux_convert_from_func_ptr_addr (st
   return addr;
 }
 
-/* This wrapper clears areas in the linux gregset not written by
-   ppc_collect_gregset.  */
+/* Wrappers to handle Linux-only registers.  */
+
+static void
+ppc_linux_supply_gregset (const struct regset *regset,
+			  struct regcache *regcache,
+			  int regnum, const void *gregs, size_t len)
+{
+  const struct ppc_reg_offsets *offsets = regset->descr;
+
+  ppc_supply_gregset (regset, regcache, regnum, gregs, len);
+
+  if (ppc_linux_trap_reg_p (get_regcache_arch (regcache)))
+    {
+      /* "orig_r3" is stored 2 slots after "pc".  */
+      if (regnum == -1 || regnum == PPC_ORIG_R3_REGNUM)
+	ppc_supply_reg (regcache, PPC_ORIG_R3_REGNUM, gregs,
+			offsets->pc_offset + 2 * offsets->gpr_size,
+			offsets->gpr_size);
+
+      /* "trap" is stored 8 slots after "pc".  */
+      if (regnum == -1 || regnum == PPC_TRAP_REGNUM)
+	ppc_supply_reg (regcache, PPC_TRAP_REGNUM, gregs,
+			offsets->pc_offset + 8 * offsets->gpr_size,
+			offsets->gpr_size);
+    }
+}
 
 static void
 ppc_linux_collect_gregset (const struct regset *regset,
 			   const struct regcache *regcache,
 			   int regnum, void *gregs, size_t len)
 {
+  const struct ppc_reg_offsets *offsets = regset->descr;
+
+  /* Clear areas in the linux gregset not written elsewhere.  */
   if (regnum == -1)
     memset (gregs, 0, len);
+
   ppc_collect_gregset (regset, regcache, regnum, gregs, len);
+
+  if (ppc_linux_trap_reg_p (get_regcache_arch (regcache)))
+    {
+      /* "orig_r3" is stored 2 slots after "pc".  */
+      if (regnum == -1 || regnum == PPC_ORIG_R3_REGNUM)
+	ppc_collect_reg (regcache, PPC_ORIG_R3_REGNUM, gregs,
+			 offsets->pc_offset + 2 * offsets->gpr_size,
+			 offsets->gpr_size);
+
+      /* "trap" is stored 8 slots after "pc".  */
+      if (regnum == -1 || regnum == PPC_TRAP_REGNUM)
+	ppc_collect_reg (regcache, PPC_TRAP_REGNUM, gregs,
+			 offsets->pc_offset + 8 * offsets->gpr_size,
+			 offsets->gpr_size);
+    }
 }
 
 /* Regset descriptions.  */
@@ -686,14 +736,14 @@ static const struct ppc_reg_offsets ppc6
 
 static const struct regset ppc32_linux_gregset = {
   &ppc32_linux_reg_offsets,
-  ppc_supply_gregset,
+  ppc_linux_supply_gregset,
   ppc_linux_collect_gregset,
   NULL
 };
 
 static const struct regset ppc64_linux_gregset = {
   &ppc64_linux_reg_offsets,
-  ppc_supply_gregset,
+  ppc_linux_supply_gregset,
   ppc_linux_collect_gregset,
   NULL
 };
@@ -789,6 +839,14 @@ ppc_linux_sigtramp_cache (struct frame_i
   trad_frame_set_reg_addr (this_cache, tdep->ppc_cr_regnum,
 			   gpregs + 38 * tdep->wordsize);
 
+  if (ppc_linux_trap_reg_p (gdbarch))
+    {
+      trad_frame_set_reg_addr (this_cache, PPC_ORIG_R3_REGNUM,
+			       gpregs + 34 * tdep->wordsize);
+      trad_frame_set_reg_addr (this_cache, PPC_TRAP_REGNUM,
+			       gpregs + 40 * tdep->wordsize);
+    }
+
   if (ppc_floating_point_unit_p (gdbarch))
     {
       /* Floating point registers.  */
@@ -895,11 +953,69 @@ static struct tramp_frame ppc64_linux_si
   ppc64_linux_sighandler_cache_init
 };
 
+
+/* Return 1 if PPC_ORIG_R3_REGNUM and PPC_TRAP_REGNUM are usable.  */
+int
+ppc_linux_trap_reg_p (struct gdbarch *gdbarch)
+{
+  /* If we do not have a target description with registers, then
+     the special registers will not be included in the register set.  */
+  if (!tdesc_has_registers (gdbarch_target_desc (gdbarch)))
+    return 0;
+
+  /* If we do, then it is safe to check the size.  */
+  return register_size (gdbarch, PPC_ORIG_R3_REGNUM) > 0
+         && register_size (gdbarch, PPC_TRAP_REGNUM) > 0;
+}
+
+static void
+ppc_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
+{
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+
+  regcache_cooked_write_unsigned (regcache, gdbarch_pc_regnum (gdbarch), pc);
+
+  /* Set special TRAP register to -1 to prevent the kernel from
+     messing with the PC we just installed, if we happen to be
+     within an interrupted system call that the kernel wants to
+     restart.
+
+     Note that after we return from the dummy call, the TRAP and
+     ORIG_R3 registers will be automatically restored, and the
+     kernel continues to restart the system call at this point.  */
+  if (ppc_linux_trap_reg_p (gdbarch))
+    regcache_cooked_write_unsigned (regcache, PPC_TRAP_REGNUM, -1);
+}
+
+static const struct target_desc *
+ppc_linux_core_read_description (struct gdbarch *gdbarch,
+				 struct target_ops *target,
+				 bfd *abfd)
+{
+  asection *altivec = bfd_get_section_by_name (abfd, ".reg-ppc-vmx");
+  asection *section = bfd_get_section_by_name (abfd, ".reg");
+  if (! section)
+    return NULL;
+
+  switch (bfd_section_size (abfd, section))
+    {
+    case 48 * 4:
+      return altivec? tdesc_powerpc_altivec32l : tdesc_powerpc_32l;
+
+    case 48 * 8:
+      return altivec? tdesc_powerpc_altivec64l : tdesc_powerpc_64l;
+
+    default:
+      return NULL;
+    }
+}
+
 static void
 ppc_linux_init_abi (struct gdbarch_info info,
                     struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  struct tdesc_arch_data *tdesc_data = (void *) info.tdep_info;
 
   /* PPC GNU/Linux uses either 64-bit or 128-bit long doubles; where
      128-bit, they are IBM long double, not IEEE quad long double as
@@ -914,6 +1030,9 @@ ppc_linux_init_abi (struct gdbarch_info 
   set_gdbarch_convert_from_func_ptr_addr
     (gdbarch, ppc_linux_convert_from_func_ptr_addr);
 
+  /* Handle inferior calls during interrupted system calls.  */
+  set_gdbarch_write_pc (gdbarch, ppc_linux_write_pc);
+
   if (tdep->wordsize == 4)
     {
       /* Until November 2001, gcc did not comply with the 32 bit SysV
@@ -951,10 +1070,33 @@ ppc_linux_init_abi (struct gdbarch_info 
       tramp_frame_prepend_unwinder (gdbarch, &ppc64_linux_sighandler_tramp_frame);
     }
   set_gdbarch_regset_from_core_section (gdbarch, ppc_linux_regset_from_core_section);
+  set_gdbarch_core_read_description (gdbarch, ppc_linux_core_read_description);
 
   /* Enable TLS support.  */
   set_gdbarch_fetch_tls_load_module_address (gdbarch,
                                              svr4_fetch_objfile_link_map);
+
+  if (tdesc_data)
+    {
+      const struct tdesc_feature *feature;
+
+      /* If we have target-described registers, then we can safely
+         reserve a number for PPC_ORIG_R3_REGNUM and PPC_TRAP_REGNUM
+	 (whether they are described or not).  */
+      gdb_assert (gdbarch_num_regs (gdbarch) <= PPC_ORIG_R3_REGNUM);
+      set_gdbarch_num_regs (gdbarch, PPC_TRAP_REGNUM + 1);
+
+      /* If they are present, then assign them to the reserved number.  */
+      feature = tdesc_find_feature (info.target_desc,
+                                    "org.gnu.gdb.power.linux");
+      if (feature != NULL)
+	{
+	  tdesc_numbered_register (feature, tdesc_data,
+				   PPC_ORIG_R3_REGNUM, "orig_r3");
+	  tdesc_numbered_register (feature, tdesc_data,
+				   PPC_TRAP_REGNUM, "trap");
+	}
+    }
 }
 
 void
@@ -968,4 +1110,11 @@ _initialize_ppc_linux_tdep (void)
                          ppc_linux_init_abi);
   gdbarch_register_osabi (bfd_arch_rs6000, bfd_mach_rs6k, GDB_OSABI_LINUX,
                          ppc_linux_init_abi);
+
+  /* Initialize the Linux target descriptions.  */
+  initialize_tdesc_powerpc_32l ();
+  initialize_tdesc_powerpc_altivec32l ();
+  initialize_tdesc_powerpc_64l ();
+  initialize_tdesc_powerpc_altivec64l ();
+  initialize_tdesc_powerpc_e500l ();
 }
diff -urNp gdb-orig/gdb/ppc-linux-tdep.h gdb-head/gdb/ppc-linux-tdep.h
--- gdb-orig/gdb/ppc-linux-tdep.h	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/ppc-linux-tdep.h	2008-05-03 14:56:01.644091927 +0200
@@ -0,0 +1,48 @@
+/* Target-dependent code for GDB, the GNU debugger.
+
+   Copyright (C) 2008 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef PPC_LINUX_TDEP_H
+#define PPC_LINUX_TDEP_H
+
+struct regset;
+
+/* From ppc-linux-tdep.c ... */
+const struct regset *ppc_linux_gregset (int);
+const struct regset *ppc_linux_fpregset (void);
+
+/* Extra register number constants.  The Linux kernel stores a
+   "trap" code and the original value of r3 into special "registers";
+   these need to be saved and restored when performing an inferior
+   call while the inferior was interrupted within a system call.  */
+enum {
+  PPC_ORIG_R3_REGNUM = PPC_NUM_REGS,
+  PPC_TRAP_REGNUM,
+};
+
+/* Return 1 if PPC_ORIG_R3_REGNUM and PPC_TRAP_REGNUM are usable.  */
+int ppc_linux_trap_reg_p (struct gdbarch *gdbarch);
+
+/* Linux target descriptions.  */
+extern struct target_desc *tdesc_powerpc_32l;
+extern struct target_desc *tdesc_powerpc_altivec32l;
+extern struct target_desc *tdesc_powerpc_e500l;
+extern struct target_desc *tdesc_powerpc_64l;
+extern struct target_desc *tdesc_powerpc_altivec64l;
+
+#endif /* PPC_LINUX_TDEP_H */
diff -urNp gdb-orig/gdb/ppc-tdep.h gdb-head/gdb/ppc-tdep.h
--- gdb-orig/gdb/ppc-tdep.h	2008-04-23 00:13:17.000000000 +0200
+++ gdb-head/gdb/ppc-tdep.h	2008-05-03 14:57:54.086928732 +0200
@@ -27,7 +27,7 @@ struct value;
 struct regcache;
 struct type;
 
-/* From ppc-linux-tdep.c... */
+/* From ppc-sysv-tdep.c ... */
 enum return_value_convention ppc_sysv_abi_return_value (struct gdbarch *gdbarch,
 							struct type *func_type,
 							struct type *valtype,
@@ -56,10 +56,6 @@ CORE_ADDR ppc64_sysv_abi_push_dummy_call
 					  CORE_ADDR struct_addr);
 CORE_ADDR ppc64_sysv_abi_adjust_breakpoint_address (struct gdbarch *gdbarch,
 						    CORE_ADDR bpaddr);
-int ppc_linux_memory_remove_breakpoint (struct gdbarch *, struct bp_target_info *);
-struct link_map_offsets *ppc_linux_svr4_fetch_link_map_offsets (void);
-const struct regset *ppc_linux_gregset (int);
-const struct regset *ppc_linux_fpregset (void);
 
 enum return_value_convention ppc64_sysv_abi_return_value (struct gdbarch *gdbarch,
 							  struct type *func_type,
@@ -107,6 +103,12 @@ struct ppc_reg_offsets
   int vrsave_offset;
 };
 
+extern void ppc_supply_reg (struct regcache *regcache, int regnum,
+			    const gdb_byte *regs, size_t offset, int regsize);
+
+extern void ppc_collect_reg (const struct regcache *regcache, int regnum,
+			     gdb_byte *regs, size_t offset, int regsize);
+
 /* Supply register REGNUM in the general-purpose register set REGSET
    from the buffer specified by GREGS and LEN to register cache
    REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
@@ -268,6 +270,4 @@ enum {
 /* Estimate for the maximum number of instrctions in a function epilogue.  */
 #define PPC_MAX_EPILOGUE_INSTRUCTIONS  52
 
-extern struct target_desc *tdesc_powerpc_e500;
-
 #endif /* ppc-tdep.h */
diff -urNp gdb-orig/gdb/regformats/reg-ppc64.dat gdb-head/gdb/regformats/reg-ppc64.dat
--- gdb-orig/gdb/regformats/reg-ppc64.dat	2008-02-28 06:57:45.000000000 +0100
+++ gdb-head/gdb/regformats/reg-ppc64.dat	1970-01-01 01:00:00.000000000 +0100
@@ -1,76 +0,0 @@
-name:ppc64
-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
diff -urNp gdb-orig/gdb/regformats/reg-ppc.dat gdb-head/gdb/regformats/reg-ppc.dat
--- gdb-orig/gdb/regformats/reg-ppc.dat	2008-02-28 06:57:45.000000000 +0100
+++ gdb-head/gdb/regformats/reg-ppc.dat	1970-01-01 01:00:00.000000000 +0100
@@ -1,76 +0,0 @@
-name:ppc
-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
diff -urNp gdb-orig/gdb/regformats/rs6000/powerpc-32.dat gdb-head/gdb/regformats/rs6000/powerpc-32.dat
--- gdb-orig/gdb/regformats/rs6000/powerpc-32.dat	2008-04-23 00:13:17.000000000 +0200
+++ gdb-head/gdb/regformats/rs6000/powerpc-32.dat	1970-01-01 01:00:00.000000000 +0100
@@ -1,109 +0,0 @@
-# DO NOT EDIT: generated from rs6000/powerpc-32.xml
-name:powerpc_32
-xmltarget:powerpc-32.xml
-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
diff -urNp gdb-orig/gdb/regformats/rs6000/powerpc-32l.dat gdb-head/gdb/regformats/rs6000/powerpc-32l.dat
--- gdb-orig/gdb/regformats/rs6000/powerpc-32l.dat	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/regformats/rs6000/powerpc-32l.dat	2008-05-03 13:30:51.495771712 +0200
@@ -0,0 +1,77 @@
+# DO NOT EDIT: generated from rs6000/powerpc-32l.xml
+name:powerpc_32l
+xmltarget:powerpc-32l.xml
+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
+32:orig_r3
+32:trap
diff -urNp gdb-orig/gdb/regformats/rs6000/powerpc-64.dat gdb-head/gdb/regformats/rs6000/powerpc-64.dat
--- gdb-orig/gdb/regformats/rs6000/powerpc-64.dat	2008-04-23 00:13:17.000000000 +0200
+++ gdb-head/gdb/regformats/rs6000/powerpc-64.dat	1970-01-01 01:00:00.000000000 +0100
@@ -1,109 +0,0 @@
-# DO NOT EDIT: generated from rs6000/powerpc-64.xml
-name:powerpc_64
-xmltarget:powerpc-64.xml
-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
diff -urNp gdb-orig/gdb/regformats/rs6000/powerpc-64l.dat gdb-head/gdb/regformats/rs6000/powerpc-64l.dat
--- gdb-orig/gdb/regformats/rs6000/powerpc-64l.dat	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/regformats/rs6000/powerpc-64l.dat	2008-05-03 13:30:51.769732288 +0200
@@ -0,0 +1,77 @@
+# DO NOT EDIT: generated from rs6000/powerpc-64l.xml
+name:powerpc_64l
+xmltarget:powerpc-64l.xml
+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
+64:orig_r3
+64:trap
diff -urNp gdb-orig/gdb/regformats/rs6000/powerpc-altivec32l.dat gdb-head/gdb/regformats/rs6000/powerpc-altivec32l.dat
--- gdb-orig/gdb/regformats/rs6000/powerpc-altivec32l.dat	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/regformats/rs6000/powerpc-altivec32l.dat	2008-05-03 13:30:51.608755453 +0200
@@ -0,0 +1,111 @@
+# DO NOT EDIT: generated from rs6000/powerpc-altivec32l.xml
+name:powerpc_altivec32l
+xmltarget:powerpc-altivec32l.xml
+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
+32:orig_r3
+32:trap
+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
diff -urNp gdb-orig/gdb/regformats/rs6000/powerpc-altivec64l.dat gdb-head/gdb/regformats/rs6000/powerpc-altivec64l.dat
--- gdb-orig/gdb/regformats/rs6000/powerpc-altivec64l.dat	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/regformats/rs6000/powerpc-altivec64l.dat	2008-05-03 13:30:51.879716460 +0200
@@ -0,0 +1,111 @@
+# DO NOT EDIT: generated from rs6000/powerpc-altivec64l.xml
+name:powerpc_altivec64l
+xmltarget:powerpc-altivec64l.xml
+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
+64:orig_r3
+64:trap
+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
diff -urNp gdb-orig/gdb/regformats/rs6000/powerpc-e500.dat gdb-head/gdb/regformats/rs6000/powerpc-e500.dat
--- gdb-orig/gdb/regformats/rs6000/powerpc-e500.dat	2008-03-27 14:11:52.000000000 +0100
+++ gdb-head/gdb/regformats/rs6000/powerpc-e500.dat	1970-01-01 01:00:00.000000000 +0100
@@ -1,77 +0,0 @@
-# DO NOT EDIT: generated from rs6000/powerpc-e500.xml
-name:powerpc_e500
-xmltarget:powerpc-e500.xml
-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
diff -urNp gdb-orig/gdb/regformats/rs6000/powerpc-e500l.dat gdb-head/gdb/regformats/rs6000/powerpc-e500l.dat
--- gdb-orig/gdb/regformats/rs6000/powerpc-e500l.dat	1970-01-01 01:00:00.000000000 +0100
+++ gdb-head/gdb/regformats/rs6000/powerpc-e500l.dat	2008-05-03 13:30:51.689743798 +0200
@@ -0,0 +1,79 @@
+# DO NOT EDIT: generated from rs6000/powerpc-e500l.xml
+name:powerpc_e500l
+xmltarget:powerpc-e500l.xml
+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:
+32:orig_r3
+32:trap
+64:acc
+32:spefscr
diff -urNp gdb-orig/gdb/rs6000-tdep.c gdb-head/gdb/rs6000-tdep.c
--- gdb-orig/gdb/rs6000-tdep.c	2008-05-01 02:08:55.000000000 +0200
+++ gdb-head/gdb/rs6000-tdep.c	2008-05-03 16:04:08.820349125 +0200
@@ -64,6 +64,7 @@
 #include "rs6000-tdep.h"
 
 #include "features/rs6000/powerpc-32.c"
+#include "features/rs6000/powerpc-altivec32.c"
 #include "features/rs6000/powerpc-403.c"
 #include "features/rs6000/powerpc-403gc.c"
 #include "features/rs6000/powerpc-505.c"
@@ -72,6 +73,7 @@
 #include "features/rs6000/powerpc-603.c"
 #include "features/rs6000/powerpc-604.c"
 #include "features/rs6000/powerpc-64.c"
+#include "features/rs6000/powerpc-altivec64.c"
 #include "features/rs6000/powerpc-7400.c"
 #include "features/rs6000/powerpc-750.c"
 #include "features/rs6000/powerpc-860.c"
@@ -376,7 +378,7 @@ rs6000_register_sim_regno (struct gdbarc
 /* REGS + OFFSET contains register REGNUM in a field REGSIZE wide.
    Write the register to REGCACHE.  */
 
-static void
+void
 ppc_supply_reg (struct regcache *regcache, int regnum, 
 		const gdb_byte *regs, size_t offset, int regsize)
 {
@@ -397,7 +399,7 @@ ppc_supply_reg (struct regcache *regcach
 /* Read register REGNUM from REGCACHE and store to REGS + OFFSET
    in a field REGSIZE wide.  Zero pad as necessary.  */
 
-static void
+void
 ppc_collect_reg (const struct regcache *regcache, int regnum,
 		 gdb_byte *regs, size_t offset, int regsize)
 {
@@ -2857,7 +2859,7 @@ struct variant
 static struct variant variants[] =
 {
   {"powerpc", "PowerPC user-level", bfd_arch_powerpc,
-   bfd_mach_ppc, &tdesc_powerpc_32},
+   bfd_mach_ppc, &tdesc_powerpc_altivec32},
   {"power", "POWER user-level", bfd_arch_rs6000,
    bfd_mach_rs6k, &tdesc_rs6000},
   {"403", "IBM PowerPC 403", bfd_arch_powerpc,
@@ -2885,7 +2887,7 @@ static struct variant variants[] =
 
   /* 64-bit */
   {"powerpc64", "PowerPC 64-bit user-level", bfd_arch_powerpc,
-   bfd_mach_ppc64, &tdesc_powerpc_64},
+   bfd_mach_ppc64, &tdesc_powerpc_altivec64},
   {"620", "Motorola PowerPC 620", bfd_arch_powerpc,
    bfd_mach_ppc_620, &tdesc_powerpc_64},
   {"630", "Motorola PowerPC 630", bfd_arch_powerpc,
@@ -3902,6 +3904,7 @@ _initialize_rs6000_tdep (void)
 
   /* Initialize the standard target descriptions.  */
   initialize_tdesc_powerpc_32 ();
+  initialize_tdesc_powerpc_altivec32 ();
   initialize_tdesc_powerpc_403 ();
   initialize_tdesc_powerpc_403gc ();
   initialize_tdesc_powerpc_505 ();
@@ -3910,6 +3913,7 @@ _initialize_rs6000_tdep (void)
   initialize_tdesc_powerpc_603 ();
   initialize_tdesc_powerpc_604 ();
   initialize_tdesc_powerpc_64 ();
+  initialize_tdesc_powerpc_altivec64 ();
   initialize_tdesc_powerpc_7400 ();
   initialize_tdesc_powerpc_750 ();
   initialize_tdesc_powerpc_860 ();

-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]