gdb/gdb-bz578250-avx-10of10.patch

8272 lines
266 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[ Backported. ]
git://git.kernel.org/pub/scm/devel/gdb/hjl/avx.git
hjl/avxh
aebae36c2a8b73ae51319fff54fc39f220f0824a
--- ./bfd/ChangeLog.xstate 1970-01-01 01:00:00.000000000 +0100
+++ ./bfd/ChangeLog.xstate 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,14 @@
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * elf.c (elfcore_grok_note): Replace NT_386_XSTATE with
+ NT_X86_XSTATE.
+ (elfcore_write_xstatereg): Likewise.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * elf-bfd.h (elfcore_write_xstatereg): New.
+
+ * elf.c (elfcore_grok_xstatereg): New.
+ (elfcore_write_xstatereg): Likewise.
+ (elfcore_grok_note): Handle NT_386_XSTATE.
+ (elfcore_write_register_note): Handle .reg-xstate section.
--- ./gdb/ChangeLog.avx 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/ChangeLog.avx 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,306 @@
+2010-03-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common/i386-xstate.h (I386_XSTATE_SSE_MASK_STRING): Removed.
+ (I386_XSTATE_AVX_MASK_STRING): Likewise.
+ (I386_XSTATE_MAX_MASK_STRING): Likewise.
+ (I386_XSTATE_SSE_SIZE_STRING): Likewise.
+ (I386_XSTATE_AVX_SIZE_STRING): Likewise.
+ (I386_XSTATE_MAX_SIZE_STRING): Likewise.
+
+ * i386-tdep.c (i386_gdbarch_init): Replace
+ I386_XSTATE_MAX_SIZE_STRING/I386_XSTATE_MAX_MASK_STRING with
+ I386_XSTATE_MAX_SIZE/I386_XSTATE_MAX_MASK.
+
+2010-03-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_supply_xstateregset): Don't check
+ sizeof_xstateregset.
+ (amd64_collect_xstateregset): Likewise.
+ (amd64_regset_from_core_section): Likewise.
+ (amd64_init_abi): Don't set sizeof_xstateregset.
+
+ * i386-tdep.c (i386_supply_xstateregset): Don't check
+ sizeof_xstateregset.
+ (i386_collect_xstateregset): Likewise.
+ (i386_regset_from_core_section): Likewise.
+ (i386_gdbarch_init): Don't set sizeof_xstateregset.
+
+ * i386-tdep.h (gdbarch_tdep): Remove sizeof_xstateregset.
+
+2010-03-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): Call
+ i386_linux_update_xstateregset.
+ * i386-linux-nat.c (i386_linux_read_description): Likewise.
+
+ * i386-linux-tdep.c (i386_linux_update_xstateregset): New.
+ * i386-linux-tdep.h (i386_linux_update_xstateregset): Likewise.
+
+2010-03-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (xstate_size): New.
+ (xstate_size_n_of_int64): Likewise.
+ (amd64_linux_fetch_inferior_registers): Updated.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (amd64_linux_read_description): Use I386_XSTATE_SSE_SIZE
+ instead of I386_XSTATE_MAX_SIZE. Set xstate_size and
+ xstate_size_n_of_int64.
+
+ * i386-linux-nat.c (xstate_size): New.
+ (xstate_size_n_of_int64): Likewise.
+ (fetch_xstateregs): Updated.
+ (store_xstateregs): Likewise.
+ (i386_linux_read_description): Use I386_XSTATE_SSE_SIZE
+ instead of I386_XSTATE_MAX_SIZE. Set xstate_size and
+ xstate_size_n_of_int64.
+
+ * common/i386-xstate.h (I386_XSTATE_SIZE): New.
+
+2010-03-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/djgpp/fnchange.lst: Add x86 AVX XML files.
+
+2010-03-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (XSTATE_MAX_SIZE_N_OF_INT64): New.
+ (amd64_linux_fetch_inferior_registers): Updated.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (amd64_linux_read_description): Likewise.
+ * amd64-linux-tdep.c (amd64_linux_core_read_description): Likewise.
+
+ * i386-linux-nat.c (XSTATE_MAX_SIZE_N_OF_INT64): New.
+ (fetch_xstateregs): Updated.
+ (store_xstateregs): Likewise.
+ (i386_linux_read_description): Likewise.
+
+ * i386-linux-tdep.c (i386_linux_core_read_xcr0): Updated.
+ (i386_linux_core_read_xcr0): Likewise.
+ (i386_linux_core_read_description): Likewise.
+
+ * i386-tdep.c (i386_register_reggroup_p): Updated.
+ (i386_validate_tdesc_p): Likewise.
+ (i386_gdbarch_init): Likewise.
+
+ * i387-tdep.c (i387_supply_fxsave): Updated.
+ (i387_collect_xsave): Likewise.
+
+ * common/i386-xstate.h: Change XSTATE to I386_XSTATE in macros.
+
+2010-03-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (i386-xstate.o): Removed.
+
+ * amd64-linux-nat.c (amd64_linux_fetch_inferior_registers): Use
+ XSTATE_MAX_SIZE_N_OF_INT64 and XSTATE_MAX_SIZE.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (amd64_linux_read_description): Add static xcr0 and get it
+ from I386_LINUX_XSAVE_XCR0_OFFSET. Use XSTATE_MAX_SIZE_N_OF_INT64
+ and XSTATE_MAX_SIZE.
+ (_initialize_amd64_linux_nat): Don't call i386_xstate_init.
+
+ * configure.ac: Remove check for cpuid.h.
+ * config.in: Regenerated.
+ * configure: Likewise.
+
+ * i386-linux-nat.c (fetch_xstateregs): Use
+ XSTATE_MAX_SIZE_N_OF_INT64 and XSTATE_MAX_SIZE.
+ (store_xstateregs): Likewise.
+ (i386_linux_read_description): Add static xcr0 and get it
+ from I386_LINUX_XSAVE_XCR0_OFFSET. Use XSTATE_MAX_SIZE_N_OF_INT64
+ and XSTATE_MAX_SIZE.
+ (_initialize_i386_linux_nat): Don't call i386_xstate_init.
+
+ * common/i386-cpuid.h: Removed.
+ * common/i386-xstate.c: Likewise.
+
+ * common/i386-xstate.h (xstate_status): Removed.
+ (i386_xstate_type): Likewise.
+ (i386_xstate): Likewise.
+ (i386_xstate_init): Likewise.
+ (XSTATE_MAX_SIZE_N_OF_INT64): New.
+
+ * config/i386/linux.mh (NATDEPFILES): Remove i386-xstate.o.
+ * config/i386/linux64.mh (NATDEPFILES): Likewise.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_g_packet_size): Make it const.
+ * amd64-tdep.c (amd64_g_packet_size): Likewise.
+ * i386-linux-tdep.c (i386_linux_g_packet_size): Likewise.
+ * i386-tdep.c (i386_g_packet_size): Likewise.
+
+ * i386-linux-tdep.c (i386_linux_init_abi): Remove
+ i386_linux_g_packet_size.
+
+ * i386-tdep.c (i386_register_g_packet_guesses): Updated.
+ * i386-tdep.h (i386_register_g_packet_guesses): Likewise.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_g_packet_size): Add key.
+ * i386-linux-tdep.c (i386_linux_g_packet_size): Likewise.
+ * i386-tdep.c (i386_g_packet_size): Likewise.
+
+ * amd64-tdep.c (amd64_g_packet_size): New.
+ (amd64_init_abi): Call i386_register_g_packet_guesses.
+
+ * i386-tdep.c (I386_PROPERTY_SSE): Removed.
+ (I386_PROPERTY_AVX): Likewise.
+ (i386_tdesc_sse): Likewise.
+ (i386_tdesc_avx): Likewise.
+ (i386_init_tdesc): Likewise.
+ (i386_register_g_packet_guesses): Updated.
+ (i386_gdbarch_vector_unit_init): Likewise.
+
+ * i386-tdep.h (I386_PROPERTY_SSE): New.
+ (I386_PROPERTY_AVX): Likewise.
+ (AMD64_PROPERTY_SSE): Likewise.
+ (AMD64_PROPERTY_AVX): Likewise.
+ (i386_g_packet_size): Add key.
+ (i386_register_g_packet_guesses): Updated.
+
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regformats/reg-i386-avx-linux.dat: Add a comment for osabi.
+ * regformats/reg-x86-64-avx-linux.dat: Likewise.
+
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regformats/reg-i386-avx-linux.dat: Add a comment for xmlarch.
+ * regformats/reg-i386-avx.dat: Likewise.
+ * regformats/reg-x86-64-avx-linux.dat: Likewise.
+ * regformats/reg-x86-64-avx.dat: Likewise.
+
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_g_packet_size): New.
+ (amd64_linux_init_abi): Pass amd64_linux_g_packet_size to
+ i386_register_g_packet_guesses.
+
+ * i386-linux-tdep.c (i386_linux_g_packet_size): New.
+ (i386_linux_init_abi): Pass i386_linux_g_packet_size to
+ i386_register_g_packet_guesses.
+
+ * i386-tdep.c (i386_register_g_packet_guesses): Updated to
+ take an array of the g/G packet sizes.
+ (i386_g_packet_size): New.
+ (i386_gdbarch_init): Pass i386_g_packet_size to
+ i386_register_g_packet_guesses.
+
+ * i386-tdep.h (i386_g_packet_size_index): New.
+ (i386_register_g_packet_guesses): Updated.
+
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.h (AMD64_G_PACKET_SIZE_AVX): Correct comments.
+ * i386-tdep.h (I386_G_PACKET_SIZE_AVX): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_fxsave): Remove vector unit check.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Remove the
+ duplicate.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Call
+ i386_xstate_init and initialize vector_unit properly.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Initialize
+ vector_unit only if target_desc isn't NULL.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_sse_type): Renamed to ...
+ (i386_vector_type): This. Updated.
+ (i386_register_type): Updated.
+
+ * i386-tdep.h (i386_sse_type): Renamed to ...
+ (i386_vector_type): This.
+
+ * amd64-tdep.c (amd64_register_type): Updated.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_register_name): Replace sse_unit with
+ vector_unit.
+ (amd64_init_abi): Likewise.
+ * i386-tdep.c (i386_register_name): Likewise.
+ (i386_sse_type): Likewise.
+ (i386_register_g_packet_guesses): Likewise.
+ (i386_gdbarch_sse_unit_init): Renamed to ...
+ (i386_gdbarch_vector_unit_init): This.
+ (i386_gdbarch_init): Updated.
+
+ * i386-tdep.h (x86_sse_unit): Renamed to ...
+ (x86_vector_unit): This.
+ (i386_gdbarch_sse_unit_init): Renamed to ...
+ (i386_gdbarch_vector_unit_init): This.
+
+ * i387-tdep.c (i387_supply_fxsave): Replace sse_unit with
+ vector_unit.
+
+2009-10-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_init_abi): Call
+ register_remote_g_packet_guess.
+
+ * amd64-tdep.c (amd64_register_names): Renamed to ...
+ (amd64_sse_register_names): This. Remove AVX registers.
+ (amd64_avx_register_names): New.
+ (AMD64_NUM_REGS): Updated.
+ (amd64_register_name): Handle sse_unit.
+ (amd64_register_type): Remove AVX registers.
+ (amd64_init_abi): Call i386_gdbarch_sse_unit_init to
+ initialize sse_unit.
+
+ * amd64-tdep.h (AMD64_G_PACKET_SIZE_SSE): New.
+ (AMD64_G_PACKET_SIZE_AVX): Likewise.
+
+ * defs.h (MAX_REGISTER_SIZE): Increase to 32.
+
+ * i386-linux-tdep.c (i386_linux_init_abi): Call
+ i386_register_g_packet_guesses.
+
+ * i386-tdep.c: Include "remote.h" and "target-descriptions.h".
+ (I386_PROPERTY_SSE): New.
+ (I386_PROPERTY_AVX): Likewise.
+ (i386_tdesc_sse): Likewise.
+ (i386_tdesc_avx): Likewise.
+ (i386_avx_register_names): Likewise.
+ (i386_vec128_type): Likewise.
+ (i386_vec256_type): Likewise.
+ (i386_init_tdesc): Likewise.
+ (i386_register_g_packet_guesses): Likewise.
+ (i386_gdbarch_sse_unit_init): Likewise.
+ (i386_register_names): Renamed to ...
+ (i386_sse_register_names): This.
+ (i386_num_register_names): Updated.
+ (i386_register_name): Handle sse_unit.
+ (i386_sse_type): Likewise.
+ (i386_gdbarch_init): Call i386_gdbarch_sse_unit_init to
+ initialize sse_unit. Call i386_register_g_packet_guesses.
+ (_initialize_i386_tdep): Call i386_tdesc_init.
+
+ * i386-tdep.h (x86_sse_unit): New.
+ (I386_G_PACKET_SIZE_SSE): Likewise.
+ (I386_G_PACKET_SIZE_AVX): Likewise.
+ (i386_register_g_packet_guesses): Likewise.
+ (i386_gdbarch_sse_unit_init): Likewise.
+ (gdbarch_tdep): Add sse_unit.
+ (I386_MAX_REGISTER_SIZE): Increase to 32.
+
+ * i387-tdep.c (i387_supply_fxsave): Assert sse_unit on SSE
+ registers.
+
+ * regformats/reg-i386-avx-linux.dat: New.
+ * regformats/reg-i386-avx.dat: Likewise.
+ * regformats/reg-x86-64-avx-linux.dat: Likewise.
+ * regformats/reg-x86-64-avx.dat: Likewise.
+
+ * regformats/reg-x86-64.dat: Add xmlarch.
--- ./gdb/ChangeLog.pseudo 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/ChangeLog.pseudo 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,189 @@
+2010-02-25 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_mmx_regnum_p): Optimized.
+ (i386_byte_regnum_p): Likewise.
+ (i386_word_regnum_p): Likewise.
+ (i386_dword_regnum_p): Likewise.
+
+2010-02-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_register_reggroup_p): Minimize function
+ calls.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_register_reggroup_p): Don't include pseudo
+ registers, except for MXX, in any register groups.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Set mm0_regnum only once.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_pseudo_register_name): Don't check MMX
+ pseudo registers. Call i386_pseudo_register_name.
+ (amd64_init_abi): Restore num_xmm_regs.
+
+ * i386-tdep.c (i386_mmx_names): Make it static.
+ (i386_mmx_regnum_p): Likewise.
+ (i386_pseudo_register_name): Make it global.
+
+ * i386-tdep.h (i386_mmx_regnum_p): Removed.
+ (i386_mmx_names): Likewise.
+ (i386_pseudo_register_name): New.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Call set_gdbarch_num_pseudo_regs
+ before tdesc_use_registers.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_pseudo_register_read): Check invalid
+ register number.
+ (i386_pseudo_register_write): Likewise.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_pseudo_register_read): New.
+ (amd64_pseudo_register_write): Likewise.
+ (amd64_init_abi): Call set_gdbarch_pseudo_register_read and
+ set_gdbarch_pseudo_register_write.
+
+ * i386-tdep.c (i386_pseudo_register_read): Make it global.
+ Don't handle 64bit nor DWORD.
+ (i386_pseudo_register_write): Likewise.
+
+ * i386-tdep.h (i386_pseudo_register_read): New.
+ (i386_pseudo_register_write): Likewise.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_byte_names): Make it static.
+ (amd64_word_names): Likewise.
+ (amd64_dword_names): Likewise.
+ (amd64_pseudo_register_name): New.
+ (amd64_init_abi): Set num_byte_regs, num_word_regs, num_dword_regs
+ and num_mmx_regs. Call set_tdesc_pseudo_register_name.
+
+ * i386-tdep.c (i386_mmx_names): Make it global.
+ (i386_mmx_regnum_p): Likewise.
+ (i386_byte_regnum_p): Likewise.
+ (i386_word_regnum_p): Likewise.
+ (i386_dword_regnum_p): Likewise.
+ (i386_pseudo_register_name): Remove XBFD64.
+ (i386_pseudo_register_read): Remove BFD64.
+ (i386_pseudo_register_write): Likewise.
+ (i386_gdbarch_init): Move set_gdbarch_pseudo_register_read and
+ set_gdbarch_pseudo_register_write before gdbarch_init_osabi.
+
+ * i386-tdep.h (i386_byte_regnum_p): New.
+ (i386_word_regnum_p): Likewise.
+ (i386_dword_regnum_p): Likewise.
+ (i386_mmx_regnum_p): Likewise.
+ (i386_mmx_names): Likewise.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (AMD64_NUM_REGS): Restored.
+
+ * amd64-tdep.h (AMD64_NUM_GREGS): Removed.
+
+2010-02-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (AMD64_NUM_REGS): Removed.
+
+ * amd64-tdep.h (AMD64_NUM_GREGS): New.
+
+ * i386-nto-tdep.c (i386nto_regset_id): Replace I386_NUM_FREGS
+ with I387_NUM_REGS.
+ * i386-tdep.c (i386_go32_init_abi): Likewise.
+ (i386_gdbarch_init): Likewise.
+
+ * i386-tdep.h (i386_regnum): Add I386_MXCSR_REGNUM.
+ (I386_NUM_FREGS): Removed.
+ (I386_SSE_NUM_REGS): Defined with I386_MXCSR_REGNUM.
+
+ * i387-tdep.h (I387_NUM_REGS): New.
+
+2010-02-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_init_abi): Don't set num_xmm_regs.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_register_reggroup_p): Call
+ i386_register_reggroup_p instead of default_register_reggroup_p.
+
+ * amd64-tdep.c (amd64_num_pseudo_regs): Removed.
+ (amd64_init_abi): Don't call set_gdbarch_num_pseudo_regs. Don't
+ set mm0_regnum.
+
+ * i386-tdep.c (i386_num_mmx_regs): Removed.
+ (i386_num_pseudo_regs): Likewise.
+ (i386_mmx_regnum_p): Updated.
+ (i386_register_reggroup_p): Don't include pseudo byte, word,
+ dword registers in general_reggroup.
+ (i386_gdbarch_init): Updated.
+
+ * i386-tdep.h (gdbarch_tdep): Add num_mmx_regs.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_word_names): Add a missing ','.
+ (amd64_dword_names): New.
+ (amd64_num_pseudo_regs): Updated.
+
+ * amd64-tdep.h (amd64_dword_names): New.
+
+ * i386-tdep.c (i386_dword_regnum_p): New.
+ (i386_pseudo_register_name): Use i386_dword_regnum_p.
+ (i386_pseudo_register_type): Likewise.
+ (i386_pseudo_register_read): Likewise.
+ (i386_pseudo_register_write): Likewise.
+ (i386_gdbarch_init): Set num_dword_regs and eax_regnum.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Optimized.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_byte_names): New.
+ (amd64_word_names): Likewise.
+ (amd64_num_pseudo_regs): Likewise.
+ (amd64_init_abi): Call set_gdbarch_num_pseudo_regs with
+ amd64_num_pseudo_regs,
+
+ * amd64-tdep.h (amd64_byte_names): New.
+ (amd64_word_names): Likewise.
+
+ * i386-tdep.c (i386_num_byte_regs): Removed.
+ (i386_num_word_regs): Likewise.
+ (i386_byte_regnum_p): Updated.
+ (i386_word_regnum_p): Likewise.
+ (i386_pseudo_register_name): Support 64bit.
+ (i386_pseudo_register_read): Likewise.
+ (i386_pseudo_register_write): Likewise.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_byte_names): New.
+ (i386_word_names): Likewise.
+ (i386_num_byte_regs): Likewise.
+ (i386_num_word_regs): Likewise.
+ (i386_num_pseudo_regs): Likewise.
+ (i386_byte_regnum_p): Likewise.
+ (i386_word_regnum_p): Likewise.
+ (i386_pseudo_register_name): Handle byte and word pseudo-registers.
+ (i386_pseudo_register_type): Likewise.
+ (i386_pseudo_register_read): Likewise.
+ (i386_pseudo_register_write): Likewise.
+ (i386_gdbarch_init): Call set_gdbarch_num_pseudo_regs with
+ i386_num_pseudo_regs. Set num_byte_regs, num_word_regs,
+ al_regnum, ax_regnum. Put MMX pseudo-registers after word
+ pseudo-registers.
+
+ * i386-tdep.h (gdbarch_tdep): Add num_byte_regs, al_regnum,
+ num_word_regs, ax_regnum, num_dword_regs and eax_regnum.
--- ./gdb/ChangeLog.xcr 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/ChangeLog.xcr 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,1304 @@
+2010-04-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): Call
+ i386_linux_update_xstateregset.
+
+2010-04-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_process_record): Replace i386_sse_regnum_p
+ with i386_xmm_regnum_p.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): Call
+ amd64_linux_update_xstateregset instead of
+ i386_linux_update_xstateregset.
+
+ * amd64-linux-tdep.c (amd64_linux_regset_sections): Make it
+ static.
+ (amd64_linux_update_xstateregset): New.
+
+ * amd64-linux-tdep.h (amd64_linux_regset_sections): Removed.
+ (amd64_linux_update_xstateregset): New.
+
+ * i386-linux-nat.c (i386_linux_read_description): Remove
+ i386_linux_regset_sections from i386_linux_update_xstateregset.
+
+ * i386-linux-tdep.c (i386_linux_regset_sections): Make it
+ static.
+ (i386_linux_update_xstateregset): Remove regset_sections. Use
+ i386_linux_regset_sections.
+
+ * i386-linux-tdep.h (i386_linux_regset_sections): Removed.
+ (i386_linux_update_xstateregset): Remove regset_sections.
+ i386_linux_regset_sections.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-nat.c (fetch_xstateregs): Don't cast &iov to int.
+ (store_xstateregs): Likewise.
+ (i386_linux_read_description): Don't cast &iov to long.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.h (I386_LINUX_XSAVE_XCR0_OFFSET): Update
+ comments.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (xstate_size): Removed.
+ (amd64_linux_fetch_inferior_registers): Replace xstate_size
+ with I386_XSTATE_MAX_SIZE.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (amd64_linux_read_description): Updated.
+
+ * i386-linux-nat.c (xstate_size): Removed.
+ (fetch_xstateregs): Replace xstate_size with
+ I386_XSTATE_MAX_SIZE.
+ (fetch_xstateregs): Likewise.
+ (i386_linux_read_description): Updated.
+
+ * common/i386-xstate.h (I386_XSTATE_MAX_SIZE): New.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): Replace
+ unsigned long long with uint64_t.
+ * amd64-linux-tdep.c (amd64_linux_core_read_description):
+ Likewise.
+ * i386-linux-nat.c (i386_linux_read_description): Likewise.
+ * i386-linux-tdep.h (i386_linux_core_read_xcr0): Likewise.
+
+ * i386-linux-tdep.c (i386_linux_core_read_xcr0): Replace
+ unsigned long long with uint64_t. Don't assert section size.
+ (i386_linux_core_read_description): Replace unsigned long long
+ with uint64_t.
+
+ * i386-tdep.c (i386_ymm_type): Fix typos in comments.
+ (i386_pseudo_register_read): Change 16byte to 128bits in
+ comments.
+ (i386_validate_tdesc_p): Update comments.
+ (i386_gdbarch_init): Likewise.
+
+ * i386-tdep.h (gdbarch_tdep): Replace unsigned long long with
+ uint64_t. Replace gdb with GDB in comments.
+
+2010-03-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Replace "x86=xml" with
+ "xmlRegisters+".
+
+2010-03-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (xstate_size_n_of_int64): Removed.
+ (amd64_linux_fetch_inferior_registers): Updated.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (amd64_linux_read_description): Likewise.
+
+ * i386-linux-nat.c (xstate_size_n_of_int64): Removed.
+ (fetch_xstateregs): Updated.
+ (store_xstateregs): Likewise.
+ (i386_linux_read_description): Likewise.
+
+2010-03-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Include "i386-xstate.h".
+ (PTRACE_GETREGSET): New.
+ (PTRACE_SETREGSET): Likewise.
+ * i386-linux-nat.c: Likewise.
+
+ * amd64-linux-tdep.c: Include "i386-xstate.h".
+
+ * config/i386/linux64.mh (NAT_FILE): Set to config/nm-linux.h.
+
+ * config/i386/nm-linux.h: Don't include
+ "config/i386/nm-linux-xstate.h".
+
+ * config/i386/nm-linux-xstate.h: Removed.
+ * config/i386/nm-linux64.h: Likewise.
+
+2010-03-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_xsave): Replace I386_XSTATE_MAX_MASK
+ with I386_XSTATE_AVX_MASK.
+
+ * common/i386-xstate.h (I386_XSTATE_MAX_MASK): Removed.
+ (I386_XSTATE_MAX_SIZE): Likewise.
+
+2010-03-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_register_reggroup_p): Replace
+ bit_I386_XSTATE_XXX with I386_XSTATE_XXX.
+ * i387-tdep.c (i387_supply_xsave): Likewise.
+ (i387_collect_xsave): Likewise.
+
+ * common/i386-xstate.h (bit_I386_XSTATE_XXX): Renamed to ...
+ (I386_XSTATE_XXX): This.
+ (I386_XSTATE_XXX_MASK): Replace bit_I386_XSTATE_XXX with
+ I386_XSTATE_XXX.
+ (I386_XSTATE_SIZE): Likewise.
+
+2010-03-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_dwarf_reg_to_regnum): Return %ymmN
+ register number for %xmmN if AVX is available.
+
+ * i386-tdep.c (i386_xmm_regnum_p): Make it global.
+ (i386_dbx_reg_to_regnum): Return %ymmN register number for
+ %xmmN if AVX is available.
+
+ * i386-tdep.h (i386_xmm_regnum_p): New.
+
+2010-03-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_init_abi): Replace AMD64_AVX_NUM_REGS
+ with AMD64_NUM_REGS.
+
+ * amd64-tdep.h (AMD64_AVX_NUM_REGS): Renamed to ...
+ (AMD64_NUM_REGS): This.
+
+ * i386-linux-nat.c (GETFPXREGS_SUPPLIES): Replace
+ I386_AVX_NUM_REGS with I386_SSE_NUM_REGS.
+ (GETXSTATEREGS_SUPPLIES): New.
+ (i386_linux_fetch_inferior_registers): Use GETXSTATEREGS_SUPPLIES.
+ (i386_linux_store_inferior_registers): Likewise.
+
+2010-03-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_gregset_reg_offset): Count 8
+ upper YMM registers.
+
+2010-03-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_register_reggroup_p): For all_group, don't
+ include upper YMM registers nor XMM registers when AVX is
+ supported.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_collect_xsave): Replace regcache_raw_read
+ with regcache_raw_collect.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_register_reggroup_p): Don't return 0
+ for uppper YMM nor XMM registers.
+
+ * i387-tdep.c (xsave_sse_offset): Removed.
+ (XSAVE_SSE_ADDR): Likewise.
+ (i387_supply_xsave): Replace XSAVE_SSE_ADDR with FXSAVE_ADDR.
+ (i387_collect_xsave): Likewise. Replace the second
+ regcache_raw_collect with memcpy.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (xsave_offset): Removed.
+ (XSAVE_ADDR): Likewise.
+ (xsave_sse_offset): New.
+ (XSAVE_SSE_ADDR): Likewise.
+ (xsave_avxh_offset): Likewise.
+ (XSAVE_AVXH_ADDR): Likewise.
+ (i387_supply_xsave): Updated.
+ (i387_collect_xsave): Likewise.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_xsave): Fix typos.
+ (i387_collect_xsave): Properly handle gcore.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_gregset64_reg_offset): Count
+ 16 upper YMM registers.
+ (amd64_linux_gregset32_reg_offset): Count 8 upper YMM registers.
+
+ * amd64-linux-tdep.h (AMD64_LINUX_ORIG_RAX_REGNUM): Replace
+ AMD64_MXCSR_REGNUM with AMD64_YMM15H_REGNUM.
+
+ * amd64-tdep.c (amd64_sse_register_names): Renamed to ...
+ (amd64_register_names): This.
+ (amd64_avx_register_names): Removed.
+ (amd64_xmm_names): Likewise.
+ (AMD64_NUM_REGS): Likewise.
+ (amd64_ymm_names): New.
+ (amd64_ymmh_names): Likewise.
+ (amd64_register_name): Likewise.
+ (amd64_pseudo_register_name): Remove i386_xmm_regnum_p. Add
+ i386_ymm_regnum_p.
+ (amd64_init_abi): Set ymmh_register_names, num_ymm_regs
+ and ymm0h_regnum. Call set_gdbarch_register_name. Replace
+ num_vector_regs with num_xmm_regs. Replace AMD64_NUM_REGS
+ with AMD64_AVX_NUM_REGS.
+
+ * amd64-tdep.h (amd64_regnum): Add AMD64_YMM0H_REGNUM and
+ AMD64_YMM15H_REGNUM.
+ (AMD64_AVX_NUM_REGS): New.
+ (amd64_register_name): Removed.
+ (amd64_register_type): Likewise.
+
+ * i386-darwin-tdep.c (i386_darwin_init_abi): Replace
+ num_vector_regs with num_xmm_regs.
+
+ * i386-linux-nat.c (regmap): Count 8 upper YMM registers.
+ (GETFPXREGS_SUPPLIES): Replace I386_SSE_NUM_REGS with
+ I386_AVX_NUM_REGS.
+ * i386-linux-tdep.h (I386_LINUX_ORIG_EAX_REGNUM): Likewise.
+
+ * i386-nto-tdep.c (i386nto_register_area): Replace
+ I387_VECTOR0_REGNUM with I387_XMM0_REGNUM.
+
+ * i386-tdep.c (i386_sse_register_names): Renamed to ...
+ (i386_register_names): This.
+ (i386_avx_register_names): Removed.
+ (i386_xmm_names): Likewise.
+ (i386_vector_regnum_p): Likewise.
+ (i386_xmm_type): Likewise.
+ (): Likewise.
+ (): Likewise.
+ (i386_ymm_names): New.
+ (i386_ymmh_names): Likewise.
+ (i386_ymmh_regnum_p): Likewise.
+ (i386_ymm_regnum_p): Likewise.
+ (i386_register_name): Likewise.
+ (i386_ymm_type): Likewise.
+ (): Likewise.
+ (i386_mxcsr_regnum_p): Replace I387_VECTOR0_REGNUM with
+ I387_XMM0_REGNUM.
+ (i386_dbx_reg_to_regnum): Likewise.
+ (i386_pseudo_register_name): Remove i386_xmm_regnum_p. Add
+ i386_ymm_regnum_p.
+ (i386_pseudo_register_type): Likewise.
+ (i386_pseudo_register_read): Likewise.
+ (i386_pseudo_register_write): Likewise.
+ (i386_go32_init_abi): Replace num_vector_regs with num_xmm_regs.
+ (i386_register_reggroup_p): Replace i386_vector_regnum_p. Add
+ i386_ymm_regnum_p.
+ (i386_validate_tdesc_p): Get SSE registers. Try AVX registers.
+ (i386_gdbarch_init): Replace num_vector_regs with num_xmm_regs.
+ Call set_gdbarch_register_name. Replace I386_SSE_NUM_REGS
+ with I386_AVX_NUM_REGS. Set ymmh_register_names, ymm0h_regnum,
+ num_ymm_regs and ymm0_regnum. Call set_gdbarch_qsupported
+ with "x86=xml".
+
+ * i386-tdep.h (gdbarch_tdep): Add num_ymm_regs, ymm0_regnum,
+ ymm0h_regnum, ymmh_register_names and i386_ymm_type. Remove
+ xmm0_regnum, num_vector_regs and i386_xmm_type.
+ (i386_regnum): Add I386_YMM0H_REGNUM and I386_YMM7H_REGNUM.
+ (I386_AVX_NUM_REGS): New.
+ (i386_ymm_regnum_p): Likewise.
+ (i386_ymmh_regnum_p): Likewise.
+ (I386_MAX_REGISTER_SIZE): Changed to 16.
+ (i386_xmm_regnum_p): Removed.
+
+ * i387-tdep.c (i387_supply_fsave): Replace I387_VECTOR0_REGNUM
+ with I387_XMM0_REGNUM.
+ (i387_collect_fsave): Likewise.
+ (i387_supply_fxsave): Replace I387_VECTOR0_REGNUM/num_vector_regs
+ with I387_XMM0_REGNUM/num_vector_regs.
+ (i387_collect_fxsave): Likewise.
+ (xsave_sse_offset): Removed.
+ (XSAVE_SSE_ADDR): Likewise.
+ (xsave_avxh_offset): Likewise.
+ (XSAVE_AVXH_ADDR): Likewise.
+ (xsave_offset): New.
+ (XSAVE_ADDR): Likewise.
+ (i387_supply_xsave): Rewrite.
+ (i387_collect_xsave): Likewise.
+
+ * i387-tdep.h (I387_NUM_VECTOR_REGS): Renamed to ...
+ (I387_NUM_XMM_REGS): This.
+ (I387_NUM_YMM_REGS): New.
+ (I387_YMM0H_REGNUM): Likewise.
+ (I387_VECTOR0_REGNUM): Renamed to ...
+ (I387_XMM0_REGNUM): This.
+ (I387_MXCSR_REGNUM): Updated.
+ (I387_YMMENDH_REGNUM): New.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * features/i386/32bit-avx.xml: Only define upper YMM registers.
+ * features/i386/64bit-avx.xml: Likewise.
+
+ * features/i386/amd64-avx-linux.xml: Include 64bit-sse.xml.
+ * features/i386/amd64-avx.xml: Likewise.
+
+ * features/i386/i386-avx-linux.xml: Include 32bit-sse.xml.
+ * features/i386/i386-avx.xml: Likewise.
+
+ * features/i386/amd64-avx-linux.c: Regenerated.
+ * features/i386/amd64-avx.c: Likewise.
+ * features/i386/i386-avx-linux.c: Likewise.
+ * features/i386/i386-avx.c: Likewise.
+ * regformats/i386/amd64-avx-linux.dat: Likewise.
+ * regformats/i386/amd64-avx.dat: Likewise.
+ * regformats/i386/i386-avx-linux.dat: Likewise.
+ * regformats/i386/i386-avx.dat: Likewise.
+
+2010-03-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.h (XSAVE_XCR0_OFFSET): Renamed to ...
+ (I386_LINUX_XSAVE_XCR0_OFFSET): This.
+ * amd64-linux-tdep.c (amd64_linux_init_abi): Updated.
+ * i386-linux-tdep.c (i386_linux_core_read_xcr0): Likewise.
+ (i386_linux_init_abi): Likewise.
+
+2010-03-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_init_abi): Set xsave_xcr0_offset.
+ * i386-linux-tdep.c (i386_linux_init_abi): Likewise.
+
+ * i386-tdep.c (i386_gdbarch_init): Set xsave_xcr0_offset to -1.
+
+ * i387-tdep.c (i387_collect_xsave): Updated.
+
+ * i387-tdep.h (XSAVE_XCR0_OFFSET): Moved to ...
+ * i386-linux-tdep.h (XSAVE_XCR0_OFFSET): Here.
+
+2010-03-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * features/i386/32bit-avx.xml: Define i386_mxcsr.
+ * features/i386/64bit-avx.xml: Likewise.
+
+ * features/i386/amd64-avx-linux.c: Regenerated.
+ * features/i386/amd64-avx.c: Likewise.
+ * features/i386/i386-avx-linux.c: Likewise.
+ * features/i386/i386-avx.c: Likewise.
+
+2010-02-25 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_xmm_regnum_p): Optimized.
+ (i386_vector_regnum_p): Likewise.
+
+2010-02-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_store_inferior_registers): Pass
+ 0 to amd64_collect_xsave.
+
+ * amd64-tdep.c (amd64_collect_xstateregset): Pass 1 to
+ amd64_collect_xsave.
+ (amd64_collect_xsave): Add an integer argument and pass it to
+ i387_collect_xsave.
+
+ * amd64-tdep.h (amd64_collect_xsave): Add an integer argument.
+ * i387-tdep.h (i387_collect_xsave): Likewise.
+
+ * i386-linux-nat.c (store_xstateregs): Pass 1 to
+ i387_collect_xsave.
+ * i386-tdep.c (i386_collect_xstateregset): Likewise.
+
+ * i387-tdep.c (i387_collect_xsave): Add an integer argument
+ to indicate gcore. Update the first 8 bytes of the
+ sw_usable_bytes[464..467] and `xstate_bv' with XCR0 for gcore.
+
+2010-02-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_collect_xsave): Fix more typos.
+
+2010-02-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_collect_xsave): Fix a typo.
+
+2010-02-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): Fix a typo.
+
+ * i386-tdep.c (i386_register_reggroup_p): Return 0 for pseudo
+ XMM registers if group isn't SSE.
+
+2010-02-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Include "regset.h".
+ (amd64_linux_read_description): Set .reg-xstate section size if
+ it is supported.
+ (_initialize_amd64_linux_nat): Call i386_xstate_init.
+
+ * amd64-linux-tdep.c: Include "regset.h" before
+ "amd64-linux-tdep.h".
+ (amd64_linux_regset_sections): Make it global.
+ (_initialize_amd64_linux_tdep): Don't call i386_xstate_init.
+
+ * amd64-linux-tdep.h (amd64_linux_regset_sections): New.
+
+ * config/i386/nm-linux-xstate.h (FILL_XSTATEREGSET): Removed.
+
+ * i386-linux-nat.c: Include "regset.h".
+ (i386_linux_read_description): Set .reg-xstate section size if
+ it is supported.
+ (_initialize_i386_linux_nat): Call i386_xstate_init.
+
+ * i386-linux-tdep.c: Include "regset.h" before "inferior.h".
+ (i386_linux_regset_sections): Make it global.
+ (_initialize_i386_linux_tdep): Don't call i386_xstate_init.
+
+ * i386-linux-tdep.h (i386_linux_regset_sections): New.
+
+2010-02-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_validate_tdesc_p): Use num_vector_regs instead
+ of num_xmm_regs to check vector registers.
+
+2010-02-20 H.J. Lu <hongjiu.lu@intel.com>
+
+ * features/i386/Makefile: New.
+
+2010-02-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_xsave): Remove one regcache_raw_supply
+ for x87.
+
+2010-02-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (have_ptrace_getregset): Make it static
+ and initialized to -1.
+ (amd64_linux_fetch_inferior_registers): Error if PTRACE_GETREGSET
+ fails.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (amd64_linux_read_description): Set have_ptrace_getregset.
+ Check the native XCR0 only if PTRACE_GETREGSET is available.
+ (_initialize_amd64_linux_nat): Don't set have_ptrace_getregset.
+
+ * i386-linux-nat.c (have_ptrace_getregset): Make it static
+ and initialized to -1.
+ (fetch_xstateregs): Error if PTRACE_GETREGSET fails.
+ (store_xstateregs): Likewise.
+ (i386_linux_read_description): Set have_ptrace_getregset.
+ Check the native XCR0 only if PTRACE_GETREGSET is available.
+ (_initialize_i386_linux_nat): Don't set have_ptrace_getregset.
+
+2010-02-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common/i386-xstate.h (XSTATE_SSE_MASK): Add bit_XSTATE_X87.
+ (XSTATE_MAX_MASK): Defined with XSTATE_AVX_MASK only.
+ (XSTATE_SSE_MASK_STRING): Updated.
+ (XSTATE_AVX_MASK_STRING): Likewise.
+
+ * i387-tdep.c (i387_supply_xsave): Also check x87 registers.
+ (i387_collect_xsave): Likewise.
+
+2010-02-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Use num_vector_regs instead
+ of num_xmm_regs to check vector registers.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_init_abi): Set num_xmm_regs based on
+ vector feature.
+ * i386-tdep.c (i386_gdbarch_init): Likewise.
+
+ * i386-darwin-tdep.c (i386_darwin_init_abi): Replace num_xmm_regs
+ with num_vector_regs.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_init_abi): Set num_vector_regs to 16.
+
+ * i386-tdep.c (i386_gdbarch_init): Add num_xmm_regs to
+ set_gdbarch_num_pseudo_regs.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): Check the
+ native XCR0.
+
+ * amd64-linux-tdep.c: Include "features/i386/amd64-avx-linux.c".
+ (amd64_linux_core_read_description): Check XCR0 from core dump.
+ (_initialize_amd64_linux_tdep): Call
+ initialize_tdesc_amd64_avx_linux.
+
+ * amd64-tdep.c: Include "features/i386/amd64-avx.c".
+ (AMD64_NUM_REGS): Use amd64_sse_register_names.
+ (amd64_xmm_names): Make it static.
+ (amd64_pseudo_register_name): Handle XMM pseud registers.
+ (amd64_init_abi): Set register_names based on target description.
+ (_initialize_amd64_tdep): Call initialize_tdesc_amd64_avx.
+
+ * i386-linux-nat.c (i386_linux_read_description): Check the
+ native XCR0.
+
+ * i386-linux-tdep.c (i386_linux_core_read_xcr0): New.
+ (i386_linux_core_read_description): Use it. Remove BFD64.
+ (i386_linux_read_description): Removed.
+ (_initialize_i386_linux_tdep): Call
+ initialize_tdesc_i386_avx_linux.
+
+ * i386-tdep.c (i386_xmm_regnum_p): Make it global.
+ (i386_pseudo_register_name): Remove BFD64.
+ (i386_pseudo_register_read): Likewise.
+ (i386_pseudo_register_write): Likewise.
+ (i386_gdbarch_init): Set register_names based on target
+ description.
+
+2010-02-13 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Properly
+ check extended state size.
+ (i386_linux_read_description): Properly check the native XCR0.
+
+2010-02-13 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common/i386-xstate.h (XSTATE_SSE_MASK): Defined with
+ bit_XSTATE_SSE.
+ (XSTATE_AVX_MASK): Defined with XSTATE_SSE_MASK and bit_XSTATE_AVX.
+ (XSTATE_MAX_MASK): Defined with XSTATE_AVX_MASK and bit_XSTATE_X87.
+ (XSTATE_SSE_MASK_STRING): Updated.
+ (XSTATE_AVX_MASK_STRING): Likewise.
+
+ * 386-linux-tdep.c (i386_linux_core_read_description): Use
+ XSTATE_XXX_MASK.
+ (i386_linux_core_read_description): Likewise.
+
+ * i386-tdep.c (i386_register_reggroup_p): Check xcr0 instead
+ of vector_unit.
+ (i386_gdbarch_init): Set xcr0 instead of vector_unit.
+
+ * i386-tdep.h (x86_vector_unit): Removed.
+ (gdbarch_tdep): Remove vector_unit. Add xcr0.
+
+ * i387-tdep.c (i387_supply_fxsave): Check xcr0 instead of
+ vector_unit.
+ (i387_supply_xsave): Likewise.
+ (i387_collect_xsave): Likewise.
+
+2010-02-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Don't set xcr0 on x86 host.
+ (_initialize_i386_tdep): Don't call i386_xstate_init on x86 host.
+
+ * i386-tdep.h (gdbarch_tdep): Remove xcr0.
+
+ * i387-tdep.c (i387_supply_xsave): Replace tdep->xcr0 with
+ i386_xstate.xcr0.
+ (i387_collect_xsave): Likewise.
+
+2010-02-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Don't
+ set xcr0 here.
+
+2010-02-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (_initialize_amd64_linux_tdep): Re-indent.
+
+ * i386-linux-tdep.c (i386_linux_read_description): Don't set
+ xcr0 here.
+ (_initialize_i386_linux_tdep): Re-indent.
+
+ * i386-tdep.c (i386_gdbarch_init): Set xcr0 on x86 host.
+ (_initialize_i386_tdep): Call i386_xstate_init on x86 host.
+
+ * i386-tdep.h (gdbarch_tdep): Mention xcr0 is used only for
+ native debug.
+
+2010-02-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_fetch_inferior_registers): Cast
+ NT_X86_XSTATE to unsigned int.
+ (amd64_linux_store_inferior_registers): Likewise.
+ * i386-linux-nat.c (fetch_xstateregs): Likewise.
+ (store_xstateregs): Likewise.
+
+2010-02-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Include "elf/common.h" and <sys/uio.h>.
+ (amd64_linux_fetch_inferior_registers): Use iovec.
+ (amd64_linux_store_inferior_registers): Likewise.
+
+ * amd64-linux-tdep.c (_initialize_amd64_linux_tdep): Don't
+ check i386_xstate.size.
+ * i386-linux-tdep.c (_initialize_i386_linux_tdep): Likewise.
+
+ * config/i386/nm-linux-xstate.h: Don't include "elf/common.h".
+ (PTRACE_REGSET_NT_SHIFT): Removed.
+ (PTRACE_REGSET_MAX_SIZE): Likewise.
+ (PTRACE_REGSET_XSTATE_ADDR): Likewise.
+
+ * i386-linux-nat.c: Include "elf/common.h" and <sys/uio.h>.
+ (fetch_xstateregs): Use iovec.
+ (store_xstateregs): Likewise.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_pseudo_register_read): Properly convert
+ XMM pseudo register to vector register.
+ (i386_pseudo_register_write): Likewise.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * features/i386/32bit-avx.xml: Fix typos.
+ * features/i386/64bit-avx.xml: Likewise.
+
+ * features/i386/amd64-avx-linux.c: Regenerated.
+ * features/i386/amd64-avx.c: Likewise.
+ * features/i386/i386-avx-linux.c: Likewise.
+ * features/i386/i386-avx.c: Likewise.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Count XMM pseudo registers.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.h (I387_XMM0_REGNUM): Renamed to ...
+ (I387_VECTOR0_REGNUM): This.
+ (I387_MXCSR_REGNUM): Updated.
+
+ * i386-nto-tdep.c (i386nto_register_area): Replace
+ I387_XMM0_REGNUM with I387_VECTOR0_REGNUM.
+
+ * i386-tdep.c (i386_sse_regnum_p): Renamed to ...
+ (i386_vector_regnum_p): This. Replace I387_XMM0_REGNUM
+ with I387_VECTOR0_REGNUM.
+ (i386_fpc_regnum_p): Replace I387_XMM0_REGNUM with
+ I387_VECTOR0_REGNUM.
+ (i386_register_reggroup_p): Updated. Handle XMM pseudo
+ registers.
+
+ * i387-tdep.c (i386_fpc_regnum_p): Replace I387_XMM0_REGNUM
+ with I387_VECTOR0_REGNUM.
+ (i387_supply_fxsave): Likewise.
+ (i387_collect_fxsave): Likewise.
+ (XSAVE_SSE_ADDR): Likewise.
+ (XSAVE_AVXH_ADDR): Likewise.
+ (i387_supply_xsave): Likewise.
+ (i387_collect_xsave): Likewise.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_pseudo_register_name): Handle XMM pseudo
+ registers.
+ (i386_pseudo_register_type): Likewise.
+ (i386_pseudo_register_read): Likewise.
+ (i386_pseudo_register_write): Likewise.
+ (i386_gdbarch_init): Likewise.
+ (i386_xmm_type): New.
+
+ * 386-tdep.h (gdbarch_tdep): Add num_xmm_regs, xmm0_regnum
+ and i386_xmm_type.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_xmm_names): New.
+ (amd64_num_pseudo_regs): Updated.
+
+ * amd64-tdep.h (amd64_xmm_names): New.
+
+ * i386-tdep.c (i386_xmm_names): New.
+ (i386_xmm_regnum_p): Likewise.
+ (i386_num_pseudo_regs): Updated.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.h (gdbarch_tdep): Rename num_xmm_regs to
+ num_vector_regs.
+
+ * i387-tdep.h (I387_NUM_XMM_REGS): Removed.
+ (I387_NUM_VECTOR_REGS): New.
+ (I387_MXCSR_REGNUM): Updated.
+
+ * amd64-tdep.c (amd64_init_abi): Updated.
+ * i386-tdep.c (i386_sse_regnum_p): Likewise.
+ (i386_mxcsr_regnum_p): Likewise.
+ (i386_go32_init_abi): Likewise.
+ (i386_gdbarch_init): Likewise.
+ * i387-tdep.c (i387_supply_fxsave): Likewise.
+ (i387_collect_fxsave): Likewise.
+ (i387_supply_xsave): Likewise.
+ (i387_collect_xsave): Likewise.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Replace PTRACE_GETXSTATEREGS with
+ PTRACE_GETREGSET in comments.
+ (have_ptrace_getxstateregs): Renamed to ...
+ (have_ptrace_getregset): This.
+ (amd64_linux_fetch_inferior_registers): Updated to use
+ PTRACE_GETREGSET.
+ (amd64_linux_store_inferior_registers): Updated to use
+ PTRACE_GETREGSET and PTRACE_SETREGSET.
+
+ * amd64-linux-tdep.c (_initialize_amd64_linux_tdep): Assert
+ the XSAVE extended state size.
+
+ * i386-linux-nat.c: Replace PTRACE_GETXSTATEREGS with
+ PTRACE_GETREGSET in comments.
+ (have_ptrace_getxstateregs): Renamed to ...
+ (have_ptrace_getregset): This.
+ (fetch_xstateregs): Updated to use PTRACE_GETREGSET.
+ (store_xstateregs): Updated to use PTRACE_GETREGSET and
+ PTRACE_SETREGSET.
+
+ * i386-linux-tdep.c (_initialize_i386_linux_tdep): Assert
+ the XSAVE extended state size.
+
+ * config/i386/nm-linux-xstate.h: Include "elf/common.h".
+ (PTRACE_GETXSTATEREGS): Removed.
+ (PTRACE_SETXSTATEREGS): Likewise.
+ (PTRACE_GETREGSET): New.
+ (PTRACE_SETREGSET): Likewise.
+ (PTRACE_REGSET_NT_SHIFT): Likewise.
+ (PTRACE_REGSET_MAX_SIZE): Likewise.
+ (PTRACE_REGSET_XSTATE_ADDR): Likewise.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c: Replace x86-64/x86_64 with amd64.
+ * i386-tdep.c: Likewise.
+
+ * features/Makefile: Replace x86-64 with amd64.
+ * features/i386/*: Rename x86-64* to amd64*.
+
+ * regformats/i386/*: Rename x86-64* to amd64*.
+
+2010-02-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common/i386-xstate.c: Don't include "config.h" if XSTATE_MAIN
+ is defined.
+ (main): Fix typo.
+
+2010-02-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common/i386-xstate.c (main): New. Defined only if XSTATE_MAIN
+ is defined.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Set vector_unit.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/i386/nm-linux-xstate.h: Don't include <sys/ptrace.h>.
+
+ * i386-linux-tdep.c (i386_linux_read_description): Don't use
+ ptrace.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_fetch_inferior_registers): Pass
+ i386_xstate.size to XSTATE ptrace.
+ (amd64_linux_store_inferior_registers): Likewise.
+ * i386-linux-nat.c (fetch_xstateregs): Likewise.
+ (store_xstateregs): Likewise.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (PTRACE_GETXSTATEREGS): Don't define.
+ (PTRACE_SETXSTATEREGS): Likewise.
+ * i386-linux-nat.c (PTRACE_GETXSTATEREGS):
+ (PTRACE_SETXSTATEREGS): Likewise.
+
+ * config/i386/nm-linux.h: Include "config/i386/nm-linux-xstate.h".
+ * config/i386/nm-linux64.h: Likewise.
+
+ * 386-linux-tdep.c (i386_linux_read_description): Define only if
+ FILL_XSTATEREGSET is defined. Use ptrace to get xcr0 from
+ kernel.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (_initialize_amd64_linux_tdep): Update
+ comments.
+
+ * i386-linux-tdep.c: Include features/i386/i386-avx-linux.c
+ and features/i386/x86-64-avx-linux.c.
+ (i386_linux_core_read_description): Handle AVX.
+ (_initialize_i386_linux_tdep): Call initialize_tdesc_i386_avx_linux
+ and initialize_tdesc_x86_64_avx_linux.
+
+ * i386-tdep.c: Include features/i386/i386-avx.c and
+ features/i386/x86-64-avx.c.
+ (_initialize_i386_tdep): Call initialize_tdesc_i386_avx and
+ initialize_tdesc_x86_64_avx.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Try org.gnu.gdb.i386.avx.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * features/i386/32bit-avx.xml: New.
+ * features/i386/64bit-avx.xml: Likewise.
+ * features/i386/i386-avx-linux.c: Likewise.
+ * features/i386/i386-avx-linux.xml: Likewise.
+ * features/i386/i386-avx.c: Likewise.
+ * features/i386/i386-avx.xml: Likewise.
+ * features/i386/x86-64-avx-linux.c: Likewise.
+ * features/i386/x86-64-avx-linux.xml: Likewise.
+ * features/i386/x86-64-avx.c: Likewise.
+ * features/i386/x86-64-avx.xml: Likewise.
+
+ * features/Makefile (WHICH): Add i386/i386-avx,
+ i386/i386-avx-linux, i386/x86-64-avx and i386/x86-64-avx-linux.
+ (i386/i386-avx-expedite): New.
+ (i386/i386-avx-linux-expedite): Likewise.
+ (i386/x86-64-avx-expedite):Likewise.
+ (i386/x86-64-avx-linux-expedite): Likewise.
+ ($(outdir)/i386/i386-avx.dat): New dependency.
+ ($(outdir)/i386/i386-avx-linux.dat): Likewise.
+ ($(outdir)/i386/x86-avx-64.dat): Likewise.
+ ($(outdir)/i386/x86-64-avx-linux.dat): Likewise.
+
+ * regformats/reg-i386-avx-linux.dat: Moved to ..
+ * regformats/i386/i386-avx-linux.dat: Here.
+
+ * regformats/reg-i386-avx.dat: Moved to ..
+ * regformats/i386/i386-avx.dat: Here.
+
+ * regformats/reg-x86-64-avx-linux.dat: Moved to ...
+ * regformats/i386/x86-64-avx-linux.dat: Here.
+
+ * regformats/reg-x86-64-avx.dat: Moved to ...
+ * regformats/i386/x86-64-avx.dat: Here.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_sse_register_names): Make it global.
+ (amd64_avx_register_names): Likewise.
+ (amd64_init_abi): Don't call i386_gdbarch_vector_unit_init.
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Removed.
+ (i386_gdbarch_init): Don't call i386_gdbarch_vector_unit_init.
+ * i386-tdep.h (i386_gdbarch_vector_unit_init): Removed.
+
+2010-02-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Check
+ core size for AVX support.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_fxsave): Optimize xstate_bv == 0.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_fxsave): Don't use
+ regcache_raw_supply_part.
+ (i387_supply_xsave): Likewise.
+ (i387_collect_fxsave): Don't use regcache_raw_collect_part.
+ (i387_collect_xsave): Likewise.
+
+ * regcache.c (regcache_raw_supply_part): Removed.
+ (regcache_raw_collect_part): Likewise.
+ * regcache.h (regcache_raw_supply_part): Likewise.
+ (regcache_raw_collect_part): Likewise.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Update
+ warning message for xcr0.
+
+ * i387-tdep.c (i387_collect_xsave): Move comments on xstate_bv.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Check
+ FILL_XSTATEREGSET instead of bit_XSTATE_AVX.
+
+ * config/i386/nm-linux.h (FILL_XSTATEREGSET): Update comments.
+ * config/i386/nm-linux64.h (FILL_XSTATEREGSET): Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c: Include "i386-xstate.h".
+ * i387-tdep.c: Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Check if
+ bit_XSTATE_AVX is defined before using it.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (xstate-nat.o): Renamed to ...
+ (i386-xstate.o): This.
+
+ * i386-linux-tdep.c: Include "i386-xstate.h" instead of
+ "xstate-nat.h".
+ * config/i386/nm-linux.h: Likewise.
+ * config/i386/nm-linux64.h: Likewise.
+
+ * common/xstate-nat.c: Moved to ...
+ * common/i386-xstate.c: This.
+
+ * common/xstate-nat.h: Moved to ...
+ * common/i386-xstate.h: This.
+
+ * config/i386/linux.mh (NATDEPFILES): Replace xstate-nat.o with
+ i386-xstate.o.
+ * config/i386/linux64.mh (NATDEPFILES): Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_gregset64_reg_offset): Remove
+ xstate_bv offset.
+ (amd64_linux_gregset32_reg_offset): Likewise.
+
+ * amd64-linux-tdep.h (AMD64_LINUX_ORIG_RAX_REGNUM): Updated.
+
+ * amd64-tdep.c (amd64_sse_register_names): Remove xstate_bv.
+ (amd64_avx_register_names): Likewise.
+ (amd64_register_name): Remove AMD64_XSTATE_BV_REGNUM.
+ (amd64_register_type): Likewise.
+
+ * amd64-tdep.h (AMD64_XSTATE_BV_REGNUM): Removed.
+
+ * i386-linux-nat.c (regmap): Remove xstate_bv.
+
+ * i386-tdep.c (i386_sse_register_names): Remove xstate_bv.
+ (i386_avx_register_names): Likewise.
+ (i386_xstate_regnum_p): Removed.
+ (i386_register_name): Remove I387_XSTATE_BV_REGNUM.
+
+ * i386-tdep.h (I386_SSE_NUM_REGS): Remove xstate_bv.
+
+ * i387-tdep.c (XSAVE_XSTATE_BV_ADDR): Update comments.
+
+ * i387-tdep.h (I387_XSTATE_BV_REGNUM): Removed.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_init_abi): Update call to
+ i386_gdbarch_vector_unit_init.
+
+ * gdbarch.c (gdbarch_qsupported_process_ack): Return void.
+ * gdbarch.h (gdbarch_qsupported_process_ack_ftype): Likewise.
+ (gdbarch_qsupported_process_ack): Likewise.
+
+ * i386-tdep.c (remote_xcr0): New.
+ (i386_gdbarch_vector_unit_init): Use remote_xcr0 for remote
+ client.
+ (i386_qsupported_process_ack): Set remote_xcr0.
+ (i386_gdbarch_init): Update i386_gdbarch_vector_unit_init call.
+
+ * i386-tdep.h (i386_gdbarch_vector_unit_init): Updated.
+
+ * remote.c (remote_query_supported): Call
+ gdbarch_qsupported_process_ack with NULL to prepare qSupported
+ ACK processing.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regformats/reg-i386-avx-linux.dat: Add xmlarch and osabi.
+ * regformats/reg-x86-64-avx-linux.dat: Likewise.
+
+ * regformats/reg-i386-avx.dat: Add xmlarch.
+ * regformats/reg-x86-64-avx.dat: Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Use
+ XSTATE_SSE_SIZE instead of 576.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_g_packet_size): Removed.
+ (amd64_linux_init_abi): Remove i386_register_g_packet_guesses.
+
+ * amd64-tdep.c (amd64_g_packet_size): Removed.
+ (amd64_init_abi): Update i386_gdbarch_vector_unit_init call.
+ Remove i386_register_g_packet_guesses.
+
+ * amd64-tdep.h (AMD64_G_PACKET_SIZE_SSE): Removed.
+ (AMD64_G_PACKET_SIZE_AVX): Likewise.
+
+ * gdbarch.c (gdbarch_qsupported_process_ack): Add value.
+ * gdbarch.h (gdbarch_qsupported_process_ack_ftype): Likewise.
+ (gdbarch_qsupported_process_ack): Likewise.
+
+ * i386-linux-tdep.c (i386_linux_g_packet_size): Removed.
+ (i386_linux_init_abi): Remove i386_register_g_packet_guesses.
+
+ * i386-tdep.c: Don't include "remote.h" nor
+ "target-descriptions.h".
+ (i386_register_g_packet_guesses): Removed.
+ (i386_g_packet_size): Likewise.
+ (386_gdbarch_vector_unit_init): Rewrite.
+ (i386_qsupported_process_ack): New.
+ (i386_gdbarch_init): Update i386_gdbarch_vector_unit_init call.
+ Remove i386_register_g_packet_guesses. Call
+ set_gdbarch_qsupported_process_ack.
+
+ * i386-tdep.h (x86_vector_unit): Remove unknown.
+ (I386_G_PACKET_SIZE_SSE): Removed.
+ (I386_G_PACKET_SIZE_AVX): Likewise.
+ (I386_PROPERTY_SSE): Likewise.
+ (I386_PROPERTY_AVX): Likewise.
+ (AMD64_PROPERTY_SSE): Likewise.
+ (AMD64_PROPERTY_AVX): Likewise.
+ (i386_g_packet_size): Likewise.
+ (i386_register_g_packet_guesses): Likewise.
+ (i386_gdbarch_vector_unit_init): Updated.
+
+ * remote.c (remote_query_supported): Pass value to
+ gdbarch_qsupported_process_ack.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_collect_xsave): Optimized.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regformats/reg-i386-avx-linux.dat: Remove xcr0.
+ * regformats/reg-i386-avx.dat: Likewise.
+ * regformats/reg-x86-64-avx-linux.dat: Likewise.
+ * regformats/reg-x86-64-avx.dat: Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common/xstate-nat.h (XSTATE_SSE_MASK): New.
+ (XSTATE_AVX_MASK): Likewise.
+ (XSTATE_MAX_MASK): Likewise.
+ (XSTATE_SSE_MASK_STRING): Likewise.
+ (XSTATE_AVX_MASK_STRING): Likewise.
+ (XSTATE_MAX_MASK_STRING): Likewise.
+ (XSTATE_SSE_SIZE): Likewise.
+ (XSTATE_AVX_SIZE): Likewise.
+ (XSTATE_MAX_SIZE): Likewise.
+ (XSTATE_SSE_SIZE_STRING): Likewise.
+ (XSTATE_AVX_SIZE_STRING): Likewise.
+ (XSTATE_MAX_SIZE_STRING): Likewise.
+
+ * i386-tdep.c (i386_gdbarch_init): Use XSTATE_MAX_SIZE_STRING
+ and XSTATE_MAX_MASK_STRING on set_gdbarch_qsupported.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdbarch.c (gdbarch): Add qsupported_process_ack.
+ (startup_gdbarch): Likewise.
+ (gdbarch_alloc): Likewise.
+ (verify_gdbarch): Likewise.
+ (gdbarch_dump): Likewise.
+ (gdbarch_qsupported_process_ack): New.
+ (set_gdbarch_qsupported_process_ack): Likewise.
+
+ * gdbarch.h (gdbarch_qsupported_process_ack_ftype): New.
+ (gdbarch_qsupported_process_ack): Likewise.
+ (set_gdbarch_qsupported_process_ack): Likewise.
+
+ * i386-tdep.c (i386_gdbarch_init): Update call to
+ set_gdbarch_qsupported.
+
+ * remote.c (remote_state): Replace qsupported with gdbarch.
+ (init_remote_state): Set gdbarch instead of qsupported.
+ (remote_query_supported): Replace qsupported with
+ gdbarch_qsupported. Call gdbarch_qsupported_process_ack on
+ unprocessed ACKs.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_xsave): Apply XCR0 mask to clear_bv.
+ (i387_collect_xsave): Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_gregset64_reg_offset): Remove
+ xcr0 offset.
+ (amd64_linux_gregset32_reg_offset): Likewise.
+
+ * amd64-tdep.c (amd64_sse_register_names): Remove xcr0.
+ (amd64_avx_register_names): Likewise.
+ (amd64_register_name): Remove AMD64_XCR0_REGNUM.
+ (amd64_register_type): Remove AMD64_XCR0_REGNUM. Update
+ AMD64_XSTATE_BV_REGNUM.
+
+ * amd64-tdep.h (AMD64_XCR0_REGNUM): Removed.
+
+ * i386-linux-nat.c (regmap): Remove xcr0.
+
+ * i386-tdep.c (i386_sse_register_names): Remove xcr0.
+ (i386_avx_register_names): Likewise.
+ (i386_xstate_regnum_p): Removed.
+ (i386_register_name): Remove I387_XCR0_REGNUM.
+ (i386_xcr0_type): Removed.
+ (i386_register_type): Remove I387_XCR0_REGNUM and
+ I387_XSTATE_BV_REGNUM.
+ (i386_register_reggroup_p): Remove i386_xstate_regnum_p.
+
+ * i386-tdep.h (gdbarch_tdep): Remove i386_xcr0_type.
+ (I386_SSE_NUM_REGS): Remove xcr0.
+ (i386_xcr0_type): Removed.
+
+ * i387-tdep.c (XSAVE_XCR0_ADDR): Removed.
+ (i387_supply_xsave): Clear part in vector registers if its bit in
+ xstat_bv is zero. Don't update I387_XCR0_REGNUM nor
+ I387_XSTATE_BV_REGNUM.
+ (i387_collect_xsave): Clear part in vector registers if its bit
+ in xstat_bv is zero. Update xstat_bv directly.
+
+ * i387-tdep.h (I387_XCR0_REGNUM): Removed.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdbarch.c (gdbarch): Add qsupported.
+ (startup_gdbarch): Likewise.
+ (gdbarch_alloc): Likewise.
+ (verify_gdbarch): Likewise.
+ (gdbarch_dump): Likewise.
+ (gdbarch_qsupported): New.
+ (set_gdbarch_qsupported): Likewise.
+
+ * gdbarch.h (gdbarch_qsupported): New.
+ (set_gdbarch_qsupported): Likewise.
+
+ * i386-tdep.c (i386_gdbarch_init): Call set_gdbarch_qsupported.
+
+ * remote.c (remote_state): Add qsupported.
+ (init_remote_state): Set qsupported from gdbarch_qsupported.
+ (remote_query_supported): Support qsupported.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_collect_xsave): Optimize updating single
+ vector register.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_collect_xsave): Get the original `xstat_bv'.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Use
+ regcache_cooked_read_unsigned.
+
+ * i387-tdep.c (i387_collect_xsave): Update the bits in
+ `xstate_bv' if any SSE/AVX registers are changed. Don't change
+ `xcr0'.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_sse_register_names): Use NULL on xstate_bv.
+ (amd64_avx_register_names): Likewise.
+ (amd64_register_name): Return NULL for AMD64_XSTATE_BV_REGNUM.
+
+ * amd64-tdep. (AMD64_G_PACKET_SIZE_AVX): Don't include xstate_bv.
+
+ * i386-tdep.c (i386_sse_register_names): Use NULL on xstate_bv.
+ (i386_avx_register_names): Likewise.
+ (i386_register_name): Return NULL for I386_XSTATE_BV_REGNUM.
+
+ * i386-tdep. (I386_G_PACKET_SIZE_AVX): Don't include xstate_bv.
+
+ * i387-tdep.c (XSAVE_XSTATE_BV_ADDR): Update comments.
+
+ * regformats/reg-i386-avx-linux.dat: Remove xstate_bv.
+ * regformats/reg-i386-avx.dat: Likewise.
+ * regformats/reg-x86-64-avx-linux.dat: Likewise.
+ * regformats/reg-x86-64-avx.dat: Likewise.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Correct the
+ XCR0 register number for 64bit.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Get xcr0 from
+ the remote target.
+
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.h (AMD64_G_PACKET_SIZE_AVX): Add sizes for xcr0
+ and xstate_bv.
+ * i386-tdep.h (I386_G_PACKET_SIZE_AVX): Likewise.
+
+ * regformats/reg-i386-avx-linux.dat: Add xcr0 and xstate_bv.
+ * regformats/reg-i386-avx.dat: Likewise.
+ * regformats/reg-x86-64-avx-linux.dat: Likewise.
+ * regformats/reg-x86-64-avx.dat: Likewise.
+
+2010-01-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Read 8
+ bytes for xcr0.
+
+2010-01-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.h (XSAVE_XCR0_OFFSET): Update comments.
+
+2010-01-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_register_name): Return NULL for xcr0
+ and xstate_bv if XSAVE extended state isn't supported.
+ * i386-tdep.c (i386_register_name): Likewise.
+ (i386_xstate_regnum_p): Return 0 of XSAVE extended state isn't
+ supported.
+
+2010-01-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_xstate_regnum_p): New.
+ (i386_register_reggroup_p): Use it.
+
+2010-01-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c: Include i387-tdep.h and xstate-nat.h.
+ (i386_linux_core_read_description): Read xcr0 from core file.
+
+ * i387-tdep.c (XSAVE_XCR0_ADDR): New.
+ (XSAVE_XSTATE_BV_ADDR): Likewise.
+
+ * i387-tdep.h (XSAVE_XCR0_OFFSET): New.
+ (XSAVE_XCR0_ADDR): Removed.
+ (XSAVE_XSTATE_BV_ADDR): Likewise.
+
+2010-01-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_gregset64_reg_offset): Add
+ entries of -1 for xcr0 and xstate_bv.
+ (amd64_linux_gregset32_reg_offset): Likewise.
+ * i386-linux-nat.c (regmap): Likewise.
+
+ * amd64-linux-tdep.h (AMD64_LINUX_ORIG_RAX_REGNUM): Replace
+ AMD64_MXCSR_REGNUM with AMD64_XSTATE_BV_REGNUM.
+
+ * amd64-tdep.c (amd64_sse_register_names): Add xcr0 and xstate_bv.
+ (amd64_avx_register_names): Likewise.
+ (amd64_register_type): Handle AMD64_XCR0_REGNUM and
+ AMD64_XSTATE_BV_REGNUM.
+
+ * amd64-tdep.h (amd64_regnum): Add AMD64_XCR0_REGNUM and
+ AMD64_XSTATE_BV_REGNUM.
+
+ * i386-tdep.c (i386_sse_register_names): Add xcr0 and xstate_bv.
+ (i386_avx_register_names): Likewise.
+ (i386_xcr0_type): New.
+ (i386_register_type): Handle AMD64_XCR0_REGNUM and
+ AMD64_XSTATE_BV_REGNUM.
+ (i386_gdbarch_vector_unit_init): Set the xcr0 field.
+
+ * i386-tdep.h (gdbarch_tdep): Add xcr0 and i386_xcr0_type.
+ (I386_SSE_NUM_REGS): Increase by 2.
+ (i386_xcr0_type): New.
+
+ * i387-tdep.c (i387_supply_xsave): Handle I387_XCR0_REGNUM
+ and I387_XSTATE_BV_REGNUM.
+ (i387_collect_xsave): Likewise.
+
+ * i387-tdep.h (I387_XCR0_REGNUM): New.
+ (I387_XSTATE_BV_REGNUM): Likewise.
+ (XSAVE_XCR0_ADDR): Likewise.
+ (XSAVE_XSTATE_BV_ADDR): Likewise.
+
+2010-01-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_fetch_inferior_registers): Fall
+ back after PTRACE_GETXSTATEREGS if have_ptrace_getxstateregs == 1.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (_initialize_amd64_linux_nat): Initialize have_ptrace_getxstateregs
+ to 2 for AVX.
+
+ * i386-linux-nat.c (fetch_xstateregs): Fall back after
+ PTRACE_GETXSTATEREGS if have_ptrace_getxstateregs == 1.
+ (store_xstateregs): Likewise.
+ (_initialize_i386_linux_nat): Initialize have_ptrace_getxstateregs
+ to 2 for AVX.
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Updated.
+
+ * common/xstate-nat.h (xstate): Removed.
+ (xstate_status): New.
+ (bit_XSTATE_X87): Likewise.
+ (bit_XSTATE_SSE): Likewise.
+ (bit_XSTATE_AVX): Likewise.
+ (i386_xstate_type): Remove state. Add status and xcr0.
+
+ * common/xstate-nat.c (i386_xstate_init): Updated.
--- ./gdb/ChangeLog.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/ChangeLog.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,464 @@
+2010-03-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * remote.c (register_remote_support_xml): Use strtok.
+
+2010-03-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * NEWS: Mention xmlRegisters= in qSupported packet.
+
+2010-03-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Move
+ register_remote_support_xml call to ...
+ (_initialize_i386_tdep): Here.
+
+2010-03-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Pass "i386" instead of "x86"
+ to register_remote_support_xml.
+
+2010-03-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * remote.c (register_remote_support_xml): Do nothing if
+ HAVE_LIBEXPAT is undefined.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * remote.c (register_remote_support_xml): Add "xmlRegisters="
+ prefix. Free the unused old memory.
+ (remote_query_supported_append): New.
+ (remote_query_supported): Call remote_query_supported_append.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c: Include "remote.h".
+ (i386_gdbarch_init): Call register_remote_support_xml.
+
+ * remote.c (remote_support_xml): New.
+ (register_remote_support_xml): Likewise.
+ (remote_query_supported): Support remote_support_xml.
+
+ * remote.h (register_remote_support_xml): New.
+
+2010-02-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_core_read_description): Don't
+ check .reg section size.
+ * i386-linux-tdep.c (i386_linux_core_read_description): Likewise.
+
+2010-02-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (AMD64_LINUX_USER64_CS): New.
+ (amd64_linux_read_description): Use it.
+
+2010-02-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_init_abi): Check orig_rax
+ right after amd64_init_abi.
+
+ * i386-linux-tdep.c (i386_linux_init_abi): Check orig_eax
+ right after i386_elf_init_abi.
+
+2010-02-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): Read CS
+ register to check process address space.
+
+2010-02-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_validate_tdesc_p): New.
+ (i386_gdbarch_init): Use it.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): Return
+ tdesc_i386_linux for 32bit.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_init_abi): Set num_core_regs and
+ register_names after tdesc.
+ * i386-tdep.c (i386_gdbarch_init): Don't check bfd_arch_i386. Set
+ num_core_regs and register_names after tdesc.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_init_abi): Remove a strayed
+ comment.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Don't include "i387-tdep.h".
+ * amd64-linux-tdep.c: Likewise.
+ * i386-linux-tdep.c: Likewise.
+
+ * i386-tdep.h (i386_regnum): Add I386_MXCSR_REGNUM.
+ (I386_SSE_NUM_REGS): Defined with I386_MXCSR_REGNUM.
+
+2010-02-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.h (tdesc_i386): Removed.
+
+2010-02-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Include "i387-tdep.h".
+ (amd64_linux_read_description): Just return tdesc_amd64_linux.
+
+ * amd64-linux-tdep.c: Don't include "i386-linux-tdep.h".
+ Include "i387-tdep.h".
+ (amd64_linux_register_name): Removed.
+ (amd64_linux_register_type): Likewise.
+ (amd64_linux_core_read_description): Just return
+ tdesc_amd64_linux.
+ (amd64_linux_init_abi): Set target description to
+ tdesc_amd64_linux if needed. Support orig_rax. Set
+ register_reggroup_p.
+
+ * amd64-tdep.c (amd64_register_names): Make it static.
+ (amd64_core_read_description): Removed.
+ (amd64_init_abi): Set num_core_regs and register_names. Set
+ target description to tdesc_amd64 if needed. Call
+ set_gdbarch_num_regs.
+
+ * amd64-tdep.h (amd64_register_names): Removed.
+ (tdesc_amd64): Likewise.
+
+ * i386-linux-tdep.c: Include "i387-tdep.h".
+ (i386_linux_register_name): Removed.
+ (i386_linux_register_type): Likewise.
+ (amd64_linux_init_abi): Set target description to
+ tdesc_i386_linux if needed. Support orig_eax. Set
+ register_reggroup_p.
+
+ * i386-nto-tdep.c (i386nto_regset_id): Replace I386_NUM_FREGS
+ with I387_NUM_REGS.
+
+ * i386-tdep.c: Don't include "amd64-tdep.h".
+ (i386_go32_init_abi): Replace I386_NUM_FREGS with I387_NUM_REGS.
+ (i386_core_read_description): Removed.
+ (i386_gdbarch_init): Set target description to tdesc_i386 if
+ needed. Set gregset_num_regs to I386_NUM_GREGS. Set
+ num_core_regs and register_names. Set register_reggroup_p.
+
+2010-02-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Move tdesc_use_registers
+ more toward the end of the function. Call tdesc_use_registers
+ after gdbarch_init_osabi. Update
+ set_gdbarch_register_reggroup_p.
+
+ * i386-tdep.h (gdbarch_tdep): Add num_core_regs,
+ register_names, tdesc and register_reggroup_p.
+ (I386_NUM_FREGS): Removed.
+ (I386_SSE_NUM_REGS): Replace I386_NUM_FREGS with I387_NUM_REGS.
+
+ * i387-tdep.h (I387_NUM_REGS): New.
+
+2010-02-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Move tdesc_use_registers
+ further toward the end of the function.
+
+2010-02-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Move tdesc_use_registers
+ toward the end of the function.
+
+2010-02-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c: Include "features/i386/amd64.c".
+ (amd64_core_read_description): New.
+ (_initialize_amd64_tdep): Likewise.
+ (amd64_init_abi): Call set_gdbarch_core_read_description.
+
+ * amd64-tdep.h (tdesc_amd64): New.
+
+ * i386-tdep.c: Include i386-tdep.h" instead of "amd64-tdep.h".
+ Include "amd64-tdep.h" instead of "features/i386/amd64.c" when
+ BFD64 is defined.
+ (i386_core_read_description): New.
+ (i386_gdbarch_init): Call set_gdbarch_core_read_description.
+ (_initialize_i386_tdep): Don't Call initialize_tdesc_amd64.
+
+ * i386-tdep.h (tdesc_i386): New.
+
+2010-02-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_read_description): New.
+ (_initialize_amd64_linux_nat): Use it.
+
+ * amd64-linux-tdep.c: Include "i386-linux-tdep.h" and
+ features/i386/amd64-linux.c.
+ (amd64_linux_register_name): New.
+ (amd64_linux_register_type): Likewise.
+ (amd64_linux_core_read_description): Likewise.
+ (amd64_linux_init_abi): Support remote stub without XML target
+ description. Use amd64_linux_core_read_description instead of
+ i386_linux_core_read_description.
+ (_initialize_amd64_linux_tdep): Call initialize_tdesc_amd64_linux.
+
+ * amd64-linux-tdep.h: Don't include "i386-linux-tdep.h".
+ (tdesc_amd64_linux): New.
+
+ * i386-linux-nat.c (i386_linux_read_description): New.
+
+ * i386-linux-tdep.c: Include "i386-tdep.h/"i386-linux-tdep.h"
+ instead of "amd64-tdep.h"/"amd64-linux-tdep.h".
+ (i386_linux_register_name): Don't check BFD64.
+ (i386_linux_register_type): Likewise.
+ (_initialize_i386_linux_tdep): Likewise.
+ (i386_linux_init_orig_eax): Removed.
+ (i386_linux_core_read_description): Make it static. Don't
+ check BFD64.
+ (i386_linux_read_description): Removed.
+ (i386_linux_init_abi): Support remote stub without XML target
+ description.
+
+ * i386-linux-tdep.h (i386_linux_core_read_description): Removed.
+ (i386_linux_read_description): Likewise.
+ (i386_linux_init_orig_eax): Likewise.
+ (tdesc_i386_linux): New.
+
+2010-02-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Optimize for BFD64.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_register_name): Optimized for
+ BFD64.
+ (i386_linux_register_type): Likewise.
+ (i386_linux_init_orig_eax): Likewise.
+ (i386_linux_read_description): Likewise.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * target-descriptions.c (tdesc_gdb_type): Correct i386_eflags
+ type.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Set numbers of different
+ registers separately for 32bit and 64bit.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i387_ext_type): Call tdesc_find_type instead of
+ arch_float_type.
+
+ * target-descriptions.c (tdesc_find_type): New.
+ (tdesc_gdb_type): Use it.
+
+ * target-descriptions.h (tdesc_find_type): New.
+
+2010-02-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c: Replace x86-64/x86_64 with amd64.
+ * i386-tdep.c: Likewise.
+
+ * features/Makefile: Replace x86-64 with amd64.
+ * features/i386/*: Rename x86-64* to amd64*.
+
+ * regformats/i386/*: Rename x86-64* to amd64*.
+
+2010-02-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ * features/Makefile (I386-XMLTOC): Removed.
+ (I386-CFILES): Likewise.
+ (i386-cfiles): Likewise.
+
+2010-02-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_init_orig_eax): Return only
+ if XML target description is available.
+
+2010-02-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_init_orig_eax): Check
+ org.gnu.gdb.i386.linux instead of org.gnu.gdb.i386.core.
+
+2010-02-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_init_abi): Revert the last
+ change. Call i386_linux_init_orig_eax.
+
+ * i386-linux-tdep.c (i386_linux_register_name): Make it static.
+ (i386_linux_register_type): Likewise.
+ (i386_linux_init_orig_eax): New.
+ (i386_linux_init_abi): Revert the last change. Call
+ i386_linux_init_orig_eax.
+
+ * i386-linux-tdep.h (i386_linux_register_name): Removed.
+ (i386_linux_register_type): Likewise.
+ (i386_linux_init_orig_eax): New.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (amd64_linux_init_abi): Restore
+ set_gdbarch_num_regs. Call set_gdbarch_register_name,
+ set_gdbarch_register_type and set_gdbarch_remote_register_number.
+
+ * amd64-linux-tdep.h: Include "i386-linux-tdep.h".
+
+ * i386-linux-tdep.c: Include "i386-tdep.h" and
+ "i386-linux-tdep.h" with "amd64-tdep.h" and "amd64-linux-tdep.h".
+ (i386_linux_register_name): Restored and rewote. Make it global.
+ (i386_linux_register_type): New.
+ (i386_linux_init_abi): Restore set_gdbarch_num_regs and
+ set_gdbarch_register_name. Call set_gdbarch_register_type and
+ set_gdbarch_remote_register_number.
+
+ * i386-linux-tdep.h (i386_linux_register_name): New.
+ (i386_linux_register_type): Likewise.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Fix a
+ typo in comments.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_init): Optimize target description
+ check.
+
+2010-02-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c: Include "i386-linux-tdep.h"
+ (amd64_linux_init_abi): Call set_gdbarch_core_read_description.
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Fix a
+ typo.
+
+2010-02-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (_initialize_amd64_linux_nat): Set
+ to_read_description to i386_linux_read_description.
+ * i386-linux-nat.c (_initialize_i386_linux_nat): Likewise.
+
+ * amd64-linux-tdep.c (amd64_linux_register_name): Removed.
+ (amd64_linux_register_type): Likewise.
+ (amd64_linux_init_abi): Don't call set_gdbarch_num_regs,
+ set_gdbarch_register_name nor set_gdbarch_register_type.
+
+ * amd64-tdep.c (amd64_register_names): Make it global.
+ (amd64_register_name): Removed.
+ (amd64_register_type): Likewise.
+ (amd64_init_abi): Don't call set_gdbarch_num_regs,
+ set_gdbarch_register_name nor set_gdbarch_register_type.
+
+ * amd64-tdep.h (amd64_register_names): New.
+
+ * i386-linux-tdep.c: Include features/i386/i386-linux.c and
+ features/i386/x86-64-linux.c.
+ (i386_linux_register_name): Removed.
+ (i386_linux_core_read_description): New.
+ (i386_linux_read_description): Likewise.
+ (i386_linux_init_abi): Don't call set_gdbarch_num_regs nor
+ set_gdbarch_register_name. Call
+ set_gdbarch_core_read_description.
+ (_initialize_i386_linux_tdep): Call initialize_tdesc_i386_linux
+ and initialize_tdesc_x86_64_linux.
+
+ * i386-linux-tdep.h (i386_linux_core_read_description): New.
+ (i386_linux_read_description): Likewise.
+
+ * i386-tdep.c: Include "amd64-tdep.h" instead of "i386-tdep.h".
+ Include features/i386/i386.c and features/i386/x86-64.c.
+ (i386_num_register_names): Removed.
+ (i386_register_names): Make it const.
+ (i386_mmx_names): Likewise.
+ (i386_num_register_names): Removed.
+ (i386_register_name): Likewise.
+ (i386_eflags_type): Likewise.
+ (i386_mxcsr_type): Likewise.
+ (i386_sse_type): Likewise.
+ (i386_register_type): Likewise.
+ (i386_pseudo_register_name): New.
+ (i386_pseudo_register_type): Likewise.
+ (i386_mmx_type): Make it static.
+ (i386_gdbarch_init): Don't call set_gdbarch_register_name
+ nor set_gdbarch_register_type. Call
+ set_tdesc_pseudo_register_type, set_tdesc_pseudo_register_name
+ and tdesc_use_registers.
+ (_initialize_i386_tdep): Call initialize_tdesc_i386 and
+ initialize_tdesc_x86_64.
+
+ * i386-tdep.h (gdbarch_tdep): Remove i386_eflags_type,
+ i386_mxcsr_type and i386_sse_type.
+ (i386_eflags_type): Removed.
+ (i386_mxcsr_type): Likewise.
+ (i386_mmx_type): Likewise.
+ (i386_sse_type): Likewise.
+ (i386_register_name): Likewise.
+
+ * features/Makefile (I386-XMLTOC): New.
+ (I386-CFILES): Likewise.
+ (i386-cfiles): Likewise.
+
+ * features/i386/32bit-sse.xml: Update vec128 type.
+ * features/i386/64bit-sse.xml: Likewise.
+
+ * features/i386/i386-linux.c: Regenerated.
+ * features/i386/i386.c: Likewise.
+ * features/i386/x86-64-linux.c: Likewise.
+ * features/i386/x86-64.c: Likewise.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * target-descriptions.c (tdesc_type): Add TDESC_TYPE_I387_EXT,
+ TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
+ (tdesc_predefined_types): Add i387_ext, i386_eflags and
+ i386_mxcsr.
+ (tdesc_gdb_type): Handle TDESC_TYPE_I387_EXT,
+ TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
+ (
+ * features/i386/32bit-core.xml: Replace i386_ext with i387_ext.
+ * features/i386/64bit-core.xml: Likewise.
+
+ * features/i386/i386-linux.c: New.
+ * features/i386/i386.c: Likewise.
+ * features/i386/x86-64-linux.c: Likewise.
+ * features/i386/x86-64.c: Likewise.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * features/i386/32bit-core.xml: New.
+ * features/i386/32bit-linux.xml: Likewise.
+ * features/i386/32bit-sse.xml: Likewise.
+ * features/i386/64bit-core.xml: Likewise.
+ * features/i386/64bit-linux.xml: Likewise.
+ * features/i386/64bit-sse.xml: Likewise.
+ * features/i386/i386-linux.xml: Likewise.
+ * features/i386/i386.xml: Likewise.
+ * features/i386/x86-64-linux.xml: Likewise.
+ * features/i386/x86-64.xml: Likewise.
+
+ * features/Makefile (WHICH): Add i386/i386, i386/i386-linux,
+ i386/x86-64 and i386/x86-64-linux.
+ (i386/i386-expedite): New.
+ (i386/i386-linux-expedite): Likewise.
+ (i386/x86-64-expedite):Likewise.
+ (i386/x86-64-linux-expedite): Likewise.
+ ($(outdir)/i386/i386.dat): New dependency.
+ ($(outdir)/i386/i386-linux.dat): Likewise.
+ ($(outdir)/i386/x86-64.dat): Likewise.
+ ($(outdir)/i386/x86-64-linux.dat): Likewise.
+
+ * regformats/i386/i386-linux.dat: Regenerated.
+ * regformats/i386/i386.dat: Likewise.
+ * regformats/i386/x86-64-linux.dat: Likewise.
+ * regformats/i386/x86-64.dat: Likewise.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regformats/reg-i386-linux.dat: Moved to ...
+ * regformats/i386/i386-linux.dat: Here.
+
+ * regformats/reg-i386.dat: Moved to ...
+ * regformats/i386/i386.dat: Here.
+
+ * regformats/reg-x86-64-linux.dat: Moved to ...
+ * regformats/i386/x86-64-linux.dat: Here.
+
+ * regformats/reg-x86-64.dat: Moved to ...
+ * regformats/i386/x86-64.dat: Here.
--- ./gdb/ChangeLog.xstate 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/ChangeLog.xstate 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,384 @@
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Updated.
+
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_init_abi): Updated.
+ * i386-tdep.c (i386_gdbarch_init): Likewise.
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Change function
+ arguments.
+ * i386-tdep.h (i386_gdbarch_vector_unit_init): Likeise.
+
+2010-01-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common/xstate-nat.c (i386_xstate_init): Use enabled size.
+
+2010-01-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_fxsave): Check vector_unit.
+ (i387_collect_fxsave): Likewise.
+
+2010-01-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regcache.c (regcache_raw_supply_part): Group it with ...
+ (regcache_raw_collect_part): This.
+
+2010-01-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-tdep.c (i386_linux_core_read_description): Set
+ vector_unit to sse if there is no .reg-xstate section.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (_initialize_amd64_linux_nat): Assert
+ i386_xstate.state != XSTATE_UNKNOWN instead of calling i386_xstate_init.
+ * i386-linux-nat.c (_initialize_i386_linux_nat): Likewise.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c (_initialize_amd64_linux_tdep): Call
+ i386_xstate_init and update the XSAVE extended state size on
+ Linux/x86 host.
+ * i386-linux-tdep.c (_initialize_i386_linux_tdep): Likewise.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-tdep.c: Include "i386-linux-tdep.h" and "regset.h".
+ (amd64_linux_regset_sections): New.
+ (amd64_linux_init_abi): Call set_gdbarch_core_regset_sections
+ with amd64_linux_regset_sections. Call
+ set_gdbarch_core_read_description with
+ i386_linux_core_read_description.
+
+ * amd64-tdep.c (amd64_supply_xstateregset): New.
+ (amd64_collect_xstateregset): Likewise.
+ (amd64_regset_from_core_section): Check .reg-xstate section.
+
+ * i386-linux-tdep.c (i386_linux_regset_sections): Add
+ .reg-xstate section.
+ (i386_linux_core_read_description): New.
+ (i386_linux_init_abi): Call set_gdbarch_core_read_description
+ with i386_linux_core_read_description.
+
+ * i386-linux-tdep.h (i386_linux_core_read_description): New.
+
+ * i386-tdep.c (i386_supply_xstateregset): New.
+ (i386_collect_xstateregset): Likewise.
+ (i386_regset_from_core_section): Check .reg-xstate section.
+ (i386_gdbarch_init): Initialize xstateregset to NULL.
+
+ * i386-tdep.h (gdbarch_tdep): Add xstateregset.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_init_abi): Set sizeof_xstateregset to 0.
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): Set
+ sizeof_xstateregset if XSAVE extended state is supported.
+ (i386_gdbarch_init): Set sizeof_xstateregset to 0.
+
+ * i386-tdep.h (gdbarch_tdep): Add sizeof_xstateregset.
+
+ * common/xstate-nat.c (i386_xstate_init): Set i386_xstate.size.
+
+ * common/xstate-nat.h (i386_xstate_type): Add size.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-tdep.c (amd64_register_names): Renamed to ...
+ (amd64_sse_register_names): This. Remove AVX registers.
+ (amd64_avx_register_names): New.
+ (AMD64_NUM_REGS): Updated.
+ (amd64_register_name): Handle vector_unit.
+ (amd64_register_type): Replace i386_sse_type with
+ i386_vector_type.
+
+ * defs.h (MAX_REGISTER_SIZE): Increase to 32.
+
+ * i386-tdep.c: (i386_register_names): Renamed to ...
+ (i386_sse_register_names): This.
+ (i386_avx_register_names): New.
+ (i386_vec128_type): Likewise.
+ (i386_vec256_type): Likewise.
+ (i386_num_register_names): Updated.
+ (i386_gdbarch_sse_unit_init): Likewise.
+ (i386_register_name): Handle vector_unit.
+ (i386_sse_type): Renamed to ...
+ (i386_vector_type): This. Handle vector_unit.
+ (amd64_register_type): Replace i386_sse_type with
+ i386_vector_type.
+
+ * i386-tdep.h (gdbarch_tdep): Replace i386_sse_type with
+ i386_vector_type.
+ (I386_MAX_REGISTER_SIZE): Increase to 32.
+ (i386_sse_type): Renamed to ...
+ (i386_vector_type): This.
+
+2010-01-25 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (xsave-nat.o): Renamed to ...
+ (xstate-nat.o): This.
+
+ * common/xsave-nat.c: Moved to ...
+ * common/xstate-nat.c: This.
+
+ * common/xsave-nat.h: Moved to ...
+ * common/xstate-nat.h: This.
+
+ * config/i386/linux.mh (NATDEPFILES): Replace xsave-nat.o with
+ xstate-nat.o.
+ * config/i386/linux64.mh (NATDEPFILES): Likewise.
+
+ * config/i386/nm-linux.h: Include "xstate-nat.h" instead of
+ "xsave-nat.h".
+ * config/i386/nm-linux64.h: Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_fetch_inferior_registers):
+ Issue an error if PTRACE_GETXSTATEREGS failed and XSAVE
+ extended state is higher than SSE.
+ (amd64_linux_store_inferior_registers): Likewise.
+ * i386-linux-nat.c (fetch_xstateregs): Likewise.
+ (store_xstateregs): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common/xsave-nat.c: Include "i386-cpuid.h" instead of
+ "config/i386/i386-cpuid.h".
+
+ * config/i386/i386-cpuid.h: Moved to ...
+ * common/i386-cpuid.h: Here.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (xsave-nat.o): New.
+
+ * xsave-nat.c: Moved to ...
+ * common/xsave-nat.c: Here.
+
+ * xsave-nat.h: Moved to ...
+ * common/xsave-nat.h: Here.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-linux-nat.c (have_ptrace_getxstateregs): New.
+ (PTRACE_GETXSTATEREGS): Likewise.
+ (PTRACE_SETXSTATEREGS): Likewise.
+ (fetch_xstateregs): Likewise.
+ (store_xstateregs): Likewise.
+ (i386_linux_fetch_inferior_registers): Support XSAVE extended
+ state.
+ (i386_linux_store_inferior_registers): Likewise.
+ (_initialize_i386_linux_nat): Call i386_xstate_init and set
+ have_ptrace_getxstateregs.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (xsave_avxh_offset): New.
+ (XSAVE_AVXH_ADDR): Likewise.
+ (i387_supply_xsave): Use XSAVE_SSE_ADDR and XSAVE_AVXH_ADDR for
+ AVX vector unit.
+ (i387_collect_xsave): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (xsave_sse_offset): New.
+ (XSAVE_SSE_ADDR): Likewise.
+ (i387_supply_xsave): Use XSAVE_SSE_ADDR.
+ (i387_collect_xsave): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-tdep.c (i387_supply_xsave): Check vector unit.
+ (i387_collect_xsave): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gregset.h (GDB_XSTATE_SSE_REGSET_T): Removed.
+ (GDB_XSTATE_AVX_REGSET_T): Likewise.
+ (gdb_xstate_sse_regset_t): Likewise.
+ (gdb_xstate_avx_regset_t): Likewise.
+ (supply_xstate_sse_regset): Likewise.
+ (supply_xstate_avx_regset): Likewise.
+ (fill_xstate_sse_regset): Likewise.
+ (fill_xstate_avx_regset): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regcache.c (regcache_raw_supply_part): New.
+ (regcache_raw_collect_part): Likewise.
+ * regcache.h (regcache_raw_supply_part): Likewise.
+ (regcache_raw_collect_part): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_init_abi): Call
+ i386_gdbarch_vector_unit_init.
+
+ * i386-tdep.c (i386_gdbarch_vector_unit_init): New.
+ (i386_gdbarch_init): Call i386_gdbarch_vector_unit_init.
+
+ * i386-tdep.h (x86_vector_unit): New.
+ (gdbarch_tdep): Add vector_unit.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (_initialize_amd64_linux_nat): Always call
+ i386_xstate_init ().
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (have_ptrace_getxstateregs): New.
+ (PTRACE_GETXSTATEREGS): Likewise.
+ (PTRACE_SETXSTATEREGS): Likewise.
+ (amd64_linux_fetch_inferior_registers): Support XSAVE extended
+ state.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (amd64_linux_fetch_inferior_registers_with_xsave): Removed.
+ (amd64_linux_store_inferior_registers_with_xsave): Likewise.
+ (_initialize_amd64_linux_nat): Updated.
+
+ * configure.ac: Remove check for PTRACE_GETXSTATEREGS.
+ * config.in: Regenerated.
+ * configure: Likewise.
+
+ * config/i386/nm-linux.h (USE_XSAVE): Changed to ...
+ (FILL_XSTATEREGSET): This.
+ * onfig/i386/nm-linux64.h: Likewise.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * xsave-nat.c (i386_xstate_init): Properly set state.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Don't include "xsave-nat.h".
+ (amd64_linux_fetch_inferior_registers_with_xstate): Renamed to ...
+ (amd64_linux_fetch_inferior_registers_with_xsave): This.
+ (amd64_linux_store_inferior_registers_with_xstate): Renamed to ...
+ (amd64_linux_store_inferior_registers_with_xsave): This.
+
+ * config/i386/nm-linux.h: Include "xsave-nat.h".
+ * config/i386/nm-linux64.h: Likewise.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/i386/linux64.mh (NAT_FILE): Set to nm-linux64.h.
+
+ * config/i386/nm-linux.h (USE_XSAVE): New.
+
+ * config/i386/nm-linux64.h: New.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * xsave-nat.c: Include "config/i386/i386-cpuid.h" if <cpuid.h>
+ isn't available.
+
+ * config/i386/i386-cpuid.h: New. Taken from gcc 4.4.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Include "xsave-nat.h"
+ (_initialize_amd64_linux_nat): Check HAVE_PTRACE_GETXSTATEREGS
+ instead of HAVE_SYS_XSTATE_H.
+
+ * configure.ac: Add check for cpuid.h. Remove check for
+ sys/xstate.h, __get_xstate and __get_xstate_size.
+ * config.in: Regenerated.
+ * configure: Likewise.
+
+ * i386-nat.c (i386_xstate): Removed.
+ (i386_xstate_init): Likewise.
+
+ * i386-nat.h (i386_xstate_type): Removed.
+ (i386_xstate): Likewise.
+ (i386_xstate_init): Likewise.
+
+ * xsave-nat.c: New.
+ * xsave-nat.h: Likewise.
+
+ * config/i386/linux.mh (NATDEPFILES): Add xsave-nat.o.
+ * config/i386/linux64.mh (NATDEPFILES): Likewise.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_fetch_inferior_registers_with_xstate):
+ Call amd64_supply_xsave instead of amd64_supply_fxsave.
+ (amd64_linux_store_inferior_registers_with_xstate): Call
+ amd64_collect_fxsave instead of amd64_collect_xsave.
+
+ * amd64-tdep.c (amd64_supply_xsave): New.
+ (amd64_collect_xsave): Likewise.
+ * amd64-tdep.h (amd64_supply_xsave): Likewise.
+ (amd64_collect_xsave): Likewise.
+ * i387-tdep.c (i387_supply_xsave): Likewise.
+ (i387_collect_xsave): Likewise.
+ * i387-tdep.h (i387_supply_xsave): Likewise.
+ (i387_collect_xsave): Likewise.
+
+ * i386-nat.h: Update comments.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_fetch_inferior_registers): Revert
+ the last change,
+ (amd64_linux_store_inferior_registers): Likewise.
+ (amd64_linux_fetch_inferior_registers_with_xstate): New.
+ (amd64_linux_store_inferior_registers_with_xstate): Likewise.
+ (_initialize_amd64_linux_nat): Use
+ amd64_linux_fetch_inferior_registers_with_xstate and
+ amd64_linux_store_inferior_registers_with_xstate if possible.
+
+ * i386-nat.h (i386_xstate_type): Rename size to n_of_int64.
+ * i386-nat.c (i386_xstate): Updated.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c (amd64_linux_fetch_inferior_registers):
+ Use PTRACE_GETXSTATEREGS/PTRACE_SETXSTATEREGS if posssible.
+ (amd64_linux_store_inferior_registers): Likewise.
+ (_initialize_amd64_linux_nat): Call i386_xstate_init.
+
+ * i386-nat.c (i386_xstate): New.
+ (i386_xstate_init): Likewise.
+
+ * i386-nat.h (i386_xstate_type): New.
+ (i386_xstate): Likewise.
+ (i386_xstate_init): Likewise.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Revert the change change.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * configure.ac: Add check for __get_xstate_size.
+ * config.in: Regenerated.
+ * configure: Likewise.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * amd64-linux-nat.c: Include <sys/xstate.h> if HAVE_SYS_XSTATE_H
+ is defined.
+ (have_ptrace_getxstateregs): New.
+ (_initialize_amd64_linux_nat): Clear have_ptrace_getxstateregs
+ if needed.
+
+ * gregset.h (GDB_XSTATE_SSE_REGSET_T): New.
+ (GDB_XSTATE_AVX_REGSET_T): Likewise.
+ (gdb_xstate_sse_regset_t): Likewise.
+ (gdb_xstate_avx_regset_t): Likewise.
+ (supply_xstate_sse_regset): Likewise.
+ (supply_xstate_avx_regset): Likewise.
+ (fill_xstate_sse_regset): Likewise.
+ (fill_xstate_avx_regset): Likewise.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * configure.ac: Add check for sys/xstate.h, __get_xstate and
+ PTRACE_GETXSTATEREGS.
+ * config.in: Regenerated.
+ * configure: Likewise.
--- ./gdb/amd64-linux-nat.c 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/amd64-linux-nat.c 2010-04-03 21:15:08.000000000 +0200
@@ -23,11 +23,14 @@
#include "inferior.h"
#include "gdbcore.h"
#include "regcache.h"
+#include "regset.h"
#include "linux-nat.h"
#include "amd64-linux-tdep.h"
#include "gdb_assert.h"
#include "gdb_string.h"
+#include "elf/common.h"
+#include <sys/uio.h>
#include <sys/ptrace.h>
#include <sys/debugreg.h>
#include <sys/syscall.h>
@@ -54,6 +57,18 @@
#include "i387-tdep.h"
#include "elf-bfd.h"
#include "gdb_procfs32.h"
+#include "i386-xstate.h"
+
+#ifndef PTRACE_GETREGSET
+#define PTRACE_GETREGSET 0x4204
+#endif
+
+#ifndef PTRACE_SETREGSET
+#define PTRACE_SETREGSET 0x4205
+#endif
+
+/* Does the current host support PTRACE_GETREGSET? */
+static int have_ptrace_getregset = -1;
/* Mapping between the general-purpose registers in GNU/Linux x86-64
`struct user' format and GDB's register cache layout. */
@@ -76,6 +91,8 @@ static int amd64_linux_gregset64_reg_off
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
ORIG_RAX * 8
};
@@ -131,6 +148,7 @@ static int amd64_linux_gregset32_reg_off
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
ORIG_RAX * 8 /* "orig_eax" */
};
@@ -312,10 +330,26 @@ amd64_linux_fetch_inferior_registers (st
{
elf_fpregset_t fpregs;
- if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
- perror_with_name (_("Couldn't get floating point status"));
+ if (have_ptrace_getregset)
+ {
+ char xstateregs[I386_XSTATE_MAX_SIZE];
+ struct iovec iov;
+
+ iov.iov_base = xstateregs;
+ iov.iov_len = sizeof (xstateregs);
+ if (ptrace (PTRACE_GETREGSET, tid,
+ (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
+ perror_with_name (_("Couldn't get extended state status"));
- amd64_supply_fxsave (regcache, -1, &fpregs);
+ amd64_supply_xsave (regcache, -1, xstateregs);
+ }
+ else
+ {
+ if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
+ perror_with_name (_("Couldn't get floating point status"));
+
+ amd64_supply_fxsave (regcache, -1, &fpregs);
+ }
}
}
@@ -355,15 +389,33 @@ amd64_linux_store_inferior_registers (st
{
elf_fpregset_t fpregs;
- if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
- perror_with_name (_("Couldn't get floating point status"));
+ if (have_ptrace_getregset)
+ {
+ char xstateregs[I386_XSTATE_MAX_SIZE];
+ struct iovec iov;
- amd64_collect_fxsave (regcache, regnum, &fpregs);
+ iov.iov_base = xstateregs;
+ iov.iov_len = sizeof (xstateregs);
+ if (ptrace (PTRACE_GETREGSET, tid,
+ (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
+ perror_with_name (_("Couldn't get extended state status"));
+
+ amd64_collect_xsave (regcache, regnum, xstateregs, 0);
+
+ if (ptrace (PTRACE_SETREGSET, tid,
+ (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
+ perror_with_name (_("Couldn't write extended state status"));
+ }
+ else
+ {
+ if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
+ perror_with_name (_("Couldn't get floating point status"));
- if (ptrace (PTRACE_SETFPREGS, tid, 0, (long) &fpregs) < 0)
- perror_with_name (_("Couldn't write floating point status"));
+ amd64_collect_fxsave (regcache, regnum, &fpregs);
- return;
+ if (ptrace (PTRACE_SETFPREGS, tid, 0, (long) &fpregs) < 0)
+ perror_with_name (_("Couldn't write floating point status"));
+ }
}
}
@@ -831,6 +883,8 @@ amd64_linux_read_description (struct tar
{
unsigned long cs;
int tid;
+ int is_64bit;
+ static uint64_t xcr0;
/* GNU/Linux LWP ID's are process ID's. */
tid = TIDGET (inferior_ptid);
@@ -844,10 +898,55 @@ amd64_linux_read_description (struct tar
if (errno != 0)
perror_with_name (_("Couldn't get CS register"));
- if (cs == AMD64_LINUX_USER64_CS)
- return tdesc_amd64_linux;
+ is_64bit = cs == AMD64_LINUX_USER64_CS;
+
+ if (have_ptrace_getregset == -1)
+ {
+ uint64_t xstateregs[(I386_XSTATE_SSE_SIZE / sizeof (uint64_t))];
+ struct iovec iov;
+ unsigned int xstate_size;
+
+ iov.iov_base = xstateregs;
+ iov.iov_len = sizeof (xstateregs);
+
+ /* Check if PTRACE_GETREGSET works. */
+ if (ptrace (PTRACE_GETREGSET, tid,
+ (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
+ {
+ have_ptrace_getregset = 0;
+ xstate_size = 0;
+ }
+ else
+ {
+ have_ptrace_getregset = 1;
+
+ /* Get XCR0 from XSAVE extended state. */
+ xcr0 = xstateregs[(I386_LINUX_XSAVE_XCR0_OFFSET
+ / sizeof (uint64_t))];
+
+ xstate_size = I386_XSTATE_SIZE (xcr0);
+ }
+
+ i386_linux_update_xstateregset (xstate_size);
+ amd64_linux_update_xstateregset (xstate_size);
+ }
+
+ /* Check the native XCR0 only if PTRACE_GETREGSET is available. */
+ if (have_ptrace_getregset
+ && (xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK)
+ {
+ if (is_64bit)
+ return tdesc_amd64_avx_linux;
+ else
+ return tdesc_i386_avx_linux;
+ }
else
- return tdesc_i386_linux;
+ {
+ if (is_64bit)
+ return tdesc_amd64_linux;
+ else
+ return tdesc_i386_linux;
+ }
}
/* Provide a prototype to silence -Wmissing-prototypes. */
--- ./gdb/amd64-linux-tdep.c 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/amd64-linux-tdep.c 2010-04-03 21:12:32.000000000 +0200
@@ -28,8 +28,11 @@
#include "symtab.h"
#include "gdbtypes.h"
#include "reggroups.h"
+#include "regset.h"
#include "amd64-linux-tdep.h"
+#include "i386-linux-tdep.h"
#include "linux-tdep.h"
+#include "i386-xstate.h"
#include "gdb_string.h"
@@ -38,6 +41,7 @@
#include "xml-syscall.h"
#include "features/i386/amd64-linux.c"
+#include "features/i386/amd64-avx-linux.c"
/* The syscall's XML filename for i386. */
#define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml"
@@ -45,6 +49,15 @@
#include "record.h"
#include "linux-record.h"
+/* Supported register note sections. */
+static struct core_regset_section amd64_linux_regset_sections[] =
+{
+ { ".reg", 144, "general-purpose" },
+ { ".reg2", 512, "floating-point" },
+ { ".reg-xstate", 0, "XSAVE extended state" },
+ { NULL, 0 }
+};
+
/* Mapping between the general-purpose registers in `struct user'
format and GDB's register cache layout. */
@@ -1316,6 +1329,22 @@ amd64_linux_record_signal (struct gdbarc
return 0;
}
+/* Update XSAVE extended state register note section. */
+
+void
+amd64_linux_update_xstateregset (unsigned int xstate_size)
+{
+ struct core_regset_section *xstate = &amd64_linux_regset_sections[2];
+
+ /* Update the XSAVE extended state register note section for "gcore".
+ Disable it if its size is 0. */
+ gdb_assert (strcmp (xstate->sect_name, ".reg-xstate") == 0);
+ if (xstate_size)
+ xstate->size = xstate_size;
+ else
+ xstate->sect_name = NULL;
+}
+
/* Get Linux/x86 target description from core dump. */
static const struct target_desc *
@@ -1324,12 +1353,17 @@ amd64_linux_core_read_description (struc
bfd *abfd)
{
asection *section = bfd_get_section_by_name (abfd, ".reg2");
+ uint64_t xcr0;
if (section == NULL)
return NULL;
/* Linux/x86-64. */
- return tdesc_amd64_linux;
+ xcr0 = i386_linux_core_read_xcr0 (gdbarch, target, abfd);
+ if ((xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK)
+ return tdesc_amd64_avx_linux;
+ else
+ return tdesc_amd64_linux;
}
static void
@@ -1373,6 +1407,8 @@ amd64_linux_init_abi (struct gdbarch_inf
tdep->outermost_frame_p = amd64_linux_outermost_frame;
+ tdep->xsave_xcr0_offset = I386_LINUX_XSAVE_XCR0_OFFSET;
+
/* GNU/Linux uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
@@ -1394,6 +1430,9 @@ amd64_linux_init_abi (struct gdbarch_inf
/* GNU/Linux uses SVR4-style shared libraries. */
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
+ /* Install supported register note sections. */
+ set_gdbarch_core_regset_sections (gdbarch, amd64_linux_regset_sections);
+
set_gdbarch_core_read_description (gdbarch,
amd64_linux_core_read_description);
@@ -1596,4 +1635,5 @@ _initialize_amd64_linux_tdep (void)
/* Initialize the Linux target description */
initialize_tdesc_amd64_linux ();
+ initialize_tdesc_amd64_avx_linux ();
}
--- ./gdb/amd64-linux-tdep.h 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/amd64-linux-tdep.h 2010-04-03 21:12:32.000000000 +0200
@@ -26,13 +26,17 @@
/* Register number for the "orig_rax" register. If this register
contains a value >= 0 it is interpreted as the system call number
that the kernel is supposed to restart. */
-#define AMD64_LINUX_ORIG_RAX_REGNUM (AMD64_MXCSR_REGNUM + 1)
+#define AMD64_LINUX_ORIG_RAX_REGNUM (AMD64_YMM15H_REGNUM + 1)
/* Total number of registers for GNU/Linux. */
#define AMD64_LINUX_NUM_REGS (AMD64_LINUX_ORIG_RAX_REGNUM + 1)
/* Linux target description. */
extern struct target_desc *tdesc_amd64_linux;
+extern struct target_desc *tdesc_amd64_avx_linux;
+
+/* Update XSAVE extended state register note section. */
+extern void amd64_linux_update_xstateregset (unsigned int xstate_size);
/* Enum that defines the syscall identifiers for amd64 linux.
Used for process record/replay, these will be translated into
--- ./gdb/amd64-tdep.c 2010-04-03 21:11:41.000000000 +0200
+++ ./gdb/amd64-tdep.c 2010-04-03 21:12:32.000000000 +0200
@@ -43,6 +43,7 @@
#include "i387-tdep.h"
#include "features/i386/amd64.c"
+#include "features/i386/amd64-avx.c"
/* Note that the AMD64 architecture was previously known as x86-64.
The latter is (forever) engraved into the canonical system name as
@@ -71,8 +72,21 @@ static const char *amd64_register_names[
"mxcsr",
};
-/* Total number of registers. */
-#define AMD64_NUM_REGS ARRAY_SIZE (amd64_register_names)
+static const char *amd64_ymm_names[] =
+{
+ "ymm0", "ymm1", "ymm2", "ymm3",
+ "ymm4", "ymm5", "ymm6", "ymm7",
+ "ymm8", "ymm9", "ymm10", "ymm11",
+ "ymm12", "ymm13", "ymm14", "ymm15"
+};
+
+static const char *amd64_ymmh_names[] =
+{
+ "ymm0h", "ymm1h", "ymm2h", "ymm3h",
+ "ymm4h", "ymm5h", "ymm6h", "ymm7h",
+ "ymm8h", "ymm9h", "ymm10h", "ymm11h",
+ "ymm12h", "ymm13h", "ymm14h", "ymm15h"
+};
/* The registers used to pass integer arguments during a function call. */
static int amd64_dummy_call_integer_regs[] =
@@ -163,6 +177,8 @@ static const int amd64_dwarf_regmap_len
static int
amd64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ int ymm0_regnum = tdep->ymm0_regnum;
int regnum = -1;
if (reg >= 0 && reg < amd64_dwarf_regmap_len)
@@ -170,6 +186,9 @@ amd64_dwarf_reg_to_regnum (struct gdbarc
if (regnum == -1)
warning (_("Unmapped DWARF Register #%d encountered."), reg);
+ else if (ymm0_regnum >= 0
+ && i386_xmm_regnum_p (gdbarch, regnum))
+ regnum += ymm0_regnum - I387_XMM0_REGNUM (tdep);
return regnum;
}
@@ -238,6 +257,19 @@ static const char *amd64_dword_names[] =
"r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
};
+/* Return the name of register REGNUM, or the empty string if it is
+ an anonymous register. */
+
+static const char *
+amd64_register_name (struct gdbarch *gdbarch, int regnum)
+{
+ /* Hide the upper YMM registers. */
+ if (i386_ymmh_regnum_p (gdbarch, regnum))
+ return "";
+
+ return tdesc_register_name (gdbarch, regnum);
+}
+
/* Return the name of register REGNUM. */
static const char *
@@ -246,6 +278,8 @@ amd64_pseudo_register_name (struct gdbar
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
if (i386_byte_regnum_p (gdbarch, regnum))
return amd64_byte_names[regnum - tdep->al_regnum];
+ else if (i386_ymm_regnum_p (gdbarch, regnum))
+ return amd64_ymm_names[regnum - tdep->ymm0_regnum];
else if (i386_word_regnum_p (gdbarch, regnum))
return amd64_word_names[regnum - tdep->ax_regnum];
else if (i386_dword_regnum_p (gdbarch, regnum))
@@ -2181,6 +2215,28 @@ amd64_collect_fpregset (const struct reg
amd64_collect_fxsave (regcache, regnum, fpregs);
}
+/* Similar to amd64_supply_fpregset, but use XSAVE extended state. */
+
+static void
+amd64_supply_xstateregset (const struct regset *regset,
+ struct regcache *regcache, int regnum,
+ const void *xstateregs, size_t len)
+{
+ const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
+ amd64_supply_xsave (regcache, regnum, xstateregs);
+}
+
+/* Similar to amd64_collect_fpregset, but use XSAVE extended state. */
+
+static void
+amd64_collect_xstateregset (const struct regset *regset,
+ const struct regcache *regcache,
+ int regnum, void *xstateregs, size_t len)
+{
+ const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
+ amd64_collect_xsave (regcache, regnum, xstateregs, 1);
+}
+
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
@@ -2199,6 +2255,16 @@ amd64_regset_from_core_section (struct g
return tdep->fpregset;
}
+ if (strcmp (sect_name, ".reg-xstate") == 0)
+ {
+ if (tdep->xstateregset == NULL)
+ tdep->xstateregset = regset_alloc (gdbarch,
+ amd64_supply_xstateregset,
+ amd64_collect_xstateregset);
+
+ return tdep->xstateregset;
+ }
+
return i386_regset_from_core_section (gdbarch, sect_name, sect_size);
}
@@ -2261,6 +2327,13 @@ amd64_init_abi (struct gdbarch_info info
tdep->num_core_regs = AMD64_NUM_GREGS + I387_NUM_REGS;
tdep->register_names = amd64_register_names;
+ if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx") != NULL)
+ {
+ tdep->ymmh_register_names = amd64_ymmh_names;
+ tdep->num_ymm_regs = 16;
+ tdep->ymm0h_regnum = AMD64_YMM0H_REGNUM;
+ }
+
tdep->num_byte_regs = 20;
tdep->num_word_regs = 16;
tdep->num_dword_regs = 16;
@@ -2274,6 +2347,8 @@ amd64_init_abi (struct gdbarch_info info
set_tdesc_pseudo_register_name (gdbarch, amd64_pseudo_register_name);
+ set_gdbarch_register_name (gdbarch, amd64_register_name);
+
/* AMD64 has an FPU and 16 SSE registers. */
tdep->st0_regnum = AMD64_ST0_REGNUM;
tdep->num_xmm_regs = 16;
@@ -2354,6 +2429,7 @@ void
_initialize_amd64_tdep (void)
{
initialize_tdesc_amd64 ();
+ initialize_tdesc_amd64_avx ();
}
@@ -2389,6 +2465,30 @@ amd64_supply_fxsave (struct regcache *re
}
}
+/* Similar to amd64_supply_fxsave, but use XSAVE extended state. */
+
+void
+amd64_supply_xsave (struct regcache *regcache, int regnum,
+ const void *xsave)
+{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+ i387_supply_xsave (regcache, regnum, xsave);
+
+ if (xsave && gdbarch_ptr_bit (gdbarch) == 64)
+ {
+ const gdb_byte *regs = xsave;
+
+ if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep))
+ regcache_raw_supply (regcache, I387_FISEG_REGNUM (tdep),
+ regs + 12);
+ if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep))
+ regcache_raw_supply (regcache, I387_FOSEG_REGNUM (tdep),
+ regs + 20);
+ }
+}
+
/* Fill register REGNUM (if it is a floating-point or SSE register) in
*FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
all registers. This function doesn't touch any of the reserved
@@ -2412,3 +2512,26 @@ amd64_collect_fxsave (const struct regca
regcache_raw_collect (regcache, I387_FOSEG_REGNUM (tdep), regs + 20);
}
}
+
+/* Similar to amd64_collect_fxsave, but but use XSAVE extended state. */
+
+void
+amd64_collect_xsave (const struct regcache *regcache, int regnum,
+ void *xsave, int gcore)
+{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ gdb_byte *regs = xsave;
+
+ i387_collect_xsave (regcache, regnum, xsave, gcore);
+
+ if (gdbarch_ptr_bit (gdbarch) == 64)
+ {
+ if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep))
+ regcache_raw_collect (regcache, I387_FISEG_REGNUM (tdep),
+ regs + 12);
+ if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep))
+ regcache_raw_collect (regcache, I387_FOSEG_REGNUM (tdep),
+ regs + 20);
+ }
+}
--- ./gdb/amd64-tdep.h 2010-01-29 06:19:22.000000000 +0100
+++ ./gdb/amd64-tdep.h 2010-04-03 21:12:32.000000000 +0200
@@ -61,12 +61,16 @@ enum amd64_regnum
AMD64_FSTAT_REGNUM = AMD64_ST0_REGNUM + 9,
AMD64_XMM0_REGNUM = 40, /* %xmm0 */
AMD64_XMM1_REGNUM, /* %xmm1 */
- AMD64_MXCSR_REGNUM = AMD64_XMM0_REGNUM + 16
+ AMD64_MXCSR_REGNUM = AMD64_XMM0_REGNUM + 16,
+ AMD64_YMM0H_REGNUM, /* %ymm0h */
+ AMD64_YMM15H_REGNUM = AMD64_YMM0H_REGNUM + 15
};
/* Number of general purpose registers. */
#define AMD64_NUM_GREGS 24
+#define AMD64_NUM_REGS (AMD64_YMM15H_REGNUM + 1)
+
extern struct displaced_step_closure *amd64_displaced_step_copy_insn
(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to,
struct regcache *regs);
@@ -77,12 +81,6 @@ extern void amd64_displaced_step_fixup (
extern void amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
-/* Functions from amd64-tdep.c which may be needed on architectures
- with extra registers. */
-
-extern const char *amd64_register_name (struct gdbarch *gdbarch, int regnum);
-extern struct type *amd64_register_type (struct gdbarch *gdbarch, int regnum);
-
/* Fill register REGNUM in REGCACHE with the appropriate
floating-point or SSE register value from *FXSAVE. If REGNUM is
-1, do this for all registers. This function masks off any of the
@@ -91,6 +89,10 @@ extern struct type *amd64_register_type
extern void amd64_supply_fxsave (struct regcache *regcache, int regnum,
const void *fxsave);
+/* Similar to amd64_supply_fxsave, but use XSAVE extended state. */
+extern void amd64_supply_xsave (struct regcache *regcache, int regnum,
+ const void *xsave);
+
/* Fill register REGNUM (if it is a floating-point or SSE register) in
*FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
all registers. This function doesn't touch any of the reserved
@@ -99,6 +101,10 @@ extern void amd64_supply_fxsave (struct
extern void amd64_collect_fxsave (const struct regcache *regcache, int regnum,
void *fxsave);
+/* Similar to amd64_collect_fxsave, but but use XSAVE extended state. */
+extern void amd64_collect_xsave (const struct regcache *regcache,
+ int regnum, void *xsave, int gcore);
+
void amd64_classify (struct type *type, enum amd64_reg_class class[2]);
--- ./gdb/common/i386-xstate.h 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/common/i386-xstate.h 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,41 @@
+/* Common code for i386 XSAVE extended state.
+
+ Copyright (C) 2010 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 I386_XSTATE_H
+#define I386_XSTATE_H 1
+
+/* The extended state feature bits. */
+#define I386_XSTATE_X87 (1ULL << 0)
+#define I386_XSTATE_SSE (1ULL << 1)
+#define I386_XSTATE_AVX (1ULL << 2)
+
+/* Supported mask and size of the extended state. */
+#define I386_XSTATE_SSE_MASK (I386_XSTATE_X87 | I386_XSTATE_SSE)
+#define I386_XSTATE_AVX_MASK (I386_XSTATE_SSE_MASK | I386_XSTATE_AVX)
+
+#define I386_XSTATE_SSE_SIZE 576
+#define I386_XSTATE_AVX_SIZE 832
+#define I386_XSTATE_MAX_SIZE 832
+
+/* Get I386 XSAVE extended state size. */
+#define I386_XSTATE_SIZE(XCR0) \
+ (((XCR0) & I386_XSTATE_AVX) != 0 \
+ ? I386_XSTATE_AVX_SIZE : I386_XSTATE_SSE_SIZE)
+
+#endif /* I386_XSTATE_H */
--- ./gdb/config/djgpp/fnchange.lst 2010-02-01 20:27:55.000000000 +0100
+++ ./gdb/config/djgpp/fnchange.lst 2010-04-03 21:12:32.000000000 +0200
@@ -228,6 +228,14 @@
@V@/gdb/features/rs6000/powerpc-vsx64l.xml @V@/gdb/features/rs6000/ppc-v64l.xml
@V@/gdb/features/rs6000/powerpc-cell32l.xml @V@/gdb/features/rs6000/ppc-c32l.xml
@V@/gdb/features/rs6000/powerpc-cell64l.xml @V@/gdb/features/rs6000/ppc-c64l.xml
+@V@/gdb/features/i386/amd64-avx-linux.c @V@/gdb/features/i386/a64-al.c
+@V@/gdb/features/i386/amd64-avx.c @V@/gdb/features/i386/a64-a.c
+@V@/gdb/features/i386/amd64-avx-linux.xml @V@/gdb/features/i386/a64-al.xml
+@V@/gdb/features/i386/amd64-avx.xml @V@/gdb/features/i386/a64-a.xml
+@V@/gdb/features/i386/i386-avx-linux.c @V@/features/i386/i32-al.c
+@V@/gdb/features/i386/i386-avx.c @V@/gdb/features/i386/i32-a.c
+@V@/gdb/features/i386/i386-avx-linux.xml @V@/gdb/features/i386/i32-al.xml
+@V@/gdb/features/i386/i386-avx.xml @V@/gdb/features/i386/i32-a.xml
@V@/gdb/f-exp.tab.c @V@/gdb/f-exp_tab.c
@V@/gdb/gdbserver/linux-cris-low.c @V@/gdb/gdbserver/lx-cris.c
@V@/gdb/gdbserver/linux-crisv32-low.c @V@/gdb/gdbserver/lx-cris32.c
--- ./gdb/doc/ChangeLog.xcr 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/doc/ChangeLog.xcr 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,31 @@
+2010-03-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (General Query Packets): Replace "x86=xml" with
+ "xmlRegisters+".
+
+2010-03-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (General Query Packets): Updated.
+ (i386 Features): Likewise.
+
+2010-03-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (i386 Features): Make org.gnu.gdb.i386.avx optional.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (General Query Packets): Remove x86:xstate extension.
+ Document x86=xml extension in gdb remote protocol.
+
+2010-02-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (i386 Features): Add org.gnu.gdb.i386.avx.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo: Remove x86:xstate from stub reply.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo: Document x86:xstate extension in gdb remote
+ protocol.
--- ./gdb/doc/ChangeLog.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/doc/ChangeLog.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,28 @@
+2010-03-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (General Query Packets): Updated.
+
+2010-03-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (General Query Packets): Updated.
+
+2010-03-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (General Query Packets): Remove extra supports.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (General Query Packets): Add xmlRegisters.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo (Predefined Target Types): Add i387_ext,
+ i386_eflags and i386_mxcsr.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo: Update i386 target features.
+
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.texinfo: Document i386 target features.
--- ./gdb/features/Makefile 2010-02-08 06:08:46.000000000 +0100
+++ ./gdb/features/Makefile 2010-04-03 21:12:32.000000000 +0200
@@ -33,6 +33,8 @@
WHICH = arm-with-iwmmxt arm-with-vfpv2 arm-with-vfpv3 arm-with-neon \
i386/i386 i386/i386-linux \
i386/amd64 i386/amd64-linux \
+ i386/i386-avx i386/i386-avx-linux \
+ i386/amd64-avx i386/amd64-avx-linux \
mips-linux mips64-linux \
rs6000/powerpc-32l rs6000/powerpc-altivec32l rs6000/powerpc-e500l \
rs6000/powerpc-64l rs6000/powerpc-altivec64l rs6000/powerpc-vsx32l \
@@ -45,6 +47,10 @@ i386/i386-expedite = ebp,esp,eip
i386/i386-linux-expedite = ebp,esp,eip
i386/amd64-expedite = rbp,rsp,rip
i386/amd64-linux-expedite = rbp,rsp,rip
+i386/i386-avx-expedite = ebp,esp,eip
+i386/i386-avx-linux-expedite = ebp,esp,eip
+i386/amd64-avx-expedite = rbp,rsp,rip
+i386/amd64-avx-linux-expedite = rbp,rsp,rip
mips-expedite = r29,pc
mips64-expedite = r29,pc
powerpc-expedite = r1,pc
@@ -90,3 +96,9 @@ $(outdir)/i386/i386-linux.dat: i386/32bi
$(outdir)/i386/amd64.dat: i386/64bit-core.xml i386/64bit-sse.xml
$(outdir)/i386/amd64-linux.dat: i386/64bit-core.xml i386/64bit-sse.xml \
i386/64bit-linux.xml
+$(outdir)/i386/i386-avx.dat: i386/32bit-core.xml i386/32bit-avx.xml
+$(outdir)/i386/i386-avx-linux.dat: i386/32bit-core.xml i386/32bit-avx.xml \
+ i386/32bit-linux.xml
+$(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml
+$(outdir)/i386/amd64-avx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
+ i386/64bit-linux.xml
--- ./gdb/features/i386/32bit-avx.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/32bit-avx.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 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.i386.avx">
+ <reg name="ymm0h" bitsize="128" type="uint128"/>
+ <reg name="ymm1h" bitsize="128" type="uint128"/>
+ <reg name="ymm2h" bitsize="128" type="uint128"/>
+ <reg name="ymm3h" bitsize="128" type="uint128"/>
+ <reg name="ymm4h" bitsize="128" type="uint128"/>
+ <reg name="ymm5h" bitsize="128" type="uint128"/>
+ <reg name="ymm6h" bitsize="128" type="uint128"/>
+ <reg name="ymm7h" bitsize="128" type="uint128"/>
+</feature>
--- ./gdb/features/i386/64bit-avx.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/64bit-avx.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 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.i386.avx">
+ <reg name="ymm0h" bitsize="128" type="uint128"/>
+ <reg name="ymm1h" bitsize="128" type="uint128"/>
+ <reg name="ymm2h" bitsize="128" type="uint128"/>
+ <reg name="ymm3h" bitsize="128" type="uint128"/>
+ <reg name="ymm4h" bitsize="128" type="uint128"/>
+ <reg name="ymm5h" bitsize="128" type="uint128"/>
+ <reg name="ymm6h" bitsize="128" type="uint128"/>
+ <reg name="ymm7h" bitsize="128" type="uint128"/>
+ <reg name="ymm8h" bitsize="128" type="uint128"/>
+ <reg name="ymm9h" bitsize="128" type="uint128"/>
+ <reg name="ymm10h" bitsize="128" type="uint128"/>
+ <reg name="ymm11h" bitsize="128" type="uint128"/>
+ <reg name="ymm12h" bitsize="128" type="uint128"/>
+ <reg name="ymm13h" bitsize="128" type="uint128"/>
+ <reg name="ymm14h" bitsize="128" type="uint128"/>
+ <reg name="ymm15h" bitsize="128" type="uint128"/>
+</feature>
--- ./gdb/features/i386/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/Makefile 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,5 @@
+include Makefile
+
+XMLTOC = $(addsuffix .xml, $(filter i386/%, $(WHICH)))
+CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
+cfiles: $(CFILES)
--- ./gdb/features/i386/amd64-avx-linux.c 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/amd64-avx-linux.c 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,171 @@
+/* THIS FILE IS GENERATED. Original: amd64-avx-linux.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_amd64_avx_linux;
+static void
+initialize_tdesc_amd64_avx_linux (void)
+{
+ struct target_desc *result = allocate_target_description ();
+ struct tdesc_feature *feature;
+ struct tdesc_type *field_type, *type;
+
+ set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
+
+ set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+ field_type = tdesc_create_flags (feature, "i386_eflags", 4);
+ tdesc_add_flag (field_type, 0, "CF");
+ tdesc_add_flag (field_type, 1, "");
+ tdesc_add_flag (field_type, 2, "PF");
+ tdesc_add_flag (field_type, 4, "AF");
+ tdesc_add_flag (field_type, 6, "ZF");
+ tdesc_add_flag (field_type, 7, "SF");
+ tdesc_add_flag (field_type, 8, "TF");
+ tdesc_add_flag (field_type, 9, "IF");
+ tdesc_add_flag (field_type, 10, "DF");
+ tdesc_add_flag (field_type, 11, "OF");
+ tdesc_add_flag (field_type, 14, "NT");
+ tdesc_add_flag (field_type, 16, "RF");
+ tdesc_add_flag (field_type, 17, "VM");
+ tdesc_add_flag (field_type, 18, "AC");
+ tdesc_add_flag (field_type, 19, "VIF");
+ tdesc_add_flag (field_type, 20, "VIP");
+ tdesc_add_flag (field_type, 21, "ID");
+
+ tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
+ tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
+ tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
+ tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+ field_type = tdesc_named_type (feature, "ieee_single");
+ tdesc_create_vector (feature, "v4f", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "ieee_double");
+ tdesc_create_vector (feature, "v2d", field_type, 2);
+
+ field_type = tdesc_named_type (feature, "int8");
+ tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+ field_type = tdesc_named_type (feature, "int16");
+ tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+ field_type = tdesc_named_type (feature, "int32");
+ tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "int64");
+ tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+ type = tdesc_create_union (feature, "vec128");
+ field_type = tdesc_named_type (feature, "v4f");
+ tdesc_add_field (type, "v4_float", field_type);
+ field_type = tdesc_named_type (feature, "v2d");
+ tdesc_add_field (type, "v2_double", field_type);
+ field_type = tdesc_named_type (feature, "v16i8");
+ tdesc_add_field (type, "v16_int8", field_type);
+ field_type = tdesc_named_type (feature, "v8i16");
+ tdesc_add_field (type, "v8_int16", field_type);
+ field_type = tdesc_named_type (feature, "v4i32");
+ tdesc_add_field (type, "v4_int32", field_type);
+ field_type = tdesc_named_type (feature, "v2i64");
+ tdesc_add_field (type, "v2_int64", field_type);
+ field_type = tdesc_named_type (feature, "uint128");
+ tdesc_add_field (type, "uint128", field_type);
+
+ field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+ tdesc_add_flag (field_type, 0, "IE");
+ tdesc_add_flag (field_type, 1, "DE");
+ tdesc_add_flag (field_type, 2, "ZE");
+ tdesc_add_flag (field_type, 3, "OE");
+ tdesc_add_flag (field_type, 4, "UE");
+ tdesc_add_flag (field_type, 5, "PE");
+ tdesc_add_flag (field_type, 6, "DAZ");
+ tdesc_add_flag (field_type, 7, "IM");
+ tdesc_add_flag (field_type, 8, "DM");
+ tdesc_add_flag (field_type, 9, "ZM");
+ tdesc_add_flag (field_type, 10, "OM");
+ tdesc_add_flag (field_type, 11, "UM");
+ tdesc_add_flag (field_type, 12, "PM");
+ tdesc_add_flag (field_type, 15, "FZ");
+
+ tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
+ tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+ tdesc_create_reg (feature, "ymm0h", 58, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm1h", 59, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm2h", 60, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm3h", 61, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm4h", 62, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm5h", 63, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm6h", 64, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm7h", 65, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm8h", 66, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm9h", 67, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm10h", 68, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm11h", 69, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm12h", 70, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm13h", 71, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm14h", 72, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm15h", 73, 1, NULL, 128, "uint128");
+
+ tdesc_amd64_avx_linux = result;
+}
--- ./gdb/features/i386/amd64-avx-linux.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/amd64-avx-linux.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 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. -->
+
+<!-- AMD64 with AVX - Includes Linux-only special "register". -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>i386:x86-64</architecture>
+ <osabi>GNU/Linux</osabi>
+ <xi:include href="64bit-core.xml"/>
+ <xi:include href="64bit-sse.xml"/>
+ <xi:include href="64bit-linux.xml"/>
+ <xi:include href="64bit-avx.xml"/>
+</target>
--- ./gdb/features/i386/amd64-avx.c 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/amd64-avx.c 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,166 @@
+/* THIS FILE IS GENERATED. Original: amd64-avx.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_amd64_avx;
+static void
+initialize_tdesc_amd64_avx (void)
+{
+ struct target_desc *result = allocate_target_description ();
+ struct tdesc_feature *feature;
+ struct tdesc_type *field_type, *type;
+
+ set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+ field_type = tdesc_create_flags (feature, "i386_eflags", 4);
+ tdesc_add_flag (field_type, 0, "CF");
+ tdesc_add_flag (field_type, 1, "");
+ tdesc_add_flag (field_type, 2, "PF");
+ tdesc_add_flag (field_type, 4, "AF");
+ tdesc_add_flag (field_type, 6, "ZF");
+ tdesc_add_flag (field_type, 7, "SF");
+ tdesc_add_flag (field_type, 8, "TF");
+ tdesc_add_flag (field_type, 9, "IF");
+ tdesc_add_flag (field_type, 10, "DF");
+ tdesc_add_flag (field_type, 11, "OF");
+ tdesc_add_flag (field_type, 14, "NT");
+ tdesc_add_flag (field_type, 16, "RF");
+ tdesc_add_flag (field_type, 17, "VM");
+ tdesc_add_flag (field_type, 18, "AC");
+ tdesc_add_flag (field_type, 19, "VIF");
+ tdesc_add_flag (field_type, 20, "VIP");
+ tdesc_add_flag (field_type, 21, "ID");
+
+ tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
+ tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
+ tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
+ tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
+ tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+ field_type = tdesc_named_type (feature, "ieee_single");
+ tdesc_create_vector (feature, "v4f", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "ieee_double");
+ tdesc_create_vector (feature, "v2d", field_type, 2);
+
+ field_type = tdesc_named_type (feature, "int8");
+ tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+ field_type = tdesc_named_type (feature, "int16");
+ tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+ field_type = tdesc_named_type (feature, "int32");
+ tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "int64");
+ tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+ type = tdesc_create_union (feature, "vec128");
+ field_type = tdesc_named_type (feature, "v4f");
+ tdesc_add_field (type, "v4_float", field_type);
+ field_type = tdesc_named_type (feature, "v2d");
+ tdesc_add_field (type, "v2_double", field_type);
+ field_type = tdesc_named_type (feature, "v16i8");
+ tdesc_add_field (type, "v16_int8", field_type);
+ field_type = tdesc_named_type (feature, "v8i16");
+ tdesc_add_field (type, "v8_int16", field_type);
+ field_type = tdesc_named_type (feature, "v4i32");
+ tdesc_add_field (type, "v4_int32", field_type);
+ field_type = tdesc_named_type (feature, "v2i64");
+ tdesc_add_field (type, "v2_int64", field_type);
+ field_type = tdesc_named_type (feature, "uint128");
+ tdesc_add_field (type, "uint128", field_type);
+
+ field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+ tdesc_add_flag (field_type, 0, "IE");
+ tdesc_add_flag (field_type, 1, "DE");
+ tdesc_add_flag (field_type, 2, "ZE");
+ tdesc_add_flag (field_type, 3, "OE");
+ tdesc_add_flag (field_type, 4, "UE");
+ tdesc_add_flag (field_type, 5, "PE");
+ tdesc_add_flag (field_type, 6, "DAZ");
+ tdesc_add_flag (field_type, 7, "IM");
+ tdesc_add_flag (field_type, 8, "DM");
+ tdesc_add_flag (field_type, 9, "ZM");
+ tdesc_add_flag (field_type, 10, "OM");
+ tdesc_add_flag (field_type, 11, "UM");
+ tdesc_add_flag (field_type, 12, "PM");
+ tdesc_add_flag (field_type, 15, "FZ");
+
+ tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+ tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
+
+ tdesc_amd64_avx = result;
+}
--- ./gdb/features/i386/amd64-avx.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/amd64-avx.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 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. -->
+
+<!-- AMD64 with AVX -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>i386:x86-64</architecture>
+ <xi:include href="64bit-core.xml"/>
+ <xi:include href="64bit-sse.xml"/>
+ <xi:include href="64bit-avx.xml"/>
+</target>
--- ./gdb/features/i386/i386-avx-linux.c 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/i386-avx-linux.c 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,147 @@
+/* THIS FILE IS GENERATED. Original: i386-avx-linux.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_i386_avx_linux;
+static void
+initialize_tdesc_i386_avx_linux (void)
+{
+ struct target_desc *result = allocate_target_description ();
+ struct tdesc_feature *feature;
+ struct tdesc_type *field_type, *type;
+
+ set_tdesc_architecture (result, bfd_scan_arch ("i386"));
+
+ set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+ field_type = tdesc_create_flags (feature, "i386_eflags", 4);
+ tdesc_add_flag (field_type, 0, "CF");
+ tdesc_add_flag (field_type, 1, "");
+ tdesc_add_flag (field_type, 2, "PF");
+ tdesc_add_flag (field_type, 4, "AF");
+ tdesc_add_flag (field_type, 6, "ZF");
+ tdesc_add_flag (field_type, 7, "SF");
+ tdesc_add_flag (field_type, 8, "TF");
+ tdesc_add_flag (field_type, 9, "IF");
+ tdesc_add_flag (field_type, 10, "DF");
+ tdesc_add_flag (field_type, 11, "OF");
+ tdesc_add_flag (field_type, 14, "NT");
+ tdesc_add_flag (field_type, 16, "RF");
+ tdesc_add_flag (field_type, 17, "VM");
+ tdesc_add_flag (field_type, 18, "AC");
+ tdesc_add_flag (field_type, 19, "VIF");
+ tdesc_add_flag (field_type, 20, "VIP");
+ tdesc_add_flag (field_type, 21, "ID");
+
+ tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
+ tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
+ tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
+ tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+ field_type = tdesc_named_type (feature, "ieee_single");
+ tdesc_create_vector (feature, "v4f", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "ieee_double");
+ tdesc_create_vector (feature, "v2d", field_type, 2);
+
+ field_type = tdesc_named_type (feature, "int8");
+ tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+ field_type = tdesc_named_type (feature, "int16");
+ tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+ field_type = tdesc_named_type (feature, "int32");
+ tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "int64");
+ tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+ type = tdesc_create_union (feature, "vec128");
+ field_type = tdesc_named_type (feature, "v4f");
+ tdesc_add_field (type, "v4_float", field_type);
+ field_type = tdesc_named_type (feature, "v2d");
+ tdesc_add_field (type, "v2_double", field_type);
+ field_type = tdesc_named_type (feature, "v16i8");
+ tdesc_add_field (type, "v16_int8", field_type);
+ field_type = tdesc_named_type (feature, "v8i16");
+ tdesc_add_field (type, "v8_int16", field_type);
+ field_type = tdesc_named_type (feature, "v4i32");
+ tdesc_add_field (type, "v4_int32", field_type);
+ field_type = tdesc_named_type (feature, "v2i64");
+ tdesc_add_field (type, "v2_int64", field_type);
+ field_type = tdesc_named_type (feature, "uint128");
+ tdesc_add_field (type, "uint128", field_type);
+
+ field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+ tdesc_add_flag (field_type, 0, "IE");
+ tdesc_add_flag (field_type, 1, "DE");
+ tdesc_add_flag (field_type, 2, "ZE");
+ tdesc_add_flag (field_type, 3, "OE");
+ tdesc_add_flag (field_type, 4, "UE");
+ tdesc_add_flag (field_type, 5, "PE");
+ tdesc_add_flag (field_type, 6, "DAZ");
+ tdesc_add_flag (field_type, 7, "IM");
+ tdesc_add_flag (field_type, 8, "DM");
+ tdesc_add_flag (field_type, 9, "ZM");
+ tdesc_add_flag (field_type, 10, "OM");
+ tdesc_add_flag (field_type, 11, "UM");
+ tdesc_add_flag (field_type, 12, "PM");
+ tdesc_add_flag (field_type, 15, "FZ");
+
+ tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
+ tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+ tdesc_create_reg (feature, "ymm0h", 42, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm1h", 43, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm2h", 44, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm3h", 45, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm4h", 46, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm5h", 47, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm6h", 48, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm7h", 49, 1, NULL, 128, "uint128");
+
+ tdesc_i386_avx_linux = result;
+}
--- ./gdb/features/i386/i386-avx-linux.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/i386-avx-linux.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 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. -->
+
+<!-- I386 with AVX- Includes Linux-only special "register". -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>i386</architecture>
+ <osabi>GNU/Linux</osabi>
+ <xi:include href="32bit-core.xml"/>
+ <xi:include href="32bit-sse.xml"/>
+ <xi:include href="32bit-linux.xml"/>
+ <xi:include href="32bit-avx.xml"/>
+</target>
--- ./gdb/features/i386/i386-avx.c 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/i386-avx.c 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,142 @@
+/* THIS FILE IS GENERATED. Original: i386-avx.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_i386_avx;
+static void
+initialize_tdesc_i386_avx (void)
+{
+ struct target_desc *result = allocate_target_description ();
+ struct tdesc_feature *feature;
+ struct tdesc_type *field_type, *type;
+
+ set_tdesc_architecture (result, bfd_scan_arch ("i386"));
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+ field_type = tdesc_create_flags (feature, "i386_eflags", 4);
+ tdesc_add_flag (field_type, 0, "CF");
+ tdesc_add_flag (field_type, 1, "");
+ tdesc_add_flag (field_type, 2, "PF");
+ tdesc_add_flag (field_type, 4, "AF");
+ tdesc_add_flag (field_type, 6, "ZF");
+ tdesc_add_flag (field_type, 7, "SF");
+ tdesc_add_flag (field_type, 8, "TF");
+ tdesc_add_flag (field_type, 9, "IF");
+ tdesc_add_flag (field_type, 10, "DF");
+ tdesc_add_flag (field_type, 11, "OF");
+ tdesc_add_flag (field_type, 14, "NT");
+ tdesc_add_flag (field_type, 16, "RF");
+ tdesc_add_flag (field_type, 17, "VM");
+ tdesc_add_flag (field_type, 18, "AC");
+ tdesc_add_flag (field_type, 19, "VIF");
+ tdesc_add_flag (field_type, 20, "VIP");
+ tdesc_add_flag (field_type, 21, "ID");
+
+ tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
+ tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
+ tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
+ tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+ field_type = tdesc_named_type (feature, "ieee_single");
+ tdesc_create_vector (feature, "v4f", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "ieee_double");
+ tdesc_create_vector (feature, "v2d", field_type, 2);
+
+ field_type = tdesc_named_type (feature, "int8");
+ tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+ field_type = tdesc_named_type (feature, "int16");
+ tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+ field_type = tdesc_named_type (feature, "int32");
+ tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "int64");
+ tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+ type = tdesc_create_union (feature, "vec128");
+ field_type = tdesc_named_type (feature, "v4f");
+ tdesc_add_field (type, "v4_float", field_type);
+ field_type = tdesc_named_type (feature, "v2d");
+ tdesc_add_field (type, "v2_double", field_type);
+ field_type = tdesc_named_type (feature, "v16i8");
+ tdesc_add_field (type, "v16_int8", field_type);
+ field_type = tdesc_named_type (feature, "v8i16");
+ tdesc_add_field (type, "v8_int16", field_type);
+ field_type = tdesc_named_type (feature, "v4i32");
+ tdesc_add_field (type, "v4_int32", field_type);
+ field_type = tdesc_named_type (feature, "v2i64");
+ tdesc_add_field (type, "v2_int64", field_type);
+ field_type = tdesc_named_type (feature, "uint128");
+ tdesc_add_field (type, "uint128", field_type);
+
+ field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+ tdesc_add_flag (field_type, 0, "IE");
+ tdesc_add_flag (field_type, 1, "DE");
+ tdesc_add_flag (field_type, 2, "ZE");
+ tdesc_add_flag (field_type, 3, "OE");
+ tdesc_add_flag (field_type, 4, "UE");
+ tdesc_add_flag (field_type, 5, "PE");
+ tdesc_add_flag (field_type, 6, "DAZ");
+ tdesc_add_flag (field_type, 7, "IM");
+ tdesc_add_flag (field_type, 8, "DM");
+ tdesc_add_flag (field_type, 9, "ZM");
+ tdesc_add_flag (field_type, 10, "OM");
+ tdesc_add_flag (field_type, 11, "UM");
+ tdesc_add_flag (field_type, 12, "PM");
+ tdesc_add_flag (field_type, 15, "FZ");
+
+ tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+ tdesc_create_reg (feature, "ymm0h", 41, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm1h", 42, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm2h", 43, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm3h", 44, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm4h", 45, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm5h", 46, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm6h", 47, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm7h", 48, 1, NULL, 128, "uint128");
+
+ tdesc_i386_avx = result;
+}
--- ./gdb/features/i386/i386-avx.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/features/i386/i386-avx.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 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. -->
+
+<!-- I386 with AVX -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>i386</architecture>
+ <xi:include href="32bit-core.xml"/>
+ <xi:include href="32bit-sse.xml"/>
+ <xi:include href="32bit-avx.xml"/>
+</target>
--- ./gdb/gdbserver/ChangeLog.avx 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/gdbserver/ChangeLog.avx 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,84 @@
+2010-03-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Use
+ I386_XSTATE_SSE_SIZE instead of I386_XSTATE_MAX_SIZE. Use
+ I386_XSTATE_SIZE.
+
+2010-03-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Updated.
+ (i387_xsave_to_cache): Likewise.
+ (x86_xcr0): Likewise.
+ * linux-x86-low.c (x86_linux_process_qsupported): Likewise.
+
+2010-03-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (i386-xstate.o): Removed.
+
+ * configure.srv (srv_tgtobj): Remove i386-xstate.o for
+ i[34567]86-*-linux* and x86_64-*-linux*.
+
+ * i387-fp.c (x86_xcr0): Initialized to XSTATE_SSE_MASK.
+ (x86_xcr0_init): Removed.
+
+ * i387-fp.h (x86_xcr0_init): Removed.
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Use
+ XSTATE_MAX_SIZE_N_OF_INT64 and XSTATE_MAX_SIZE. Get xcr0
+ from XSAVE extended state.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (clean): Replace reg-i386-linux-avx.c with
+ reg-i386-avx-linux.c.
+ (reg-x86-64-avx.c): Fixed.
+ (reg-x86-64-avx-linux.c): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * configure.srv (srv_tgtobj): Add xsave-nat.o for
+ i[34567]86-*-linux* and x86_64-*-linux*.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (x86_sse_unit): Renamed to ...
+ (x86_vector_unit): This.
+ (x86_get_sse_unit): Renamed to ...
+ (x86_get_vector_unit): This.
+ (i387_cache_to_fxsave): Updated.
+ * linux-x86-low.c (x86_arch_setup): Likewise.
+
+2010-01-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.h (x86_sse_unit): Renamed to ...
+ (x86_vector_unit): This.
+
+2009-10-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (clean): Also remove reg-i386-avx.c,
+ reg-i386-avx-linux.c, reg-x86-64-avx.c and reg-x86-64-avx-linux.c.
+ (reg-i386-avx.o): New target.
+ (reg-i386-avx.c): Likewise.
+ (reg-i386-avx-linux.o): Likewise.
+ (reg-i386-avx-linux.c): Likewise.
+ (reg-x86-64-avx.o): Likewise.
+ (reg-x86-64-avx.c): Likewise.
+ (reg-x86-64-avx-linux.o): Likewise.
+ (reg-x86-64-avx-linux.c): Likewise.
+
+ * gdbserver/configure.srv (srv_regobj): Add reg-i386-avx-linux.o
+ for i[34567]86-*-linux*. Add reg-x86-64-avx-linux.o and
+ reg-i386-avx-linux.o for x86_64-*-linux*.
+
+ * i387-fp.c (x86_sse_unit): New.
+ (x86_get_sse_unit): Likewise.
+ (i387_cache_to_fxsave): Handle x86_sse_unit. Support fake
+ AVX registers.
+ (i387_fxsave_to_cache): Likewise.
+
+ * i387-fp.h (x86_sse_unit): New.
+ (x86_get_sse_unit): Likewise.
+
+ * linux-x86-low.c (init_registers_i386_avx_linux): New.
+ (init_registers_x86_64_avx_linux): Likewise.
+ (x86_arch_setup): Call x86_get_sse_unit () to handle x86_sse_unit.
--- ./gdb/gdbserver/ChangeLog.xcr 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/gdbserver/ChangeLog.xcr 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,373 @@
+2010-03-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c: Don't include <unistd.h>.
+
+2010-03-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_update_xmltarget): Call ptrace
+ only once.
+
+2010-03-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (use_xml): New.
+ (x86_linux_update_xmltarget): Likewise.
+ (x86_linux_process_qsupported): Use x86_linux_update_xmltarget.
+ (x86_arch_setup): Don't call init_registers_amd64_linux,
+ init_registers_i386_linux. Don't set gdbserver_xmltarget. Use
+ x86_linux_update_xmltarget.
+
+ * server.c (handle_query): Call target_process_qsupported with
+ NULL query first.
+
+2010-03-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Replace
+ uint64_t with unsigned long long.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Check
+ "xmlRegisters=" instead of "xmlRegisters+".
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (target_regsets): Always use EXTENDED_REGS
+ with NT_X86_XSTATE.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (xmltarget_amd64_linux_no_xml): New.
+ (xmltarget_i386_linux_no_xml): Likewise.
+ (x86_linux_process_qsupported): Remove use_xml. Update
+ gdbserver_xmltarget.
+ (x86_arch_setup): Set gdbserver_xmltarget to
+ xmltarget_amd64_linux_no_xml/xmltarget_i386_linux_no_xml.
+
+ * server.c (use_xml): Removed.
+ (get_features_xml): Updated.
+ (handle_query): Don't call target_process_qsupported with NULL.
+
+ * server.h (use_xml): Removed.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c: Include <unistd.h>.
+ (x86_linux_process_qsupported): Use getpid.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Replace
+ unsigned long long with uint64_t.
+
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Set use_xml
+ to 1 if XML is supported.
+
+2010-03-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * server.c (handle_query): Don't check "x86:xstate=".
+
+2010-03-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Check
+ xmlRegisters+ instead of x86=xml.
+
+ * server.c (USE_XML): Default to 0.
+ (use_xml): Initialize to USE_XML.
+
+2010-03-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Replace bit_I386_XSTATE_XXX
+ with I386_XSTATE_XXX.
+ (i387_xsave_to_cache): Likewise.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Check bit_I386_XSTATE_X87.
+ (i387_xsave_to_cache): Likewise.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Optimized.
+
+2010-03-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Handle upper YMM registers.
+ (i387_xsave_to_cache): Likewise.
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Check x86=xml.
+
+2010-02-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Also check x87 registers.
+ (i387_xsave_to_cache): Likewise.
+
+ * linux-x86-low.c: Include <sys/uio.h>.
+ (x86_linux_process_qsupported): Support AVX only if
+ PTRACE_GETREGSET works.
+
+2010-02-13 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Check x86_xcr0 instead of
+ x86_vector_unit.
+ (i387_xsave_to_cache): Likewise.
+ (x86_vector_unit): Removed.
+ (x86_vector_unit_init): Likewise.
+ (x86_xcr0): New.
+ (x86_xcr0_init): Likewise.
+
+ * i387-fp.h (x86_vector_unit): Removed.
+ (x86_vector_unit_init): Likewise.
+ (x86_xcr0): New.
+ (x86_xcr0_init): Likewise.
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Check x86_xcr0
+ instead of x86_vector_unit.
+
+2010-02-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-arm-low.c (target_regsets): Initialize nt_type to 0.
+ * linux-crisv32-low.c (target_regsets): Likewise.
+ * linux-m68k-low.c (target_regsets): Likewise.
+ * linux-mips-low.c (target_regsets): Likewise.
+ * linux-ppc-low.c (target_regsets): Likewise.
+ * linux-s390-low.c (target_regsets): Likewise.
+ * linux-sh-low.c (target_regsets): Likewise.
+ * linux-sparc-low.c (target_regsets): Likewise.
+ * linux-xtensa-low.c (target_regsets): Likewise.
+
+2010-02-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-low.c (regsets_fetch_inferior_registers): Simplify
+ nt_type.
+ (regsets_store_inferior_registers): Likewise.
+
+2010-02-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-low.c: Include <sys/uio.h>.
+ (regsets_fetch_inferior_registers): Support nt_type.
+ (regsets_store_inferior_registers): Likewise.
+
+ * linux-low.h (regset_info): Add nt_type.
+
+ * linux-x86-low.c: Include "elf/common.h". Don't include
+ "../config/i386/nm-linux-xstate.h".
+ (PTRACE_GETREGSET): New.
+ (PTRACE_SETREGSET): Likewise.
+ (target_regsets): Initialize nt_type.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c: Replace PTRACE_GETXSTATEREGS with
+ PTRACE_GETREGSET in comments.
+
+2010-02-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c: Include "../config/i386/nm-linux-xstate.h".
+ (PTRACE_SETXSTATEREGS): Removed.
+ (PTRACE_SETXSTATEREGS): Likewise.
+ (target_regsets): Use PTRACE_GETREGSET/PTRACE_SETREGSET instead
+ of PTRACE_GETXSTATEREGS/PTRACE_SETXSTATEREGS.
+ (x86_linux_process_qsupported): Check PTRACE_GETREGSET instead
+ of PTRACE_GETXSTATEREGS.
+
+2010-02-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (x86_vector_unit_init): Properly check xcr0.
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Set use_xml
+ to 0 and return for NULL query. Set use_xml to 1 if there is
+ "x86:xstate=" in qSupported packet.
+
+ * server.c (get_features_xml): Optimized.
+ (handle_query): Call target_process_qsupported with NULL
+ query first.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Remove unsigned from raw.
+ (i387_xsave_to_cache): Remove unsigned from raw and xmm. Fix
+ a typo.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Set use_xml
+ to 0 if there is no "x86:xstate=" in qSupported packet.
+
+ * server.c (use_xml): New.
+ (get_features_xml): Don't use XML file if use_xml is 0.
+ (handle_query): Always call target_process_qsupported.
+
+ * server.h (use_xml): New.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (clean): Updated.
+ (i386-avx.o): New.
+ (i386-avx.c): Likewise.
+ (i386-avx-linux.o): Likewise.
+ (i386-avx-linux.c): Likewise.
+ (x86-64-avx.o): Likewise.
+ (x86-64-avx.c): Likewise.
+ (x86-64-avx-linux.o): Likewise.
+ (x86-64-avx-linux.c): Likewise.
+
+ * configure.srv (srv_i386_regobj): Add i386-avx.o.
+ (srv_i386_linux_regobj): Add i386-avx-linux.o.
+ (srv_x86_64_regobj): Add x86-64-avx.o.
+ (srv_x86_64_linux_regobj): Add x86-64-avx-linux.o.
+
+2010-02-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ * configure.srv (srv_i386_32bit_xmlfiles): Add
+ i386/32bit-avx.xml.
+ (srv_i386_64bit_xmlfiles): Add i386/64bit-avx.xml.
+ (srv_i386_xmlfiles): Add i386/i386-avx.xml.
+ (srv_x86_64_xmlfiles): Add i386/x86-64-avx.xml.
+ (srv_i386_linux_xmlfiles): Add i386/i386-avx-linux.xml.
+ (srv_x86_64_linux_xmlfiles): Add i386/x86-64-avx-linux.xml.
+
+2010-02-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-low.c (linux_process_qsupported): Make it void.
+ * linux-x86-low.c (x86_linux_process_qsupported): Likewise.
+
+ * linux-low.h (linux_target_ops): Make process_qsupported void.
+
+ * server.c (handle_query): Make target_process_qsupported void.
+
+ * target.h (target_ops): Make process_qsupported void.
+ (target_process_qsupported): Make it void.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Replace xmm[32] with raw[32].
+ (i387_xsave_to_cache): Optimize xstate_bv == 0.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Remove collect_register_part.
+ (i387_xsave_to_cache): Remove supply_register_part.
+
+ * regcache.c (supply_register_part): Removed.
+ (collect_register_part): Likewise.
+ * regcache.h (supply_register_part): Likewise.
+ (collect_register_part): Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (xstate-nat.o): Renamed to ...
+ (i386-xstate.o): This.
+
+ * configure.srv (srv_tgtobj): Add i386-xstate.o instead of
+ xstate-nat.o for i[34567]86-*-linux* and x86_64-*-linux*.
+
+ * i387-fp.c: Include "i386-xstate.h" instead of "xstate-nat.h".
+ * linux-x86-low.c: Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Add another missing break.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Add the missing break.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regcache.c (supply_register_part): Clear regcache if buf is
+ NULL.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_linux_process_qsupported): Always
+ initialize size and xcr0.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (x86_vector_unit_init): Support only what both gdb
+ and host support.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Clear part in vector registers
+ if its bit in xstat_bv is zero. Update xstat_bv if needed.
+ (i387_xsave_to_cache): Clear part in vector registers if its bit
+ in xstat_bv is zero.
+
+ * regcache.c (supply_register): Clear regcache if buf is NULL.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Remove xcr0.
+ (i387_xsave_to_cache): Likewise.
+
+2010-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (x86_vector_unit_init): Updated.
+ * i387-fp.h (x86_vector_unit_init): Likewise.
+
+ * linux-low.c (linux_update_x86_xstate_size): Renamed to ...
+ (linux_process_qsupported): This. Updated.
+ (linux_target_ops): Updated.
+
+ * linux-low.h (linux_target_ops): Replace update_x86_xstate_size
+ with process_qsupported.
+
+ * linux-x86-low.c (x86_linux_update_x86_xstate_size): Renamed
+ to ...
+ (x86_linux_process_qsupported): This. Assemble qSupported ACK.
+
+ * server.c (handle_query): Call target_process_qsupported
+ for unhandled query.
+
+ * target.h (target_ops): Replace update_x86_xstate_size with
+ process_qsupported.
+ (target_update_x86_xstate_size): Removed.
+ (target_process_qsupported): New.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Remove xstate_bv.
+ (i387_xsave_to_cache): Likewise.
+
+2010-02-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (x86_vector_unit_init): Add and check size argument.
+
+ * i387-fp.h (x86_vector_unit): Remove unknown.
+ (x86_vector_unit_init): Add size argument.
+
+ * linux-low.c (linux_update_x86_xstate_size): New.
+ (linux_target_ops): Add linux_update_x86_xstate_size.
+
+ * linux-low.h (linux_target_ops): Add update_x86_xstate_size.
+
+ * linux-x86-low.c (x86_update_xstateregset_size): Renamed to
+ ...
+ (x86_linux_update_x86_xstate_size): This. Updated.
+ (x86_arch_setup): Don't call x86_update_xstateregset_size.
+ (the_low_target): Add x86_linux_update_x86_xstate_size.
+
+ * server.c (handle_query): Handle "x86:xstate:SIZE".
+
+ * target.h (target_ops): Add update_x86_xstate_size.
+ (target_update_x86_xstate_size): New.
+
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Handle xcr0 and xstate_bv
+ only for AVX and above.
+ (i387_xsave_to_cache): Likewise.
+
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_xsave): Add xcr0 and xstate_bv.
+ (i387_cache_to_xsave): Handle xcr0 and xstate_bv.
+ (i387_xsave_to_cache): Likewise.
+
+2010-01-29 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (x86_vector_unit_init): Updated.
+ * linux-x86-low.c (x86_update_xstateregset_size): Likewise.
--- ./gdb/gdbserver/ChangeLog.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/gdbserver/ChangeLog.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,68 @@
+2010-02-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (init_registers_i386_linux): Update comments.
+ (init_registers_amd64_linux): Likewise.
+
+2010-02-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in: Replace x86-64 with amd64.
+
+ * configure.srv: Replace x86-64/x86_64 with amd64.
+
+ * linux-x86-low.c: Replace x86_64 with amd64.
+
+2010-02-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * configure.srv (srv_i386_regobj): New.
+ (srv_i386_linux_regobj): Likewise.
+ (srv_x86_64_regobj): Likewise.
+ (srv_x86_64_linux_regobj): Likewise.
+ (i[34567]86-*-cygwin*): Set srv_regobj to $srv_i386_regobj.
+ (i[34567]86-*-mingw32ce*): Likewise.
+ (i[34567]86-*-mingw*): Likewise.
+ (i[34567]86-*-nto*): Likewise.
+ (i[34567]86-*-linux*): Set srv_regobj to $srv_i386_linux_regobj
+ and $srv_x86_64_linux_regobj.
+ (x86_64-*-linux*): Likewise.
+
+2010-02-04 H.J. Lu <hongjiu.lu@intel.com>
+
+ * configure.srv (srv_i386_32bit_xmlfiles): New.
+ (srv_i386_64bit_xmlfiles): Likewise.
+ (srv_i386_xmlfiles): Likewise.
+ (srv_x86_64_xmlfiles): Likewise.
+ (srv_i386_linux_xmlfiles): Likewise.
+ (srv_x86_64_linux_xmlfiles): Likewise.
+ (i[34567]86-*-cygwin*): Set srv_xmlfiles to $srv_i386_xmlfiles.
+ (i[34567]86-*-mingw32ce*): Likewise.
+ (i[34567]86-*-mingw*): Likewise.
+ (i[34567]86-*-nto*): Likewise.
+ (i[34567]86-*-linux*): Set srv_xmlfiles to
+ $srv_i386_linux_xmlfiles and $srv_x86_64_linux_xmlfiles.
+ (x86_64-*-linux*): Likewise.
+
+2010-02-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (clean): Replace reg-i386.c, reg-x86-64.c,
+ reg-i386-linux.c and reg-x86-64-linux.c with i386.c, x86-64.c,
+ i386-linux.c and x86-64-linux.c.
+ (reg-i386.o): Removed.
+ (reg-i386.c): Likewise.
+ (reg-i386-linux.o): Likewise.
+ (reg-i386-linux.c): Likewise.
+ (reg-x86-64.o): Likewise.
+ (reg-x86-64.c): Likewise.
+ (reg-x86-64-linux.o): Likewise.
+ (reg-x86-64-linux.c): Likewise.
+ (i386.o): New.
+ (i386.c): Likewise.
+ (i386-linux.o): Likewise.
+ (i386-linux.c): Likewise.
+ (x86-64.o): Likewise.
+ (x86-64.c): Likewise.
+ (x86-64-linux.o): Likewise.
+ (x86-64-linux.c): Likewise.
+
+ * configure.srv: Replace reg-i386.o, reg-x86-64.o,
+ reg-i386-linux.o and reg-x86-64-linux.o with i386.o, x86-64.o,
+ i386-linux.o and x86-64-linux.o.
--- ./gdb/gdbserver/ChangeLog.xstate 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/gdbserver/ChangeLog.xstate 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,89 @@
+2010-01-31 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_xsave): Correct layout.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_update_xstateregset_size): Use
+ i386_xstate.size.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_update_xstateregset_size): Call
+ x86_vector_unit_init here. Turn off other FP PTRACE requests
+ only on AVX host.
+ (x86_arch_setup): Don't call x86_vector_unit_init here.
+
+2010-01-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_update_xstateregset_size): Update
+ size for PTRACE_GETXSTATEREGS only if it is supported.
+
+2010-01-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_update_xstateregset_size): Use only
+ PTRACE_GETXSTATEREGS if it is supported.
+
+2010-01-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c (x86_update_xstateregset_size): For AVX,
+ only use PTRACE_GETXSTATEREGS.
+
+2010-01-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i387-fp.c (i387_cache_to_xsave): Find ymm0 for AVX.
+ (i387_xsave_to_cache): Likewise.
+
+2010-01-25 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (xsave-nat.o): Renamed to ...
+ (xstate-nat.o): This.
+
+ * configure.srv (srv_tgtobj): Add xstate-nat.o instead of
+ xsave-nat.o for i[34567]86-*-linux* and x86_64-*-linux*.
+
+ * i387-fp.c: Include "xstate-nat.h" instead of "xsave-nat.h".
+ * linux-x86-low.c: Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * regcache.c (supply_register_part): Change size to unsigned int.
+ (collect_register_part): Likewise.
+ * regcache.h (supply_register_part): Likewise.
+ (collect_register_part): Likewise.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linux-x86-low.c: Include "xsave-nat.h"
+ (PTRACE_GETXSTATEREGS): New.
+ (PTRACE_SETXSTATEREGS): Likewise.
+ (x86_fill_xstateregset): Likewise.
+ (x86_store_xstateregset): Likewise.
+ (x86_update_xstateregset_size): Likewise.
+ (target_regsets): Add PTRACE_GETXSTATEREGS entry.
+ (x86_arch_setup): Call x86_update_xstateregset_size.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * configure.srv (srv_tgtobj): Add xsave-nat.o for
+ i[34567]86-*-linux* and x86_64-*-linux*.
+
+ * i387-fp.c (i387_xsave): New.
+ (i387_cache_to_xsave): Likewise.
+ (i387_xsave_to_cache): Likewise.
+ (x86_vector_unit): Likewise.
+ (x86_vector_unit_init): Likewise.
+ * 387-fp.h (i387_cache_to_xsave): Likewise.
+ (i387_xsave_to_cache): Likewise.
+ (x86_vector_unit): Likewise.
+ (x86_vector_unit_init): Likewise.
+ * regcache.c (supply_register_part): Likewise.
+ (collect_register_part): Likewise.
+ * regcache.h (supply_register_part): Likewise.
+ (collect_register_part): Likewise.
+
+ * linux-x86-low.c (x86_arch_setup): Call x86_vector_unit_init.
+
+2010-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * Makefile.in (xsave-nat.o): New.
--- ./gdb/gdbserver/Makefile.in 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/gdbserver/Makefile.in 2010-04-03 21:12:32.000000000 +0200
@@ -217,6 +217,8 @@ clean:
rm -f powerpc-isa205-vsx64l.c
rm -f s390-linux32.c s390-linux64.c s390x-linux64.c
rm -f xml-builtin.c stamp-xml
+ rm -f i386-avx.c i386-avx-linux.c
+ rm -f amd64-avx.c amd64-avx-linux.c
maintainer-clean realclean distclean: clean
rm -f nm.h tm.h xm.h config.status config.h stamp-h config.log
@@ -351,6 +353,12 @@ i386.c : $(srcdir)/../regformats/i386/i3
i386-linux.o : i386-linux.c $(regdef_h)
i386-linux.c : $(srcdir)/../regformats/i386/i386-linux.dat $(regdat_sh)
$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-linux.dat i386-linux.c
+i386-avx.o : i386-avx.c $(regdef_h)
+i386-avx.c : $(srcdir)/../regformats/i386/i386-avx.dat $(regdat_sh)
+ $(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx.dat i386-avx.c
+i386-avx-linux.o : i386-avx-linux.c $(regdef_h)
+i386-avx-linux.c : $(srcdir)/../regformats/i386/i386-avx-linux.dat $(regdat_sh)
+ $(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-linux.dat i386-avx-linux.c
reg-ia64.o : reg-ia64.c $(regdef_h)
reg-ia64.c : $(srcdir)/../regformats/reg-ia64.dat $(regdat_sh)
$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-ia64.dat reg-ia64.c
@@ -438,6 +446,12 @@ amd64.c : $(srcdir)/../regformats/i386/a
amd64-linux.o : amd64-linux.c $(regdef_h)
amd64-linux.c : $(srcdir)/../regformats/i386/amd64-linux.dat $(regdat_sh)
$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-linux.dat amd64-linux.c
+amd64-avx.o : amd64-avx.c $(regdef_h)
+amd64-avx.c : $(srcdir)/../regformats/i386/amd64-avx.dat $(regdat_sh)
+ $(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx.dat amd64-avx.c
+amd64-avx-linux.o : amd64-avx-linux.c $(regdef_h)
+amd64-avx-linux.c : $(srcdir)/../regformats/i386/amd64-avx-linux.dat $(regdat_sh)
+ $(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-linux.dat amd64-avx-linux.c
reg-xtensa.o : reg-xtensa.c $(regdef_h)
reg-xtensa.c : $(srcdir)/../regformats/reg-xtensa.dat $(regdat_sh)
$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-xtensa.dat reg-xtensa.c
--- ./gdb/gdbserver/configure.srv 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/gdbserver/configure.srv 2010-04-03 21:12:32.000000000 +0200
@@ -22,17 +22,17 @@
# Default hostio_last_error implementation
srv_hostio_err_objs="hostio-errno.o"
-srv_i386_regobj=i386.o
-srv_i386_linux_regobj=i386-linux.o
-srv_amd64_regobj=amd64.o
-srv_amd64_linux_regobj=amd64-linux.o
+srv_i386_regobj="i386.o i386-avx.o"
+srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o"
+srv_amd64_regobj="amd64.o x86-64-avx.o"
+srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o"
-srv_i386_32bit_xmlfiles="i386/32bit-core.xml i386/32bit-sse.xml"
-srv_i386_64bit_xmlfiles="i386/64bit-core.xml i386/64bit-sse.xml"
-srv_i386_xmlfiles="i386/i386.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_xmlfiles="i386/amd64.xml $srv_i386_64bit_xmlfiles"
-srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/32bit-linux.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/64bit-linux.xml $srv_i386_64bit_xmlfiles"
+srv_i386_32bit_xmlfiles="i386/32bit-core.xml i386/32bit-sse.xml i386/32bit-avx.xml"
+srv_i386_64bit_xmlfiles="i386/64bit-core.xml i386/64bit-sse.xml i386/64bit-avx.xml"
+srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml $srv_i386_32bit_xmlfiles"
+srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml $srv_i386_64bit_xmlfiles"
+srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/i386-avx-linux.xml i386/32bit-linux.xml $srv_i386_32bit_xmlfiles"
+srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/64bit-linux.xml $srv_i386_64bit_xmlfiles"
# Input is taken from the "${target}" variable.
--- ./gdb/gdbserver/i387-fp.c 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/i387-fp.c 2010-04-03 21:12:32.000000000 +0200
@@ -19,6 +19,7 @@
#include "server.h"
#include "i387-fp.h"
+#include "i386-xstate.h"
int num_xmm_registers = 8;
@@ -72,6 +73,46 @@ struct i387_fxsave {
unsigned char xmm_space[256];
};
+struct i387_xsave {
+ /* All these are only sixteen bits, plus padding, except for fop (which
+ is only eleven bits), and fooff / fioff (which are 32 bits each). */
+ unsigned short fctrl;
+ unsigned short fstat;
+ unsigned short ftag;
+ unsigned short fop;
+ unsigned int fioff;
+ unsigned short fiseg;
+ unsigned short pad1;
+ unsigned int fooff;
+ unsigned short foseg;
+ unsigned short pad12;
+
+ unsigned int mxcsr;
+ unsigned int mxcsr_mask;
+
+ /* Space for eight 80-bit FP values in 128-bit spaces. */
+ unsigned char st_space[128];
+
+ /* Space for eight 128-bit XMM values, or 16 on x86-64. */
+ unsigned char xmm_space[256];
+
+ unsigned char reserved1[48];
+
+ /* The extended control register 0 (the XFEATURE_ENABLED_MASK
+ register). */
+ unsigned long long xcr0;
+
+ unsigned char reserved2[40];
+
+ /* The XSTATE_BV bit vector. */
+ unsigned long long xstate_bv;
+
+ unsigned char reserved3[56];
+
+ /* Space for eight upper 128-bit YMM values, or 16 on x86-64. */
+ unsigned char ymmh_space[256];
+};
+
void
i387_cache_to_fsave (struct regcache *regcache, void *buf)
{
@@ -199,6 +240,128 @@ i387_cache_to_fxsave (struct regcache *r
fp->foseg = val;
}
+void
+i387_cache_to_xsave (struct regcache *regcache, void *buf)
+{
+ struct i387_xsave *fp = (struct i387_xsave *) buf;
+ int i;
+ unsigned long val, val2;
+ unsigned int clear_bv;
+ unsigned long long xstate_bv = 0;
+ char raw[16];
+ char *p;
+
+ /* The supported bits in `xstat_bv' are 1 byte. Clear part in
+ vector registers if its bit in xstat_bv is zero. */
+ clear_bv = (~fp->xstate_bv) & x86_xcr0;
+
+ /* Clear part in x87 and vector registers if its bit in xstat_bv is
+ zero. */
+ if (clear_bv)
+ {
+ if ((clear_bv & I386_XSTATE_X87))
+ for (i = 0; i < 8; i++)
+ memset (((char *) &fp->st_space[0]) + i * 16, 0, 10);
+
+ if ((clear_bv & I386_XSTATE_SSE))
+ for (i = 0; i < num_xmm_registers; i++)
+ memset (((char *) &fp->xmm_space[0]) + i * 16, 0, 16);
+
+ if ((clear_bv & I386_XSTATE_AVX))
+ for (i = 0; i < num_xmm_registers; i++)
+ memset (((char *) &fp->ymmh_space[0]) + i * 16, 0, 16);
+ }
+
+ /* Check if any x87 registers are changed. */
+ if ((x86_xcr0 & I386_XSTATE_X87))
+ {
+ int st0_regnum = find_regno ("st0");
+
+ for (i = 0; i < 8; i++)
+ {
+ collect_register (regcache, i + st0_regnum, raw);
+ p = ((char *) &fp->st_space[0]) + i * 16;
+ if (memcmp (raw, p, 10))
+ {
+ xstate_bv |= I386_XSTATE_X87;
+ memcpy (p, raw, 10);
+ }
+ }
+ }
+
+ /* Check if any SSE registers are changed. */
+ if ((x86_xcr0 & I386_XSTATE_SSE))
+ {
+ int xmm0_regnum = find_regno ("xmm0");
+
+ for (i = 0; i < num_xmm_registers; i++)
+ {
+ collect_register (regcache, i + xmm0_regnum, raw);
+ p = ((char *) &fp->xmm_space[0]) + i * 16;
+ if (memcmp (raw, p, 16))
+ {
+ xstate_bv |= I386_XSTATE_SSE;
+ memcpy (p, raw, 16);
+ }
+ }
+ }
+
+ /* Check if any AVX registers are changed. */
+ if ((x86_xcr0 & I386_XSTATE_AVX))
+ {
+ int ymm0h_regnum = find_regno ("ymm0h");
+
+ for (i = 0; i < num_xmm_registers; i++)
+ {
+ collect_register (regcache, i + ymm0h_regnum, raw);
+ p = ((char *) &fp->ymmh_space[0]) + i * 16;
+ if (memcmp (raw, p, 16))
+ {
+ xstate_bv |= I386_XSTATE_AVX;
+ memcpy (p, raw, 16);
+ }
+ }
+ }
+
+ /* Update the corresponding bits in xstate_bv if any SSE/AVX
+ registers are changed. */
+ fp->xstate_bv |= xstate_bv;
+
+ collect_register_by_name (regcache, "fioff", &fp->fioff);
+ collect_register_by_name (regcache, "fooff", &fp->fooff);
+ collect_register_by_name (regcache, "mxcsr", &fp->mxcsr);
+
+ /* This one's 11 bits... */
+ collect_register_by_name (regcache, "fop", &val2);
+ fp->fop = (val2 & 0x7FF) | (fp->fop & 0xF800);
+
+ /* Some registers are 16-bit. */
+ collect_register_by_name (regcache, "fctrl", &val);
+ fp->fctrl = val;
+
+ collect_register_by_name (regcache, "fstat", &val);
+ fp->fstat = val;
+
+ /* Convert to the simplifed tag form stored in fxsave data. */
+ collect_register_by_name (regcache, "ftag", &val);
+ val &= 0xFFFF;
+ val2 = 0;
+ for (i = 7; i >= 0; i--)
+ {
+ int tag = (val >> (i * 2)) & 3;
+
+ if (tag != 3)
+ val2 |= (1 << i);
+ }
+ fp->ftag = val2;
+
+ collect_register_by_name (regcache, "fiseg", &val);
+ fp->fiseg = val;
+
+ collect_register_by_name (regcache, "foseg", &val);
+ fp->foseg = val;
+}
+
static int
i387_ftag (struct i387_fxsave *fp, int regno)
{
@@ -296,3 +459,107 @@ i387_fxsave_to_cache (struct regcache *r
val = (fp->fop) & 0x7FF;
supply_register_by_name (regcache, "fop", &val);
}
+
+void
+i387_xsave_to_cache (struct regcache *regcache, const void *buf)
+{
+ struct i387_xsave *fp = (struct i387_xsave *) buf;
+ struct i387_fxsave *fxp = (struct i387_fxsave *) buf;
+ int i, top;
+ unsigned long val;
+ unsigned int clear_bv;
+ char *p;
+
+ /* The supported bits in `xstat_bv' are 1 byte. Clear part in
+ vector registers if its bit in xstat_bv is zero. */
+ clear_bv = (~fp->xstate_bv) & x86_xcr0;
+
+ /* Check if any x87 registers are changed. */
+ if ((x86_xcr0 & I386_XSTATE_X87))
+ {
+ int st0_regnum = find_regno ("st0");
+
+ if ((clear_bv & I386_XSTATE_X87))
+ p = NULL;
+ else
+ p = (char *) buf;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (p)
+ p = ((char *) &fp->st_space[0]) + i * 16;
+ supply_register (regcache, i + st0_regnum, p);
+ }
+ }
+
+ if ((x86_xcr0 & I386_XSTATE_SSE))
+ {
+ int xmm0_regnum = find_regno ("xmm0");
+
+ if ((clear_bv & I386_XSTATE_SSE))
+ p = NULL;
+ else
+ p = (char *) buf;
+
+ for (i = 0; i < num_xmm_registers; i++)
+ {
+ if (p)
+ p = ((char *) &fp->xmm_space[0]) + i * 16;
+ supply_register (regcache, i + xmm0_regnum, p);
+ }
+ }
+
+ if ((x86_xcr0 & I386_XSTATE_AVX))
+ {
+ int ymm0h_regnum = find_regno ("ymm0h");
+
+ if ((clear_bv & I386_XSTATE_AVX))
+ p = NULL;
+ else
+ p = (char *) buf;
+
+ for (i = 0; i < num_xmm_registers; i++)
+ {
+ if (p)
+ p = ((char *) &fp->ymmh_space[0]) + i * 16;
+ supply_register (regcache, i + ymm0h_regnum, p);
+ }
+ }
+
+ supply_register_by_name (regcache, "fioff", &fp->fioff);
+ supply_register_by_name (regcache, "fooff", &fp->fooff);
+ supply_register_by_name (regcache, "mxcsr", &fp->mxcsr);
+
+ /* Some registers are 16-bit. */
+ val = fp->fctrl & 0xFFFF;
+ supply_register_by_name (regcache, "fctrl", &val);
+
+ val = fp->fstat & 0xFFFF;
+ supply_register_by_name (regcache, "fstat", &val);
+
+ /* Generate the form of ftag data that GDB expects. */
+ top = (fp->fstat >> 11) & 0x7;
+ val = 0;
+ for (i = 7; i >= 0; i--)
+ {
+ int tag;
+ if (fp->ftag & (1 << i))
+ tag = i387_ftag (fxp, (i + 8 - top) % 8);
+ else
+ tag = 3;
+ val |= tag << (2 * i);
+ }
+ supply_register_by_name (regcache, "ftag", &val);
+
+ val = fp->fiseg & 0xFFFF;
+ supply_register_by_name (regcache, "fiseg", &val);
+
+ val = fp->foseg & 0xFFFF;
+ supply_register_by_name (regcache, "foseg", &val);
+
+ val = (fp->fop) & 0x7FF;
+ supply_register_by_name (regcache, "fop", &val);
+}
+
+/* Default to SSE. */
+unsigned long long x86_xcr0 = I386_XSTATE_SSE_MASK;
--- ./gdb/gdbserver/i387-fp.h 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/i387-fp.h 2010-04-03 21:12:32.000000000 +0200
@@ -26,6 +26,11 @@ void i387_fsave_to_cache (struct regcach
void i387_cache_to_fxsave (struct regcache *regcache, void *buf);
void i387_fxsave_to_cache (struct regcache *regcache, const void *buf);
+void i387_cache_to_xsave (struct regcache *regcache, void *buf);
+void i387_xsave_to_cache (struct regcache *regcache, const void *buf);
+
+extern unsigned long long x86_xcr0;
+
extern int num_xmm_registers;
#endif /* I387_FP_H */
--- ./gdb/gdbserver/linux-arm-low.c 2010-02-01 17:13:16.000000000 +0100
+++ ./gdb/gdbserver/linux-arm-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -354,16 +354,16 @@ arm_arch_setup (void)
}
struct regset_info target_regsets[] = {
- { PTRACE_GETREGS, PTRACE_SETREGS, 18 * 4,
+ { PTRACE_GETREGS, PTRACE_SETREGS, 0, 18 * 4,
GENERAL_REGS,
arm_fill_gregset, arm_store_gregset },
- { PTRACE_GETWMMXREGS, PTRACE_SETWMMXREGS, 16 * 8 + 6 * 4,
+ { PTRACE_GETWMMXREGS, PTRACE_SETWMMXREGS, 0, 16 * 8 + 6 * 4,
EXTENDED_REGS,
arm_fill_wmmxregset, arm_store_wmmxregset },
- { PTRACE_GETVFPREGS, PTRACE_SETVFPREGS, 32 * 8 + 4,
+ { PTRACE_GETVFPREGS, PTRACE_SETVFPREGS, 0, 32 * 8 + 4,
EXTENDED_REGS,
arm_fill_vfpregset, arm_store_vfpregset },
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
struct linux_target_ops the_low_target = {
--- ./gdb/gdbserver/linux-crisv32-low.c 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/linux-crisv32-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -365,9 +365,9 @@ cris_store_gregset (const void *buf)
typedef unsigned long elf_gregset_t[cris_num_regs];
struct regset_info target_regsets[] = {
- { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
+ { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t),
GENERAL_REGS, cris_fill_gregset, cris_store_gregset },
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
struct linux_target_ops the_low_target = {
--- ./gdb/gdbserver/linux-low.c 2010-03-06 01:12:57.000000000 +0100
+++ ./gdb/gdbserver/linux-low.c 2010-04-03 21:19:14.000000000 +0200
@@ -39,6 +39,7 @@
#include <dirent.h>
#include <sys/stat.h>
#include <sys/vfs.h>
+#include <sys/uio.h>
#ifndef ELFMAG0
/* Don't include <linux/elf.h> here. If it got included by gdb_proc_service.h
then ELFMAG0 will have been defined. If it didn't get included by
@@ -2281,14 +2282,15 @@ regsets_fetch_inferior_registers (struct
struct regset_info *regset;
int saw_general_regs = 0;
int pid;
+ struct iovec iov;
regset = target_regsets;
pid = lwpid_of (get_thread_lwp (current_inferior));
while (regset->size >= 0)
{
- void *buf;
- int res;
+ void *buf, *data;
+ int nt_type, res;
if (regset->size == 0 || disabled_regsets[regset - target_regsets])
{
@@ -2297,10 +2299,21 @@ regsets_fetch_inferior_registers (struct
}
buf = xmalloc (regset->size);
+
+ nt_type = regset->nt_type;
+ if (nt_type)
+ {
+ iov.iov_base = buf;
+ iov.iov_len = regset->size;
+ data = (void *) &iov;
+ }
+ else
+ data = buf;
+
#ifndef __sparc__
- res = ptrace (regset->get_request, pid, 0, buf);
+ res = ptrace (regset->get_request, pid, nt_type, data);
#else
- res = ptrace (regset->get_request, pid, buf, 0);
+ res = ptrace (regset->get_request, pid, data, nt_type);
#endif
if (res < 0)
{
@@ -2338,14 +2351,15 @@ regsets_store_inferior_registers (struct
struct regset_info *regset;
int saw_general_regs = 0;
int pid;
+ struct iovec iov;
regset = target_regsets;
pid = lwpid_of (get_thread_lwp (current_inferior));
while (regset->size >= 0)
{
- void *buf;
- int res;
+ void *buf, *data;
+ int nt_type, res;
if (regset->size == 0 || disabled_regsets[regset - target_regsets])
{
@@ -2358,10 +2372,21 @@ regsets_store_inferior_registers (struct
/* First fill the buffer with the current register set contents,
in case there are any items in the kernel's regset that are
not in gdbserver's regcache. */
+
+ nt_type = regset->nt_type;
+ if (nt_type)
+ {
+ iov.iov_base = buf;
+ iov.iov_len = regset->size;
+ data = (void *) &iov;
+ }
+ else
+ data = buf;
+
#ifndef __sparc__
- res = ptrace (regset->get_request, pid, 0, buf);
+ res = ptrace (regset->get_request, pid, nt_type, data);
#else
- res = ptrace (regset->get_request, pid, buf, 0);
+ res = ptrace (regset->get_request, pid, &iov, data);
#endif
if (res == 0)
@@ -2371,9 +2396,9 @@ regsets_store_inferior_registers (struct
/* Only now do we write the register set. */
#ifndef __sparc__
- res = ptrace (regset->set_request, pid, 0, buf);
+ res = ptrace (regset->set_request, pid, nt_type, data);
#else
- res = ptrace (regset->set_request, pid, buf, 0);
+ res = ptrace (regset->set_request, pid, data, nt_type);
#endif
}
@@ -3434,6 +3459,13 @@ linux_core_of_thread (ptid_t ptid)
return core;
}
+static void
+linux_process_qsupported (const char *query)
+{
+ if (the_low_target.process_qsupported != NULL)
+ the_low_target.process_qsupported (query);
+}
+
static struct target_ops linux_target_ops = {
linux_create_inferior,
linux_attach,
@@ -3477,7 +3509,8 @@ static struct target_ops linux_target_op
#else
NULL,
#endif
- linux_core_of_thread
+ linux_core_of_thread,
+ linux_process_qsupported
};
static void
--- ./gdb/gdbserver/linux-low.h 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/linux-low.h 2010-04-03 21:12:32.000000000 +0200
@@ -35,6 +35,9 @@ enum regset_type {
struct regset_info
{
int get_request, set_request;
+ /* If NT_TYPE isn't 0, it will be passed to ptrace as the 3rd
+ argument and the 4th argument should be "const struct iovec *". */
+ int nt_type;
int size;
enum regset_type type;
regset_fill_func fill_function;
@@ -111,6 +114,9 @@ struct linux_target_ops
/* Hook to call prior to resuming a thread. */
void (*prepare_to_resume) (struct lwp_info *);
+
+ /* Hook to support target specific qSupported. */
+ void (*process_qsupported) (const char *);
};
extern struct linux_target_ops the_low_target;
--- ./gdb/gdbserver/linux-m68k-low.c 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/linux-m68k-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -112,14 +112,14 @@ m68k_store_fpregset (struct regcache *re
struct regset_info target_regsets[] = {
#ifdef HAVE_PTRACE_GETREGS
- { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
+ { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t),
GENERAL_REGS,
m68k_fill_gregset, m68k_store_gregset },
- { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
+ { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, sizeof (elf_fpregset_t),
FP_REGS,
m68k_fill_fpregset, m68k_store_fpregset },
#endif /* HAVE_PTRACE_GETREGS */
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
static const unsigned char m68k_breakpoint[] = { 0x4E, 0x4F };
--- ./gdb/gdbserver/linux-mips-low.c 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/linux-mips-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -343,12 +343,12 @@ mips_store_fpregset (struct regcache *re
struct regset_info target_regsets[] = {
#ifdef HAVE_PTRACE_GETREGS
- { PTRACE_GETREGS, PTRACE_SETREGS, 38 * 8, GENERAL_REGS,
+ { PTRACE_GETREGS, PTRACE_SETREGS, 0, 38 * 8, GENERAL_REGS,
mips_fill_gregset, mips_store_gregset },
- { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 33 * 8, FP_REGS,
+ { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, 33 * 8, FP_REGS,
mips_fill_fpregset, mips_store_fpregset },
#endif /* HAVE_PTRACE_GETREGS */
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
struct linux_target_ops the_low_target = {
--- ./gdb/gdbserver/linux-ppc-low.c 2010-01-21 23:10:18.000000000 +0100
+++ ./gdb/gdbserver/linux-ppc-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -593,14 +593,14 @@ struct regset_info target_regsets[] = {
fetch them every time, but still fall back to PTRACE_PEEKUSER for the
general registers. Some kernels support these, but not the newer
PPC_PTRACE_GETREGS. */
- { PTRACE_GETVSXREGS, PTRACE_SETVSXREGS, SIZEOF_VSXREGS, EXTENDED_REGS,
+ { PTRACE_GETVSXREGS, PTRACE_SETVSXREGS, 0, SIZEOF_VSXREGS, EXTENDED_REGS,
ppc_fill_vsxregset, ppc_store_vsxregset },
{ PTRACE_GETVRREGS, PTRACE_SETVRREGS, SIZEOF_VRREGS, EXTENDED_REGS,
ppc_fill_vrregset, ppc_store_vrregset },
- { PTRACE_GETEVRREGS, PTRACE_SETEVRREGS, 32 * 4 + 8 + 4, EXTENDED_REGS,
+ { PTRACE_GETEVRREGS, PTRACE_SETEVRREGS, 0, 32 * 4 + 8 + 4, EXTENDED_REGS,
ppc_fill_evrregset, ppc_store_evrregset },
- { 0, 0, 0, GENERAL_REGS, ppc_fill_gregset, NULL },
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, 0, GENERAL_REGS, ppc_fill_gregset, NULL },
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
struct linux_target_ops the_low_target = {
--- ./gdb/gdbserver/linux-s390-low.c 2010-01-21 20:26:49.000000000 +0100
+++ ./gdb/gdbserver/linux-s390-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -181,8 +181,8 @@ static void s390_fill_gregset (struct re
}
struct regset_info target_regsets[] = {
- { 0, 0, 0, GENERAL_REGS, s390_fill_gregset, NULL },
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, 0, GENERAL_REGS, s390_fill_gregset, NULL },
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
--- ./gdb/gdbserver/linux-sh-low.c 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/linux-sh-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -104,8 +104,8 @@ static void sh_fill_gregset (struct regc
}
struct regset_info target_regsets[] = {
- { 0, 0, 0, GENERAL_REGS, sh_fill_gregset, NULL },
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, 0, GENERAL_REGS, sh_fill_gregset, NULL },
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
struct linux_target_ops the_low_target = {
--- ./gdb/gdbserver/linux-sparc-low.c 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/linux-sparc-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -260,13 +260,13 @@ sparc_reinsert_addr (void)
struct regset_info target_regsets[] = {
- { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
+ { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t),
GENERAL_REGS,
sparc_fill_gregset, sparc_store_gregset },
- { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (fpregset_t),
+ { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, sizeof (fpregset_t),
FP_REGS,
sparc_fill_fpregset, sparc_store_fpregset },
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
struct linux_target_ops the_low_target = {
--- ./gdb/gdbserver/linux-x86-low.c 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/gdbserver/linux-x86-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -24,6 +24,8 @@
#include "linux-low.h"
#include "i387-fp.h"
#include "i386-low.h"
+#include "i386-xstate.h"
+#include "elf/common.h"
#include "gdb_proc_service.h"
@@ -31,10 +33,35 @@
void init_registers_i386_linux (void);
/* Defined in auto-generated file amd64-linux.c. */
void init_registers_amd64_linux (void);
+/* Defined in auto-generated file i386-avx-linux.c. */
+void init_registers_i386_avx_linux (void);
+/* Defined in auto-generated file amd64-avx-linux.c. */
+void init_registers_amd64_avx_linux (void);
+
+/* Backward compatibility for gdb without XML support. */
+
+static const char *xmltarget_i386_linux_no_xml = "@<target>\
+<architecture>i386</architecture>\
+<osabi>GNU/Linux</osabi>\
+</target>";
+static const char *xmltarget_amd64_linux_no_xml = "@<target>\
+<architecture>i386:x86-64</architecture>\
+<osabi>GNU/Linux</osabi>\
+</target>";
#include <sys/reg.h>
#include <sys/procfs.h>
#include <sys/ptrace.h>
+#include <sys/uio.h>
+
+#ifndef PTRACE_GETREGSET
+#define PTRACE_GETREGSET 0x4204
+#endif
+
+#ifndef PTRACE_SETREGSET
+#define PTRACE_SETREGSET 0x4205
+#endif
+
#ifndef PTRACE_GET_THREAD_AREA
#define PTRACE_GET_THREAD_AREA 25
@@ -252,6 +279,18 @@ x86_store_fpxregset (struct regcache *re
#endif
+static void
+x86_fill_xstateregset (struct regcache *regcache, void *buf)
+{
+ i387_cache_to_xsave (regcache, buf);
+}
+
+static void
+x86_store_xstateregset (struct regcache *regcache, const void *buf)
+{
+ i387_xsave_to_cache (regcache, buf);
+}
+
/* ??? The non-biarch i386 case stores all the i387 regs twice.
Once in i387_.*fsave.* and once in i387_.*fxsave.*.
This is, presumably, to handle the case where PTRACE_[GS]ETFPXREGS
@@ -264,21 +303,23 @@ x86_store_fpxregset (struct regcache *re
struct regset_info target_regsets[] =
{
#ifdef HAVE_PTRACE_GETREGS
- { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
+ { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t),
GENERAL_REGS,
x86_fill_gregset, x86_store_gregset },
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_X86_XSTATE, 0,
+ EXTENDED_REGS, x86_fill_xstateregset, x86_store_xstateregset },
# ifndef __x86_64__
# ifdef HAVE_PTRACE_GETFPXREGS
- { PTRACE_GETFPXREGS, PTRACE_SETFPXREGS, sizeof (elf_fpxregset_t),
+ { PTRACE_GETFPXREGS, PTRACE_SETFPXREGS, 0, sizeof (elf_fpxregset_t),
EXTENDED_REGS,
x86_fill_fpxregset, x86_store_fpxregset },
# endif
# endif
- { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
+ { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, sizeof (elf_fpregset_t),
FP_REGS,
x86_fill_fpregset, x86_store_fpregset },
#endif /* HAVE_PTRACE_GETREGS */
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
static CORE_ADDR
@@ -772,6 +813,121 @@ x86_siginfo_fixup (struct siginfo *nativ
return 0;
}
+static int use_xml;
+
+/* Update gdbserver_xmltarget. */
+
+static void
+x86_linux_update_xmltarget (void)
+{
+ static unsigned long long xcr0;
+ static int have_ptrace_getregset = -1;
+
+ if (!current_inferior)
+ return;
+
+#ifdef __x86_64__
+ if (num_xmm_registers == 8)
+ init_registers_i386_linux ();
+ else
+ init_registers_amd64_linux ();
+#else
+ init_registers_i386_linux ();
+#endif
+
+ if (!use_xml)
+ {
+ /* Don't use XML. */
+#ifdef __x86_64__
+ if (num_xmm_registers == 8)
+ gdbserver_xmltarget = xmltarget_i386_linux_no_xml;
+ else
+ gdbserver_xmltarget = xmltarget_amd64_linux_no_xml;
+#else
+ gdbserver_xmltarget = xmltarget_i386_linux_no_xml;
+#endif
+
+ x86_xcr0 = I386_XSTATE_SSE_MASK;
+
+ return;
+ }
+
+ /* Update gdbserver_xmltarget with XML support. */
+#ifdef __x86_64__
+ if (num_xmm_registers == 8)
+ gdbserver_xmltarget = "i386-linux.xml";
+ else
+ gdbserver_xmltarget = "amd64-linux.xml";
+#else
+ gdbserver_xmltarget = "i386-linux.xml";
+#endif
+
+ /* Check if XSAVE extended state is supported. */
+ if (have_ptrace_getregset == -1)
+ {
+ int pid = pid_of (get_thread_lwp (current_inferior));
+ unsigned long long xstateregs[I386_XSTATE_SSE_SIZE / sizeof (long long)];
+ struct iovec iov;
+ struct regset_info *regset;
+
+ iov.iov_base = xstateregs;
+ iov.iov_len = sizeof (xstateregs);
+
+ /* Check if PTRACE_GETREGSET works. */
+ if (ptrace (PTRACE_GETREGSET, pid, (unsigned int) NT_X86_XSTATE,
+ &iov) < 0)
+ {
+ have_ptrace_getregset = 0;
+ return;
+ }
+ else
+ have_ptrace_getregset = 1;
+
+ /* Get XCR0 from XSAVE extended state at byte 464. */
+ xcr0 = xstateregs[464 / sizeof (long long)];
+
+ /* Use PTRACE_GETREGSET if it is available. */
+ for (regset = target_regsets;
+ regset->fill_function != NULL; regset++)
+ if (regset->get_request == PTRACE_GETREGSET)
+ regset->size = I386_XSTATE_SIZE (xcr0);
+ else if (regset->type != GENERAL_REGS)
+ regset->size = 0;
+ }
+
+ if (have_ptrace_getregset)
+ {
+ /* AVX is the highest feature we support. */
+ if ((xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK)
+ {
+ x86_xcr0 = xcr0;
+
+#ifdef __x86_64__
+ /* I386 has 8 xmm regs. */
+ if (num_xmm_registers == 8)
+ init_registers_i386_avx_linux ();
+ else
+ init_registers_amd64_avx_linux ();
+#else
+ init_registers_i386_avx_linux ();
+#endif
+ }
+ }
+}
+
+/* Process qSupported query, "xmlRegisters=". Update the buffer size for
+ PTRACE_GETREGSET. */
+
+static void
+x86_linux_process_qsupported (const char *query)
+{
+ /* Return if gdb doesn't support XML. If gdb sends "xmlRegisters="
+ in qSupported query, it supports x86 XML target descriptions. */
+ use_xml = query != NULL && strncmp (query, "xmlRegisters=", 13) == 0;
+
+ x86_linux_update_xmltarget ();
+}
+
/* Initialize gdbserver for the architecture of the inferior. */
static void
@@ -792,8 +948,6 @@ x86_arch_setup (void)
}
else if (use_64bit)
{
- init_registers_amd64_linux ();
-
/* Amd64 doesn't have HAVE_LINUX_USRREGS. */
the_low_target.num_regs = -1;
the_low_target.regmap = NULL;
@@ -803,14 +957,13 @@ x86_arch_setup (void)
/* Amd64 has 16 xmm regs. */
num_xmm_registers = 16;
+ x86_linux_update_xmltarget ();
return;
}
#endif
/* Ok we have a 32-bit inferior. */
- init_registers_i386_linux ();
-
the_low_target.num_regs = I386_NUM_REGS;
the_low_target.regmap = i386_regmap;
the_low_target.cannot_fetch_register = i386_cannot_fetch_register;
@@ -818,6 +971,8 @@ x86_arch_setup (void)
/* I386 has 8 xmm regs. */
num_xmm_registers = 8;
+
+ x86_linux_update_xmltarget ();
}
/* This is initialized assuming an amd64 target.
@@ -850,5 +1005,6 @@ struct linux_target_ops the_low_target =
x86_siginfo_fixup,
x86_linux_new_process,
x86_linux_new_thread,
- x86_linux_prepare_to_resume
+ x86_linux_prepare_to_resume,
+ x86_linux_process_qsupported
};
--- ./gdb/gdbserver/linux-xtensa-low.c 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/linux-xtensa-low.c 2010-04-03 21:12:32.000000000 +0200
@@ -131,13 +131,13 @@ xtensa_store_xtregset (struct regcache *
}
struct regset_info target_regsets[] = {
- { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
+ { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t),
GENERAL_REGS,
xtensa_fill_gregset, xtensa_store_gregset },
- { PTRACE_GETXTREGS, PTRACE_SETXTREGS, XTENSA_ELF_XTREG_SIZE,
+ { PTRACE_GETXTREGS, PTRACE_SETXTREGS, 0, XTENSA_ELF_XTREG_SIZE,
EXTENDED_REGS,
xtensa_fill_xtregset, xtensa_store_xtregset },
- { 0, 0, -1, -1, NULL, NULL }
+ { 0, 0, 0, -1, -1, NULL, NULL }
};
#if XCHAL_HAVE_BE
--- ./gdb/gdbserver/server.c 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/server.c 2010-04-03 21:12:32.000000000 +0200
@@ -1236,6 +1236,9 @@ handle_query (char *own_buf, int packet_
{
char *p = &own_buf[10];
+ /* Start processing qSupported packet. */
+ target_process_qsupported (NULL);
+
/* Process each feature being provided by GDB. The first
feature will follow a ':', and latter features will follow
';'. */
@@ -1251,6 +1254,8 @@ handle_query (char *own_buf, int packet_
if (target_supports_multi_process ())
multi_process = 1;
}
+ else
+ target_process_qsupported (p);
}
sprintf (own_buf, "PacketSize=%x;QPassSignals+", PBUFSIZ - 1);
--- ./gdb/gdbserver/target.h 2010-01-20 23:55:38.000000000 +0100
+++ ./gdb/gdbserver/target.h 2010-04-03 21:12:32.000000000 +0200
@@ -286,6 +286,9 @@ struct target_ops
/* Returns the core given a thread, or -1 if not known. */
int (*core_of_thread) (ptid_t);
+
+ /* Target specific qSupported support. */
+ void (*process_qsupported) (const char *);
};
extern struct target_ops *the_target;
@@ -326,6 +329,10 @@ void set_target_ops (struct target_ops *
(the_target->supports_multi_process ? \
(*the_target->supports_multi_process) () : 0)
+#define target_process_qsupported(query) \
+ if (the_target->process_qsupported) \
+ the_target->process_qsupported (query)
+
/* Start non-stop mode, returns 0 on success, -1 on failure. */
int start_non_stop (int nonstop);
--- ./gdb/i386-linux-nat.c 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/i386-linux-nat.c 2010-04-03 21:12:32.000000000 +0200
@@ -23,11 +23,14 @@
#include "inferior.h"
#include "gdbcore.h"
#include "regcache.h"
+#include "regset.h"
#include "target.h"
#include "linux-nat.h"
#include "gdb_assert.h"
#include "gdb_string.h"
+#include "elf/common.h"
+#include <sys/uio.h>
#include <sys/ptrace.h>
#include <sys/user.h>
#include <sys/procfs.h>
@@ -69,6 +72,19 @@
/* Defines ps_err_e, struct ps_prochandle. */
#include "gdb_proc_service.h"
+
+#include "i386-xstate.h"
+
+#ifndef PTRACE_GETREGSET
+#define PTRACE_GETREGSET 0x4204
+#endif
+
+#ifndef PTRACE_SETREGSET
+#define PTRACE_SETREGSET 0x4205
+#endif
+
+/* Does the current host support PTRACE_GETREGSET? */
+static int have_ptrace_getregset = -1;
/* The register sets used in GNU/Linux ELF core-dumps are identical to
@@ -98,6 +114,8 @@ static int regmap[] =
-1, -1, -1, -1, /* xmm0, xmm1, xmm2, xmm3 */
-1, -1, -1, -1, /* xmm4, xmm5, xmm6, xmm6 */
-1, /* mxcsr */
+ -1, -1, -1, -1, /* ymm0h, ymm1h, ymm2h, ymm3h */
+ -1, -1, -1, -1, /* ymm4h, ymm5h, ymm6h, ymm6h */
ORIG_EAX
};
@@ -110,6 +128,9 @@ static int regmap[] =
#define GETFPXREGS_SUPPLIES(regno) \
(I386_ST0_REGNUM <= (regno) && (regno) < I386_SSE_NUM_REGS)
+#define GETXSTATEREGS_SUPPLIES(regno) \
+ (I386_ST0_REGNUM <= (regno) && (regno) < I386_AVX_NUM_REGS)
+
/* Does the current host support the GETREGS request? */
int have_ptrace_getregs =
#ifdef HAVE_PTRACE_GETREGS
@@ -355,6 +376,57 @@ static void store_fpregs (const struct r
/* Transfering floating-point and SSE registers to and from GDB. */
+/* Fetch all registers covered by the PTRACE_GETREGSET request from
+ process/thread TID and store their values in GDB's register array.
+ Return non-zero if successful, zero otherwise. */
+
+static int
+fetch_xstateregs (struct regcache *regcache, int tid)
+{
+ char xstateregs[I386_XSTATE_MAX_SIZE];
+ struct iovec iov;
+
+ if (!have_ptrace_getregset)
+ return 0;
+
+ iov.iov_base = xstateregs;
+ iov.iov_len = sizeof(xstateregs);
+ if (ptrace (PTRACE_GETREGSET, tid, (unsigned int) NT_X86_XSTATE,
+ &iov) < 0)
+ perror_with_name (_("Couldn't read extended state status"));
+
+ i387_supply_xsave (regcache, -1, xstateregs);
+ return 1;
+}
+
+/* Store all valid registers in GDB's register array covered by the
+ PTRACE_SETREGSET request into the process/thread specified by TID.
+ Return non-zero if successful, zero otherwise. */
+
+static int
+store_xstateregs (const struct regcache *regcache, int tid, int regno)
+{
+ char xstateregs[I386_XSTATE_MAX_SIZE];
+ struct iovec iov;
+
+ if (!have_ptrace_getregset)
+ return 0;
+
+ iov.iov_base = xstateregs;
+ iov.iov_len = sizeof(xstateregs);
+ if (ptrace (PTRACE_GETREGSET, tid, (unsigned int) NT_X86_XSTATE,
+ &iov) < 0)
+ perror_with_name (_("Couldn't read extended state status"));
+
+ i387_collect_xsave (regcache, regno, xstateregs, 0);
+
+ if (ptrace (PTRACE_SETREGSET, tid, (unsigned int) NT_X86_XSTATE,
+ (int) &iov) < 0)
+ perror_with_name (_("Couldn't write extended state status"));
+
+ return 1;
+}
+
#ifdef HAVE_PTRACE_GETFPXREGS
/* Fill GDB's register array with the floating-point and SSE register
@@ -489,6 +561,8 @@ i386_linux_fetch_inferior_registers (str
return;
}
+ if (fetch_xstateregs (regcache, tid))
+ return;
if (fetch_fpxregs (regcache, tid))
return;
fetch_fpregs (regcache, tid);
@@ -501,6 +575,12 @@ i386_linux_fetch_inferior_registers (str
return;
}
+ if (GETXSTATEREGS_SUPPLIES (regno))
+ {
+ if (fetch_xstateregs (regcache, tid))
+ return;
+ }
+
if (GETFPXREGS_SUPPLIES (regno))
{
if (fetch_fpxregs (regcache, tid))
@@ -553,6 +633,8 @@ i386_linux_store_inferior_registers (str
if (regno == -1)
{
store_regs (regcache, tid, regno);
+ if (store_xstateregs (regcache, tid, regno))
+ return;
if (store_fpxregs (regcache, tid, regno))
return;
store_fpregs (regcache, tid, regno);
@@ -565,6 +647,12 @@ i386_linux_store_inferior_registers (str
return;
}
+ if (GETXSTATEREGS_SUPPLIES (regno))
+ {
+ if (store_xstateregs (regcache, tid, regno))
+ return;
+ }
+
if (GETFPXREGS_SUPPLIES (regno))
{
if (store_fpxregs (regcache, tid, regno))
@@ -873,7 +961,50 @@ i386_linux_child_post_startup_inferior (
static const struct target_desc *
i386_linux_read_description (struct target_ops *ops)
{
- return tdesc_i386_linux;
+ static uint64_t xcr0;
+
+ if (have_ptrace_getregset == -1)
+ {
+ int tid;
+ uint64_t xstateregs[(I386_XSTATE_SSE_SIZE / sizeof (uint64_t))];
+ struct iovec iov;
+ unsigned int xstate_size;
+
+ /* GNU/Linux LWP ID's are process ID's. */
+ tid = TIDGET (inferior_ptid);
+ if (tid == 0)
+ tid = PIDGET (inferior_ptid); /* Not a threaded program. */
+
+ iov.iov_base = xstateregs;
+ iov.iov_len = sizeof (xstateregs);
+
+ /* Check if PTRACE_GETREGSET works. */
+ if (ptrace (PTRACE_GETREGSET, tid, (unsigned int) NT_X86_XSTATE,
+ &iov) < 0)
+ {
+ have_ptrace_getregset = 0;
+ xstate_size = 0;
+ }
+ else
+ {
+ have_ptrace_getregset = 1;
+
+ /* Get XCR0 from XSAVE extended state. */
+ xcr0 = xstateregs[(I386_LINUX_XSAVE_XCR0_OFFSET
+ / sizeof (long long))];
+
+ xstate_size = I386_XSTATE_SIZE (xcr0);
+ }
+
+ i386_linux_update_xstateregset (xstate_size);
+ }
+
+ /* Check the native XCR0 only if PTRACE_GETREGSET is available. */
+ if (have_ptrace_getregset
+ && (xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK)
+ return tdesc_i386_avx_linux;
+ else
+ return tdesc_i386_linux;
}
void
--- ./gdb/i386-linux-tdep.c 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/i386-linux-tdep.c 2010-04-03 21:12:32.000000000 +0200
@@ -23,6 +23,7 @@
#include "frame.h"
#include "value.h"
#include "regcache.h"
+#include "regset.h"
#include "inferior.h"
#include "osabi.h"
#include "reggroups.h"
@@ -36,9 +37,11 @@
#include "solib-svr4.h"
#include "symtab.h"
#include "arch-utils.h"
-#include "regset.h"
#include "xml-syscall.h"
+#include "i387-tdep.h"
+#include "i386-xstate.h"
+
/* The syscall's XML filename for i386. */
#define XML_SYSCALL_FILENAME_I386 "syscalls/i386-linux.xml"
@@ -47,6 +50,7 @@
#include <stdint.h>
#include "features/i386/i386-linux.c"
+#include "features/i386/i386-avx-linux.c"
/* Supported register note sections. */
static struct core_regset_section i386_linux_regset_sections[] =
@@ -54,6 +58,7 @@ static struct core_regset_section i386_l
{ ".reg", 144, "general-purpose" },
{ ".reg2", 108, "floating-point" },
{ ".reg-xfp", 512, "extended floating-point" },
+ { ".reg-xstate", 0, "XSAVE extended state" },
{ NULL, 0 }
};
@@ -533,6 +538,7 @@ static int i386_linux_gregset_reg_offset
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
11 * 4 /* "orig_eax" */
};
@@ -560,6 +566,59 @@ static int i386_linux_sc_reg_offset[] =
0 * 4 /* %gs */
};
+/* Update XSAVE extended state register note section. */
+
+void
+i386_linux_update_xstateregset (unsigned int xstate_size)
+{
+ struct core_regset_section *xstate = &i386_linux_regset_sections[3];
+
+ /* Update the XSAVE extended state register note section for "gcore".
+ Disable it if its size is 0. */
+ gdb_assert (strcmp (xstate->sect_name, ".reg-xstate") == 0);
+ if (xstate_size)
+ xstate->size = xstate_size;
+ else
+ xstate->sect_name = NULL;
+}
+
+/* Get XSAVE extended state xcr0 from core dump. */
+
+uint64_t
+i386_linux_core_read_xcr0 (struct gdbarch *gdbarch,
+ struct target_ops *target, bfd *abfd)
+{
+ asection *xstate = bfd_get_section_by_name (abfd, ".reg-xstate");
+ uint64_t xcr0;
+
+ if (xstate)
+ {
+ size_t size = bfd_section_size (abfd, xstate);
+
+ /* Check extended state size. */
+ if (size < I386_XSTATE_AVX_SIZE)
+ xcr0 = I386_XSTATE_SSE_MASK;
+ else
+ {
+ char contents[8];
+
+ if (! bfd_get_section_contents (abfd, xstate, contents,
+ I386_LINUX_XSAVE_XCR0_OFFSET,
+ 8))
+ {
+ warning (_("Couldn't read `xcr0' bytes from `.reg-xstate' section in core file."));
+ return 0;
+ }
+
+ xcr0 = bfd_get_64 (abfd, contents);
+ }
+ }
+ else
+ xcr0 = I386_XSTATE_SSE_MASK;
+
+ return xcr0;
+}
+
/* Get Linux/x86 target description from core dump. */
static const struct target_desc *
@@ -568,12 +627,17 @@ i386_linux_core_read_description (struct
bfd *abfd)
{
asection *section = bfd_get_section_by_name (abfd, ".reg2");
+ uint64_t xcr0;
if (section == NULL)
return NULL;
/* Linux/i386. */
- return tdesc_i386_linux;
+ xcr0 = i386_linux_core_read_xcr0 (gdbarch, target, abfd);
+ if ((xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK)
+ return tdesc_i386_avx_linux;
+ else
+ return tdesc_i386_linux;
}
static void
@@ -623,6 +687,8 @@ i386_linux_init_abi (struct gdbarch_info
tdep->sc_reg_offset = i386_linux_sc_reg_offset;
tdep->sc_num_regs = ARRAY_SIZE (i386_linux_sc_reg_offset);
+ tdep->xsave_xcr0_offset = I386_LINUX_XSAVE_XCR0_OFFSET;
+
set_gdbarch_process_record (gdbarch, i386_process_record);
set_gdbarch_process_record_signal (gdbarch, i386_linux_record_signal);
@@ -843,4 +909,5 @@ _initialize_i386_linux_tdep (void)
/* Initialize the Linux target description */
initialize_tdesc_i386_linux ();
+ initialize_tdesc_i386_avx_linux ();
}
--- ./gdb/i386-linux-tdep.h 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/i386-linux-tdep.h 2010-04-03 21:12:32.000000000 +0200
@@ -30,12 +30,41 @@
/* Register number for the "orig_eax" pseudo-register. If this
pseudo-register contains a value >= 0 it is interpreted as the
system call number that the kernel is supposed to restart. */
-#define I386_LINUX_ORIG_EAX_REGNUM I386_SSE_NUM_REGS
+#define I386_LINUX_ORIG_EAX_REGNUM I386_AVX_NUM_REGS
/* Total number of registers for GNU/Linux. */
#define I386_LINUX_NUM_REGS (I386_LINUX_ORIG_EAX_REGNUM + 1)
+/* Get XSAVE extended state xcr0 from core dump. */
+extern uint64_t i386_linux_core_read_xcr0
+ (struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd);
+
/* Linux target description. */
extern struct target_desc *tdesc_i386_linux;
+extern struct target_desc *tdesc_i386_avx_linux;
+
+/* Update XSAVE extended state register note section. */
+extern void i386_linux_update_xstateregset (unsigned int xstate_size);
+
+/* Format of XSAVE extended state is:
+ struct
+ {
+ fxsave_bytes[0..463]
+ sw_usable_bytes[464..511]
+ xstate_hdr_bytes[512..575]
+ avx_bytes[576..831]
+ future_state etc
+ };
+
+ Same memory layout will be used for the coredump NT_X86_XSTATE
+ representing the XSAVE extended state registers.
+
+ The first 8 bytes of the sw_usable_bytes[464..467] is the OS enabled
+ extended state mask, which is the same as the extended control register
+ 0 (the XFEATURE_ENABLED_MASK register), XCR0. We can use this mask
+ together with the mask saved in the xstate_hdr_bytes to determine what
+ states the processor/OS supports and what state, used or initialized,
+ the process/thread is in. */
+#define I386_LINUX_XSAVE_XCR0_OFFSET 464
#endif /* i386-linux-tdep.h */
--- ./gdb/i386-tdep.c 2010-04-03 21:09:29.000000000 +0200
+++ ./gdb/i386-tdep.c 2010-04-03 21:12:32.000000000 +0200
@@ -51,11 +51,13 @@
#include "i386-tdep.h"
#include "i387-tdep.h"
+#include "i386-xstate.h"
#include "record.h"
#include <stdint.h>
#include "features/i386/i386.c"
+#include "features/i386/i386-avx.c"
/* Register names. */
@@ -74,6 +76,18 @@ static const char *i386_register_names[]
"mxcsr"
};
+static const char *i386_ymm_names[] =
+{
+ "ymm0", "ymm1", "ymm2", "ymm3",
+ "ymm4", "ymm5", "ymm6", "ymm7",
+};
+
+static const char *i386_ymmh_names[] =
+{
+ "ymm0h", "ymm1h", "ymm2h", "ymm3h",
+ "ymm4h", "ymm5h", "ymm6h", "ymm7h",
+};
+
/* Register names for MMX pseudo-registers. */
static const char *i386_mmx_names[] =
@@ -150,18 +164,47 @@ i386_dword_regnum_p (struct gdbarch *gdb
return regnum >= 0 && regnum < tdep->num_dword_regs;
}
+int
+i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ int ymm0h_regnum = tdep->ymm0h_regnum;
+
+ if (ymm0h_regnum < 0)
+ return 0;
+
+ regnum -= ymm0h_regnum;
+ return regnum >= 0 && regnum < tdep->num_ymm_regs;
+}
+
+/* AVX register? */
+
+int
+i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ int ymm0_regnum = tdep->ymm0_regnum;
+
+ if (ymm0_regnum < 0)
+ return 0;
+
+ regnum -= ymm0_regnum;
+ return regnum >= 0 && regnum < tdep->num_ymm_regs;
+}
+
/* SSE register? */
-static int
-i386_sse_regnum_p (struct gdbarch *gdbarch, int regnum)
+int
+i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ int num_xmm_regs = I387_NUM_XMM_REGS (tdep);
- if (I387_NUM_XMM_REGS (tdep) == 0)
+ if (num_xmm_regs == 0)
return 0;
- return (I387_XMM0_REGNUM (tdep) <= regnum
- && regnum < I387_MXCSR_REGNUM (tdep));
+ regnum -= I387_XMM0_REGNUM (tdep);
+ return regnum >= 0 && regnum < num_xmm_regs;
}
static int
@@ -201,6 +244,19 @@ i386_fpc_regnum_p (struct gdbarch *gdbar
&& regnum < I387_XMM0_REGNUM (tdep));
}
+/* Return the name of register REGNUM, or the empty string if it is
+ an anonymous register. */
+
+static const char *
+i386_register_name (struct gdbarch *gdbarch, int regnum)
+{
+ /* Hide the upper YMM registers. */
+ if (i386_ymmh_regnum_p (gdbarch, regnum))
+ return "";
+
+ return tdesc_register_name (gdbarch, regnum);
+}
+
/* Return the name of register REGNUM. */
const char *
@@ -209,6 +265,8 @@ i386_pseudo_register_name (struct gdbarc
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
if (i386_mmx_regnum_p (gdbarch, regnum))
return i386_mmx_names[regnum - I387_MM0_REGNUM (tdep)];
+ else if (i386_ymm_regnum_p (gdbarch, regnum))
+ return i386_ymm_names[regnum - tdep->ymm0_regnum];
else if (i386_byte_regnum_p (gdbarch, regnum))
return i386_byte_names[regnum - tdep->al_regnum];
else if (i386_word_regnum_p (gdbarch, regnum))
@@ -246,7 +304,13 @@ i386_dbx_reg_to_regnum (struct gdbarch *
else if (reg >= 21 && reg <= 28)
{
/* SSE registers. */
- return reg - 21 + I387_XMM0_REGNUM (tdep);
+ int ymm0_regnum = tdep->ymm0_regnum;
+
+ if (ymm0_regnum >= 0
+ && i386_xmm_regnum_p (gdbarch, reg))
+ return reg - 21 + ymm0_regnum;
+ else
+ return reg - 21 + I387_XMM0_REGNUM (tdep);
}
else if (reg >= 29 && reg <= 36)
{
@@ -2184,6 +2248,59 @@ i387_ext_type (struct gdbarch *gdbarch)
return tdep->i387_ext_type;
}
+/* Construct vector type for pseudo YMM registers. We can't use
+ tdesc_find_type since YMM isn't described in target description. */
+
+static struct type *
+i386_ymm_type (struct gdbarch *gdbarch)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+ if (!tdep->i386_ymm_type)
+ {
+ const struct builtin_type *bt = builtin_type (gdbarch);
+
+ /* The type we're building is this: */
+#if 0
+ union __gdb_builtin_type_vec256i
+ {
+ int128_t uint128[2];
+ int64_t v2_int64[4];
+ int32_t v4_int32[8];
+ int16_t v8_int16[16];
+ int8_t v16_int8[32];
+ double v2_double[4];
+ float v4_float[8];
+ };
+#endif
+
+ struct type *t;
+
+ t = arch_composite_type (gdbarch,
+ "__gdb_builtin_type_vec256i", TYPE_CODE_UNION);
+ append_composite_type_field (t, "v8_float",
+ init_vector_type (bt->builtin_float, 8));
+ append_composite_type_field (t, "v4_double",
+ init_vector_type (bt->builtin_double, 4));
+ append_composite_type_field (t, "v32_int8",
+ init_vector_type (bt->builtin_int8, 32));
+ append_composite_type_field (t, "v16_int16",
+ init_vector_type (bt->builtin_int16, 16));
+ append_composite_type_field (t, "v8_int32",
+ init_vector_type (bt->builtin_int32, 8));
+ append_composite_type_field (t, "v4_int64",
+ init_vector_type (bt->builtin_int64, 4));
+ append_composite_type_field (t, "v2_int128",
+ init_vector_type (bt->builtin_int128, 2));
+
+ TYPE_VECTOR (t) = 1;
+ TYPE_NAME (t) = "builtin_type_vec128i";
+ tdep->i386_ymm_type = t;
+ }
+
+ return tdep->i386_ymm_type;
+}
+
/* Construct vector type for MMX registers. */
static struct type *
i386_mmx_type (struct gdbarch *gdbarch)
@@ -2234,6 +2351,8 @@ i386_pseudo_register_type (struct gdbarc
{
if (i386_mmx_regnum_p (gdbarch, regnum))
return i386_mmx_type (gdbarch);
+ else if (i386_ymm_regnum_p (gdbarch, regnum))
+ return i386_ymm_type (gdbarch);
else
{
const struct builtin_type *bt = builtin_type (gdbarch);
@@ -2285,7 +2404,22 @@ i386_pseudo_register_read (struct gdbarc
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
- if (i386_word_regnum_p (gdbarch, regnum))
+ if (i386_ymm_regnum_p (gdbarch, regnum))
+ {
+ regnum -= tdep->ymm0_regnum;
+
+ /* Extract (always little endian). Read lower 128bits. */
+ regcache_raw_read (regcache,
+ I387_XMM0_REGNUM (tdep) + regnum,
+ raw_buf);
+ memcpy (buf, raw_buf, 16);
+ /* Read upper 128bits. */
+ regcache_raw_read (regcache,
+ tdep->ymm0h_regnum + regnum,
+ raw_buf);
+ memcpy (buf + 16, raw_buf, 16);
+ }
+ else if (i386_word_regnum_p (gdbarch, regnum))
{
int gpnum = regnum - tdep->ax_regnum;
@@ -2334,7 +2468,20 @@ i386_pseudo_register_write (struct gdbar
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
- if (i386_word_regnum_p (gdbarch, regnum))
+ if (i386_ymm_regnum_p (gdbarch, regnum))
+ {
+ regnum -= tdep->ymm0_regnum;
+
+ /* ... Write lower 128bits. */
+ regcache_raw_write (regcache,
+ I387_XMM0_REGNUM (tdep) + regnum,
+ buf);
+ /* ... Write upper 128bits. */
+ regcache_raw_write (regcache,
+ tdep->ymm0h_regnum + regnum,
+ buf + 16);
+ }
+ else if (i386_word_regnum_p (gdbarch, regnum))
{
int gpnum = regnum - tdep->ax_regnum;
@@ -2581,6 +2728,28 @@ i386_collect_fpregset (const struct regs
i387_collect_fsave (regcache, regnum, fpregs);
}
+/* Similar to i386_supply_fpregset, but use XSAVE extended state. */
+
+static void
+i386_supply_xstateregset (const struct regset *regset,
+ struct regcache *regcache, int regnum,
+ const void *xstateregs, size_t len)
+{
+ const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
+ i387_supply_xsave (regcache, regnum, xstateregs);
+}
+
+/* Similar to i386_collect_fpregset , but use XSAVE extended state. */
+
+static void
+i386_collect_xstateregset (const struct regset *regset,
+ const struct regcache *regcache,
+ int regnum, void *xstateregs, size_t len)
+{
+ const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
+ i387_collect_xsave (regcache, regnum, xstateregs, 1);
+}
+
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
@@ -2608,6 +2777,16 @@ i386_regset_from_core_section (struct gd
return tdep->fpregset;
}
+ if (strcmp (sect_name, ".reg-xstate") == 0)
+ {
+ if (tdep->xstateregset == NULL)
+ tdep->xstateregset = regset_alloc (gdbarch,
+ i386_supply_xstateregset,
+ i386_collect_xstateregset);
+
+ return tdep->xstateregset;
+ }
+
return NULL;
}
@@ -2801,46 +2980,60 @@ int
i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
struct reggroup *group)
{
- int sse_regnum_p, fp_regnum_p, mmx_regnum_p, byte_regnum_p,
- word_regnum_p, dword_regnum_p;
+ const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ int fp_regnum_p, mmx_regnum_p, xmm_regnum_p, mxcsr_regnum_p,
+ ymm_regnum_p, ymmh_regnum_p;
/* Don't include pseudo registers, except for MMX, in any register
groups. */
- byte_regnum_p = i386_byte_regnum_p (gdbarch, regnum);
- if (byte_regnum_p)
+ if (i386_byte_regnum_p (gdbarch, regnum))
return 0;
- word_regnum_p = i386_word_regnum_p (gdbarch, regnum);
- if (word_regnum_p)
+ if (i386_word_regnum_p (gdbarch, regnum))
return 0;
- dword_regnum_p = i386_dword_regnum_p (gdbarch, regnum);
- if (dword_regnum_p)
+ if (i386_dword_regnum_p (gdbarch, regnum))
return 0;
mmx_regnum_p = i386_mmx_regnum_p (gdbarch, regnum);
if (group == i386_mmx_reggroup)
return mmx_regnum_p;
- sse_regnum_p = (i386_sse_regnum_p (gdbarch, regnum)
- || i386_mxcsr_regnum_p (gdbarch, regnum));
+ xmm_regnum_p = i386_xmm_regnum_p (gdbarch, regnum);
+ mxcsr_regnum_p = i386_mxcsr_regnum_p (gdbarch, regnum);
if (group == i386_sse_reggroup)
- return sse_regnum_p;
+ return xmm_regnum_p || mxcsr_regnum_p;
+
+ ymm_regnum_p = i386_ymm_regnum_p (gdbarch, regnum);
if (group == vector_reggroup)
- return mmx_regnum_p || sse_regnum_p;
+ return (mmx_regnum_p
+ || ymm_regnum_p
+ || mxcsr_regnum_p
+ || (xmm_regnum_p
+ && ((tdep->xcr0 & I386_XSTATE_AVX_MASK)
+ == I386_XSTATE_SSE_MASK)));
fp_regnum_p = (i386_fp_regnum_p (gdbarch, regnum)
|| i386_fpc_regnum_p (gdbarch, regnum));
if (group == float_reggroup)
return fp_regnum_p;
+ /* For "info reg all", don't include upper YMM registers nor XMM
+ registers when AVX is supported. */
+ ymmh_regnum_p = i386_ymmh_regnum_p (gdbarch, regnum);
+ if (group == all_reggroup
+ && ((xmm_regnum_p
+ && (tdep->xcr0 & I386_XSTATE_AVX))
+ || ymmh_regnum_p))
+ return 0;
+
if (group == general_reggroup)
return (!fp_regnum_p
&& !mmx_regnum_p
- && !sse_regnum_p
- && !byte_regnum_p
- && !word_regnum_p
- && !dword_regnum_p);
+ && !mxcsr_regnum_p
+ && !xmm_regnum_p
+ && !ymm_regnum_p
+ && !ymmh_regnum_p);
return default_register_reggroup_p (gdbarch, regnum, group);
}
@@ -5650,7 +5843,8 @@ i386_validate_tdesc_p (struct gdbarch_td
struct tdesc_arch_data *tdesc_data)
{
const struct target_desc *tdesc = tdep->tdesc;
- const struct tdesc_feature *feature_core, *feature_vector;
+ const struct tdesc_feature *feature_core;
+ const struct tdesc_feature *feature_sse, *feature_avx;
int i, num_regs, valid_p;
if (! tdesc_has_registers (tdesc))
@@ -5660,13 +5854,37 @@ i386_validate_tdesc_p (struct gdbarch_td
feature_core = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.core");
/* Get SSE registers. */
- feature_vector = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.sse");
+ feature_sse = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.sse");
- if (feature_core == NULL || feature_vector == NULL)
+ if (feature_core == NULL || feature_sse == NULL)
return 0;
+ /* Try AVX registers. */
+ feature_avx = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx");
+
valid_p = 1;
+ /* The XCR0 bits. */
+ if (feature_avx)
+ {
+ tdep->xcr0 = I386_XSTATE_AVX_MASK;
+
+ /* It may have been set by OSABI initialization function. */
+ if (tdep->num_ymm_regs == 0)
+ {
+ tdep->ymmh_register_names = i386_ymmh_names;
+ tdep->num_ymm_regs = 8;
+ tdep->ymm0h_regnum = I386_YMM0H_REGNUM;
+ }
+
+ for (i = 0; i < tdep->num_ymm_regs; i++)
+ valid_p &= tdesc_numbered_register (feature_avx, tdesc_data,
+ tdep->ymm0h_regnum + i,
+ tdep->ymmh_register_names[i]);
+ }
+ else
+ tdep->xcr0 = I386_XSTATE_SSE_MASK;
+
num_regs = tdep->num_core_regs;
for (i = 0; i < num_regs; i++)
valid_p &= tdesc_numbered_register (feature_core, tdesc_data, i,
@@ -5675,7 +5893,7 @@ i386_validate_tdesc_p (struct gdbarch_td
/* Need to include %mxcsr, so add one. */
num_regs += tdep->num_xmm_regs + 1;
for (; i < num_regs; i++)
- valid_p &= tdesc_numbered_register (feature_vector, tdesc_data, i,
+ valid_p &= tdesc_numbered_register (feature_sse, tdesc_data, i,
tdep->register_names[i]);
return valid_p;
@@ -5690,6 +5908,7 @@ i386_gdbarch_init (struct gdbarch_info i
struct tdesc_arch_data *tdesc_data;
const struct target_desc *tdesc;
int mm0_regnum;
+ int ymm0_regnum;
/* If there is already a candidate, use it. */
arches = gdbarch_list_lookup_by_info (arches, &info);
@@ -5710,6 +5929,8 @@ i386_gdbarch_init (struct gdbarch_info i
tdep->fpregset = NULL;
tdep->sizeof_fpregset = I387_SIZEOF_FSAVE;
+ tdep->xstateregset = NULL;
+
/* The default settings include the FPU registers, the MMX registers
and the SSE registers. This can be overridden for a specific ABI
by adjusting the members `st0_regnum', `mm0_regnum' and
@@ -5742,6 +5963,8 @@ i386_gdbarch_init (struct gdbarch_info i
/* Unwinding stops on i386 automatically. */
tdep->outermost_frame_p = NULL;
+ tdep->xsave_xcr0_offset = -1;
+
tdep->record_regmap = i386_record_regmap;
/* The format used for `long double' on almost all i386 targets is
@@ -5858,9 +6081,14 @@ i386_gdbarch_init (struct gdbarch_info i
set_tdesc_pseudo_register_type (gdbarch, i386_pseudo_register_type);
set_tdesc_pseudo_register_name (gdbarch, i386_pseudo_register_name);
- /* The default ABI includes general-purpose registers,
- floating-point registers, and the SSE registers. */
- set_gdbarch_num_regs (gdbarch, I386_SSE_NUM_REGS);
+ /* Override the normal target description method to make the AVX
+ upper halves anonymous. */
+ set_gdbarch_register_name (gdbarch, i386_register_name);
+
+ /* Even though the default ABI only includes general-purpose registers,
+ floating-point registers and the SSE registers, we have to leave a
+ gap for the upper AVX registers. */
+ set_gdbarch_num_regs (gdbarch, I386_AVX_NUM_REGS);
/* Get the x86 target description from INFO. */
tdesc = info.target_desc;
@@ -5871,10 +6099,15 @@ i386_gdbarch_init (struct gdbarch_info i
tdep->num_core_regs = I386_NUM_GREGS + I387_NUM_REGS;
tdep->register_names = i386_register_names;
+ /* No upper YMM registers. */
+ tdep->ymmh_register_names = NULL;
+ tdep->ymm0h_regnum = -1;
+
tdep->num_byte_regs = 8;
tdep->num_word_regs = 8;
tdep->num_dword_regs = 0;
tdep->num_mmx_regs = 8;
+ tdep->num_ymm_regs = 0;
tdesc_data = tdesc_data_alloc ();
@@ -5882,24 +6115,25 @@ i386_gdbarch_init (struct gdbarch_info i
info.tdep_info = (void *) tdesc_data;
gdbarch_init_osabi (info, gdbarch);
+ if (!i386_validate_tdesc_p (tdep, tdesc_data))
+ {
+ tdesc_data_cleanup (tdesc_data);
+ xfree (tdep);
+ gdbarch_free (gdbarch);
+ return NULL;
+ }
+
/* Wire in pseudo registers. Number of pseudo registers may be
changed. */
set_gdbarch_num_pseudo_regs (gdbarch, (tdep->num_byte_regs
+ tdep->num_word_regs
+ tdep->num_dword_regs
- + tdep->num_mmx_regs));
+ + tdep->num_mmx_regs
+ + tdep->num_ymm_regs));
/* Target description may be changed. */
tdesc = tdep->tdesc;
- if (!i386_validate_tdesc_p (tdep, tdesc_data))
- {
- tdesc_data_cleanup (tdesc_data);
- xfree (tdep);
- gdbarch_free (gdbarch);
- return NULL;
- }
-
tdesc_use_registers (gdbarch, tdesc, tdesc_data);
/* Override gdbarch_register_reggroup_p set in tdesc_use_registers. */
@@ -5909,16 +6143,26 @@ i386_gdbarch_init (struct gdbarch_info i
tdep->al_regnum = gdbarch_num_regs (gdbarch);
tdep->ax_regnum = tdep->al_regnum + tdep->num_byte_regs;
- mm0_regnum = tdep->ax_regnum + tdep->num_word_regs;
+ ymm0_regnum = tdep->ax_regnum + tdep->num_word_regs;
if (tdep->num_dword_regs)
{
/* Support dword pseudo-registesr if it hasn't been disabled, */
- tdep->eax_regnum = mm0_regnum;
- mm0_regnum = tdep->eax_regnum + tdep->num_dword_regs;
+ tdep->eax_regnum = ymm0_regnum;
+ ymm0_regnum += tdep->num_dword_regs;
}
else
tdep->eax_regnum = -1;
+ mm0_regnum = ymm0_regnum;
+ if (tdep->num_ymm_regs)
+ {
+ /* Support YMM pseudo-registesr if it is available, */
+ tdep->ymm0_regnum = ymm0_regnum;
+ mm0_regnum += tdep->num_ymm_regs;
+ }
+ else
+ tdep->ymm0_regnum = -1;
+
if (tdep->num_mmx_regs != 0)
{
/* Support MMX pseudo-registesr if MMX hasn't been disabled, */
@@ -6001,6 +6245,7 @@ is \"default\"."),
/* Initialize the standard target descriptions. */
initialize_tdesc_i386 ();
+ initialize_tdesc_i386_avx ();
/* Tell remote stub that we support XML target description. */
register_remote_support_xml ("i386");
--- ./gdb/i386-tdep.h 2010-04-03 21:06:52.000000000 +0200
+++ ./gdb/i386-tdep.h 2010-04-03 21:12:32.000000000 +0200
@@ -109,6 +109,9 @@ struct gdbarch_tdep
struct regset *fpregset;
size_t sizeof_fpregset;
+ /* XSAVE extended state. */
+ struct regset *xstateregset;
+
/* Register number for %st(0). The register numbers for the other
registers follow from this one. Set this to -1 to indicate the
absence of an FPU. */
@@ -121,6 +124,13 @@ struct gdbarch_tdep
of MMX support. */
int mm0_regnum;
+ /* Number of pseudo YMM registers. */
+ int num_ymm_regs;
+
+ /* Register number for %ymm0. Set this to -1 to indicate the absence
+ of pseudo YMM register support. */
+ int ymm0_regnum;
+
/* Number of byte registers. */
int num_byte_regs;
@@ -146,9 +156,24 @@ struct gdbarch_tdep
/* Number of SSE registers. */
int num_xmm_regs;
+ /* Bits of the extended control register 0 (the XFEATURE_ENABLED_MASK
+ register), excluding the x87 bit, which are supported by this GDB.
+ */
+ uint64_t xcr0;
+
+ /* Offset of XCR0 in XSAVE extended state. */
+ int xsave_xcr0_offset;
+
/* Register names. */
const char **register_names;
+ /* Register number for %ymm0h. Set this to -1 to indicate the absence
+ of upper YMM register support. */
+ int ymm0h_regnum;
+
+ /* Upper YMM register names. Only used for tdesc_numbered_register. */
+ const char **ymmh_register_names;
+
/* Target description. */
const struct target_desc *tdesc;
@@ -182,6 +207,7 @@ struct gdbarch_tdep
/* ISA-specific data types. */
struct type *i386_mmx_type;
+ struct type *i386_ymm_type;
struct type *i387_ext_type;
/* Process record/replay target. */
@@ -231,7 +257,9 @@ enum i386_regnum
I386_FS_REGNUM, /* %fs */
I386_GS_REGNUM, /* %gs */
I386_ST0_REGNUM, /* %st(0) */
- I386_MXCSR_REGNUM = 40 /* %mxcsr */
+ I386_MXCSR_REGNUM = 40, /* %mxcsr */
+ I386_YMM0H_REGNUM, /* %ymm0h */
+ I386_YMM7H_REGNUM = I386_YMM0H_REGNUM + 7
};
/* Register numbers of RECORD_REGMAP. */
@@ -268,6 +296,7 @@ enum record_i386_regnum
#define I386_NUM_XREGS 9
#define I386_SSE_NUM_REGS (I386_MXCSR_REGNUM + 1)
+#define I386_AVX_NUM_REGS (I386_YMM7H_REGNUM + 1)
/* Size of the largest register. */
#define I386_MAX_REGISTER_SIZE 16
@@ -279,6 +308,9 @@ extern struct type *i387_ext_type (struc
extern int i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum);
extern int i386_word_regnum_p (struct gdbarch *gdbarch, int regnum);
extern int i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern int i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern int i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern int i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum);
extern const char *i386_pseudo_register_name (struct gdbarch *gdbarch,
int regnum);
--- ./gdb/i387-tdep.c 2010-01-01 08:31:36.000000000 +0100
+++ ./gdb/i387-tdep.c 2010-04-03 21:12:32.000000000 +0200
@@ -34,6 +34,7 @@
#include "i386-tdep.h"
#include "i387-tdep.h"
+#include "i386-xstate.h"
/* Print the floating point number specified by RAW. */
@@ -677,6 +678,518 @@ i387_collect_fxsave (const struct regcac
FXSAVE_MXCSR_ADDR (regs));
}
+/* `xstate_bv' is at byte offset 512. */
+#define XSAVE_XSTATE_BV_ADDR(xsave) (xsave + 512)
+
+/* At xsave_avxh_offset[REGNUM] you'll find the offset to the location in
+ the upper 128bit of AVX register data structure used by the "xsave"
+ instruction where GDB register REGNUM is stored. */
+
+static int xsave_avxh_offset[] =
+{
+ 576 + 0 * 16, /* Upper 128bit of %ymm0 through ... */
+ 576 + 1 * 16,
+ 576 + 2 * 16,
+ 576 + 3 * 16,
+ 576 + 4 * 16,
+ 576 + 5 * 16,
+ 576 + 6 * 16,
+ 576 + 7 * 16,
+ 576 + 8 * 16,
+ 576 + 9 * 16,
+ 576 + 10 * 16,
+ 576 + 11 * 16,
+ 576 + 12 * 16,
+ 576 + 13 * 16,
+ 576 + 14 * 16,
+ 576 + 15 * 16 /* Upper 128bit of ... %ymm15 (128 bits each). */
+};
+
+#define XSAVE_AVXH_ADDR(tdep, xsave, regnum) \
+ (xsave + xsave_avxh_offset[regnum - I387_YMM0H_REGNUM (tdep)])
+
+/* Similar to i387_supply_fxsave, but use XSAVE extended state. */
+
+void
+i387_supply_xsave (struct regcache *regcache, int regnum,
+ const void *xsave)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
+ const gdb_byte *regs = xsave;
+ int i;
+ unsigned int clear_bv;
+ const gdb_byte *p;
+ enum
+ {
+ none = 0x0,
+ x87 = 0x1,
+ sse = 0x2,
+ avxh = 0x4,
+ all = x87 | sse | avxh
+ } regclass;
+
+ gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
+ gdb_assert (tdep->num_xmm_regs > 0);
+
+ if (regnum == -1)
+ regclass = all;
+ else if (regnum >= I387_YMM0H_REGNUM (tdep)
+ && regnum < I387_YMMENDH_REGNUM (tdep))
+ regclass = avxh;
+ else if (regnum >= I387_XMM0_REGNUM(tdep)
+ && regnum < I387_MXCSR_REGNUM (tdep))
+ regclass = sse;
+ else if (regnum >= I387_ST0_REGNUM (tdep)
+ && regnum < I387_FCTRL_REGNUM (tdep))
+ regclass = x87;
+ else
+ regclass = none;
+
+ if (regs != NULL && regclass != none)
+ {
+ /* Get `xstat_bv'. */
+ const gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs);
+
+ /* The supported bits in `xstat_bv' are 1 byte. Clear part in
+ vector registers if its bit in xstat_bv is zero. */
+ clear_bv = (~(*xstate_bv_p)) & tdep->xcr0;
+ }
+ else
+ clear_bv = I386_XSTATE_AVX_MASK;
+
+ switch (regclass)
+ {
+ case none:
+ break;
+
+ case avxh:
+ if ((clear_bv & I386_XSTATE_AVX))
+ p = NULL;
+ else
+ p = XSAVE_AVXH_ADDR (tdep, regs, regnum);
+ regcache_raw_supply (regcache, regnum, p);
+ return;
+
+ case sse:
+ if ((clear_bv & I386_XSTATE_SSE))
+ p = NULL;
+ else
+ p = FXSAVE_ADDR (tdep, regs, regnum);
+ regcache_raw_supply (regcache, regnum, p);
+ return;
+
+ case x87:
+ if ((clear_bv & I386_XSTATE_X87))
+ p = NULL;
+ else
+ p = FXSAVE_ADDR (tdep, regs, regnum);
+ regcache_raw_supply (regcache, regnum, p);
+ return;
+
+ case all:
+ /* Hanle the upper YMM registers. */
+ if ((tdep->xcr0 & I386_XSTATE_AVX))
+ {
+ if ((clear_bv & I386_XSTATE_AVX))
+ p = NULL;
+ else
+ p = regs;
+
+ for (i = I387_YMM0H_REGNUM (tdep);
+ i < I387_YMMENDH_REGNUM (tdep); i++)
+ {
+ if (p != NULL)
+ p = XSAVE_AVXH_ADDR (tdep, regs, i);
+ regcache_raw_supply (regcache, i, p);
+ }
+ }
+
+ /* Handle the XMM registers. */
+ if ((tdep->xcr0 & I386_XSTATE_SSE))
+ {
+ if ((clear_bv & I386_XSTATE_SSE))
+ p = NULL;
+ else
+ p = regs;
+
+ for (i = I387_XMM0_REGNUM (tdep);
+ i < I387_MXCSR_REGNUM (tdep); i++)
+ {
+ if (p != NULL)
+ p = FXSAVE_ADDR (tdep, regs, i);
+ regcache_raw_supply (regcache, i, p);
+ }
+ }
+
+ /* Handle the x87 registers. */
+ if ((tdep->xcr0 & I386_XSTATE_X87))
+ {
+ if ((clear_bv & I386_XSTATE_X87))
+ p = NULL;
+ else
+ p = regs;
+
+ for (i = I387_ST0_REGNUM (tdep);
+ i < I387_FCTRL_REGNUM (tdep); i++)
+ {
+ if (p != NULL)
+ p = FXSAVE_ADDR (tdep, regs, i);
+ regcache_raw_supply (regcache, i, p);
+ }
+ }
+ break;
+ }
+
+ /* Only handle x87 control registers. */
+ for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
+ if (regnum == -1 || regnum == i)
+ {
+ if (regs == NULL)
+ {
+ regcache_raw_supply (regcache, i, NULL);
+ continue;
+ }
+
+ /* Most of the FPU control registers occupy only 16 bits in
+ the xsave extended state. Give those a special treatment. */
+ if (i != I387_FIOFF_REGNUM (tdep)
+ && i != I387_FOOFF_REGNUM (tdep))
+ {
+ gdb_byte val[4];
+
+ memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
+ val[2] = val[3] = 0;
+ if (i == I387_FOP_REGNUM (tdep))
+ val[1] &= ((1 << 3) - 1);
+ else if (i== I387_FTAG_REGNUM (tdep))
+ {
+ /* The fxsave area contains a simplified version of
+ the tag word. We have to look at the actual 80-bit
+ FP data to recreate the traditional i387 tag word. */
+
+ unsigned long ftag = 0;
+ int fpreg;
+ int top;
+
+ top = ((FXSAVE_ADDR (tdep, regs,
+ I387_FSTAT_REGNUM (tdep)))[1] >> 3);
+ top &= 0x7;
+
+ for (fpreg = 7; fpreg >= 0; fpreg--)
+ {
+ int tag;
+
+ if (val[0] & (1 << fpreg))
+ {
+ int regnum = (fpreg + 8 - top) % 8
+ + I387_ST0_REGNUM (tdep);
+ tag = i387_tag (FXSAVE_ADDR (tdep, regs, regnum));
+ }
+ else
+ tag = 3; /* Empty */
+
+ ftag |= tag << (2 * fpreg);
+ }
+ val[0] = ftag & 0xff;
+ val[1] = (ftag >> 8) & 0xff;
+ }
+ regcache_raw_supply (regcache, i, val);
+ }
+ else
+ regcache_raw_supply (regcache, i, FXSAVE_ADDR (tdep, regs, i));
+ }
+
+ if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
+ {
+ p = regs == NULL ? NULL : FXSAVE_MXCSR_ADDR (regs);
+ regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), p);
+ }
+}
+
+/* Similar to i387_collect_fxsave, but use XSAVE extended state. */
+
+void
+i387_collect_xsave (const struct regcache *regcache, int regnum,
+ void *xsave, int gcore)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
+ gdb_byte *regs = xsave;
+ int i;
+ enum
+ {
+ none = 0x0,
+ check = 0x1,
+ x87 = 0x2 | check,
+ sse = 0x4 | check,
+ avxh = 0x8 | check,
+ all = x87 | sse | avxh
+ } regclass;
+
+ gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
+ gdb_assert (tdep->num_xmm_regs > 0);
+
+ if (regnum == -1)
+ regclass = all;
+ else if (regnum >= I387_YMM0H_REGNUM (tdep)
+ && regnum < I387_YMMENDH_REGNUM (tdep))
+ regclass = avxh;
+ else if (regnum >= I387_XMM0_REGNUM(tdep)
+ && regnum < I387_MXCSR_REGNUM (tdep))
+ regclass = sse;
+ else if (regnum >= I387_ST0_REGNUM (tdep)
+ && regnum < I387_FCTRL_REGNUM (tdep))
+ regclass = x87;
+ else
+ regclass = none;
+
+ if (gcore)
+ {
+ /* Update XCR0 and `xstate_bv' with XCR0 for gcore. */
+ if (tdep->xsave_xcr0_offset != -1)
+ memcpy (regs + tdep->xsave_xcr0_offset, &tdep->xcr0, 8);
+ memcpy (XSAVE_XSTATE_BV_ADDR (regs), &tdep->xcr0, 8);
+
+ switch (regclass)
+ {
+ default:
+ abort ();
+
+ case all:
+ /* Handle the upper YMM registers. */
+ if ((tdep->xcr0 & I386_XSTATE_AVX))
+ for (i = I387_YMM0H_REGNUM (tdep);
+ i < I387_YMMENDH_REGNUM (tdep); i++)
+ regcache_raw_collect (regcache, i,
+ XSAVE_AVXH_ADDR (tdep, regs, i));
+
+ /* Handle the XMM registers. */
+ if ((tdep->xcr0 & I386_XSTATE_SSE))
+ for (i = I387_XMM0_REGNUM (tdep);
+ i < I387_MXCSR_REGNUM (tdep); i++)
+ regcache_raw_collect (regcache, i,
+ FXSAVE_ADDR (tdep, regs, i));
+
+ /* Handle the x87 registers. */
+ if ((tdep->xcr0 & I386_XSTATE_X87))
+ for (i = I387_ST0_REGNUM (tdep);
+ i < I387_FCTRL_REGNUM (tdep); i++)
+ regcache_raw_collect (regcache, i,
+ FXSAVE_ADDR (tdep, regs, i));
+ break;
+
+ case x87:
+ regcache_raw_collect (regcache, regnum,
+ FXSAVE_ADDR (tdep, regs, regnum));
+ return;
+
+ case sse:
+ regcache_raw_collect (regcache, regnum,
+ FXSAVE_ADDR (tdep, regs, regnum));
+ return;
+
+ case avxh:
+ regcache_raw_collect (regcache, regnum,
+ XSAVE_AVXH_ADDR (tdep, regs, regnum));
+ return;
+ }
+ }
+ else
+ {
+ if ((regclass & check))
+ {
+ gdb_byte raw[I386_MAX_REGISTER_SIZE];
+ gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs);
+ unsigned int xstate_bv = 0;
+ /* The supported bits in `xstat_bv' are 1 byte. */
+ unsigned int clear_bv = (~(*xstate_bv_p)) & tdep->xcr0;
+ gdb_byte *p;
+
+ /* Clear register set if its bit in xstat_bv is zero. */
+ if (clear_bv)
+ {
+ if ((clear_bv & I386_XSTATE_AVX))
+ for (i = I387_YMM0H_REGNUM (tdep);
+ i < I387_YMMENDH_REGNUM (tdep); i++)
+ memset (XSAVE_AVXH_ADDR (tdep, regs, i), 0, 16);
+
+ if ((clear_bv & I386_XSTATE_SSE))
+ for (i = I387_XMM0_REGNUM (tdep);
+ i < I387_MXCSR_REGNUM (tdep); i++)
+ memset (FXSAVE_ADDR (tdep, regs, i), 0, 16);
+
+ if ((clear_bv & I386_XSTATE_X87))
+ for (i = I387_ST0_REGNUM (tdep);
+ i < I387_FCTRL_REGNUM (tdep); i++)
+ memset (FXSAVE_ADDR (tdep, regs, i), 0, 10);
+ }
+
+ if (regclass == all)
+ {
+ /* Check if any upper YMM registers are changed. */
+ if ((tdep->xcr0 & I386_XSTATE_AVX))
+ for (i = I387_YMM0H_REGNUM (tdep);
+ i < I387_YMMENDH_REGNUM (tdep); i++)
+ {
+ regcache_raw_collect (regcache, i, raw);
+ p = XSAVE_AVXH_ADDR (tdep, regs, i);
+ if (memcmp (raw, p, 16))
+ {
+ xstate_bv |= I386_XSTATE_AVX;
+ memcpy (p, raw, 16);
+ }
+ }
+
+ /* Check if any SSE registers are changed. */
+ if ((tdep->xcr0 & I386_XSTATE_SSE))
+ for (i = I387_XMM0_REGNUM (tdep);
+ i < I387_MXCSR_REGNUM (tdep); i++)
+ {
+ regcache_raw_collect (regcache, i, raw);
+ p = FXSAVE_ADDR (tdep, regs, i);
+ if (memcmp (raw, p, 16))
+ {
+ xstate_bv |= I386_XSTATE_SSE;
+ memcpy (p, raw, 16);
+ }
+ }
+
+ /* Check if any X87 registers are changed. */
+ if ((tdep->xcr0 & I386_XSTATE_X87))
+ for (i = I387_ST0_REGNUM (tdep);
+ i < I387_FCTRL_REGNUM (tdep); i++)
+ {
+ regcache_raw_collect (regcache, i, raw);
+ p = FXSAVE_ADDR (tdep, regs, i);
+ if (memcmp (raw, p, 10))
+ {
+ xstate_bv |= I386_XSTATE_X87;
+ memcpy (p, raw, 10);
+ }
+ }
+ }
+ else
+ {
+ /* Check if REGNUM is changed. */
+ regcache_raw_collect (regcache, regnum, raw);
+
+ switch (regclass)
+ {
+ default:
+ abort ();
+
+ case avxh:
+ /* This is an upper YMM register. */
+ p = XSAVE_AVXH_ADDR (tdep, regs, regnum);
+ if (memcmp (raw, p, 16))
+ {
+ xstate_bv |= I386_XSTATE_AVX;
+ memcpy (p, raw, 16);
+ }
+ break;
+
+ case sse:
+ /* This is an SSE register. */
+ p = FXSAVE_ADDR (tdep, regs, regnum);
+ if (memcmp (raw, p, 16))
+ {
+ xstate_bv |= I386_XSTATE_SSE;
+ memcpy (p, raw, 16);
+ }
+ break;
+
+ case x87:
+ /* This is an x87 register. */
+ p = FXSAVE_ADDR (tdep, regs, regnum);
+ if (memcmp (raw, p, 10))
+ {
+ xstate_bv |= I386_XSTATE_X87;
+ memcpy (p, raw, 10);
+ }
+ break;
+ }
+ }
+
+ /* Update the corresponding bits in `xstate_bv' if any SSE/AVX
+ registers are changed. */
+ if (xstate_bv)
+ {
+ /* The supported bits in `xstat_bv' are 1 byte. */
+ *xstate_bv_p |= (gdb_byte) xstate_bv;
+
+ switch (regclass)
+ {
+ default:
+ abort ();
+
+ case all:
+ break;
+
+ case x87:
+ case sse:
+ case avxh:
+ /* Register REGNUM has been updated. Return. */
+ return;
+ }
+ }
+ else
+ {
+ /* Return if REGNUM isn't changed. */
+ if (regclass != all)
+ return;
+ }
+ }
+ }
+
+ /* Only handle x87 control registers. */
+ for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
+ if (regnum == -1 || regnum == i)
+ {
+ /* Most of the FPU control registers occupy only 16 bits in
+ the xsave extended state. Give those a special treatment. */
+ if (i != I387_FIOFF_REGNUM (tdep)
+ && i != I387_FOOFF_REGNUM (tdep))
+ {
+ gdb_byte buf[4];
+
+ regcache_raw_collect (regcache, i, buf);
+
+ if (i == I387_FOP_REGNUM (tdep))
+ {
+ /* The opcode occupies only 11 bits. Make sure we
+ don't touch the other bits. */
+ buf[1] &= ((1 << 3) - 1);
+ buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
+ }
+ else if (i == I387_FTAG_REGNUM (tdep))
+ {
+ /* Converting back is much easier. */
+
+ unsigned short ftag;
+ int fpreg;
+
+ ftag = (buf[1] << 8) | buf[0];
+ buf[0] = 0;
+ buf[1] = 0;
+
+ for (fpreg = 7; fpreg >= 0; fpreg--)
+ {
+ int tag = (ftag >> (fpreg * 2)) & 3;
+
+ if (tag != 3)
+ buf[0] |= (1 << fpreg);
+ }
+ }
+ memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2);
+ }
+ else
+ regcache_raw_collect (regcache, i, FXSAVE_ADDR (tdep, regs, i));
+ }
+
+ if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
+ regcache_raw_collect (regcache, I387_MXCSR_REGNUM (tdep),
+ FXSAVE_MXCSR_ADDR (regs));
+}
+
/* Recreate the FTW (tag word) valid bits from the 80-bit FP data in
*RAW. */
--- ./gdb/i387-tdep.h 2010-04-03 20:59:52.000000000 +0200
+++ ./gdb/i387-tdep.h 2010-04-03 21:12:32.000000000 +0200
@@ -33,6 +33,8 @@ struct ui_file;
#define I387_ST0_REGNUM(tdep) ((tdep)->st0_regnum)
#define I387_NUM_XMM_REGS(tdep) ((tdep)->num_xmm_regs)
#define I387_MM0_REGNUM(tdep) ((tdep)->mm0_regnum)
+#define I387_NUM_YMM_REGS(tdep) ((tdep)->num_ymm_regs)
+#define I387_YMM0H_REGNUM(tdep) ((tdep)->ymm0h_regnum)
#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 8)
#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 1)
@@ -45,6 +47,8 @@ struct ui_file;
#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
#define I387_MXCSR_REGNUM(tdep) \
(I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep))
+#define I387_YMMENDH_REGNUM(tdep) \
+ (I387_YMM0H_REGNUM (tdep) + I387_NUM_YMM_REGS (tdep))
/* Print out the i387 floating point state. */
@@ -99,6 +103,11 @@ extern void i387_collect_fsave (const st
extern void i387_supply_fxsave (struct regcache *regcache, int regnum,
const void *fxsave);
+/* Similar to i387_supply_fxsave, but use XSAVE extended state. */
+
+extern void i387_supply_xsave (struct regcache *regcache, int regnum,
+ const void *xsave);
+
/* Fill register REGNUM (if it is a floating-point or SSE register) in
*FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
all registers. This function doesn't touch any of the reserved
@@ -107,6 +116,11 @@ extern void i387_supply_fxsave (struct r
extern void i387_collect_fxsave (const struct regcache *regcache, int regnum,
void *fxsave);
+/* Similar to i387_collect_fxsave, but use XSAVE extended state. */
+
+extern void i387_collect_xsave (const struct regcache *regcache,
+ int regnum, void *xsave, int gcore);
+
/* Prepare the FPU stack in REGCACHE for a function return. */
extern void i387_return_value (struct gdbarch *gdbarch,
--- ./gdb/regformats/i386/amd64-avx-linux.dat 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/regformats/i386/amd64-avx-linux.dat 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,78 @@
+# DO NOT EDIT: generated from i386/amd64-avx-linux.xml
+name:amd64_avx_linux
+xmltarget:amd64-avx-linux.xml
+expedite:rbp,rsp,rip
+64:rax
+64:rbx
+64:rcx
+64:rdx
+64:rsi
+64:rdi
+64:rbp
+64:rsp
+64:r8
+64:r9
+64:r10
+64:r11
+64:r12
+64:r13
+64:r14
+64:r15
+64:rip
+32:eflags
+32:cs
+32:ss
+32:ds
+32:es
+32:fs
+32:gs
+80:st0
+80:st1
+80:st2
+80:st3
+80:st4
+80:st5
+80:st6
+80:st7
+32:fctrl
+32:fstat
+32:ftag
+32:fiseg
+32:fioff
+32:foseg
+32:fooff
+32:fop
+128:xmm0
+128:xmm1
+128:xmm2
+128:xmm3
+128:xmm4
+128:xmm5
+128:xmm6
+128:xmm7
+128:xmm8
+128:xmm9
+128:xmm10
+128:xmm11
+128:xmm12
+128:xmm13
+128:xmm14
+128:xmm15
+32:mxcsr
+64:orig_rax
+128:ymm0h
+128:ymm1h
+128:ymm2h
+128:ymm3h
+128:ymm4h
+128:ymm5h
+128:ymm6h
+128:ymm7h
+128:ymm8h
+128:ymm9h
+128:ymm10h
+128:ymm11h
+128:ymm12h
+128:ymm13h
+128:ymm14h
+128:ymm15h
--- ./gdb/regformats/i386/amd64-avx.dat 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/regformats/i386/amd64-avx.dat 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,77 @@
+# DO NOT EDIT: generated from i386/amd64-avx.xml
+name:amd64_avx
+xmltarget:amd64-avx.xml
+expedite:rbp,rsp,rip
+64:rax
+64:rbx
+64:rcx
+64:rdx
+64:rsi
+64:rdi
+64:rbp
+64:rsp
+64:r8
+64:r9
+64:r10
+64:r11
+64:r12
+64:r13
+64:r14
+64:r15
+64:rip
+32:eflags
+32:cs
+32:ss
+32:ds
+32:es
+32:fs
+32:gs
+80:st0
+80:st1
+80:st2
+80:st3
+80:st4
+80:st5
+80:st6
+80:st7
+32:fctrl
+32:fstat
+32:ftag
+32:fiseg
+32:fioff
+32:foseg
+32:fooff
+32:fop
+128:xmm0
+128:xmm1
+128:xmm2
+128:xmm3
+128:xmm4
+128:xmm5
+128:xmm6
+128:xmm7
+128:xmm8
+128:xmm9
+128:xmm10
+128:xmm11
+128:xmm12
+128:xmm13
+128:xmm14
+128:xmm15
+32:mxcsr
+128:ymm0h
+128:ymm1h
+128:ymm2h
+128:ymm3h
+128:ymm4h
+128:ymm5h
+128:ymm6h
+128:ymm7h
+128:ymm8h
+128:ymm9h
+128:ymm10h
+128:ymm11h
+128:ymm12h
+128:ymm13h
+128:ymm14h
+128:ymm15h
--- ./gdb/regformats/i386/i386-avx-linux.dat 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/regformats/i386/i386-avx-linux.dat 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,54 @@
+# DO NOT EDIT: generated from i386/i386-avx-linux.xml
+name:i386_avx_linux
+xmltarget:i386-avx-linux.xml
+expedite:ebp,esp,eip
+32:eax
+32:ecx
+32:edx
+32:ebx
+32:esp
+32:ebp
+32:esi
+32:edi
+32:eip
+32:eflags
+32:cs
+32:ss
+32:ds
+32:es
+32:fs
+32:gs
+80:st0
+80:st1
+80:st2
+80:st3
+80:st4
+80:st5
+80:st6
+80:st7
+32:fctrl
+32:fstat
+32:ftag
+32:fiseg
+32:fioff
+32:foseg
+32:fooff
+32:fop
+128:xmm0
+128:xmm1
+128:xmm2
+128:xmm3
+128:xmm4
+128:xmm5
+128:xmm6
+128:xmm7
+32:mxcsr
+32:orig_eax
+128:ymm0h
+128:ymm1h
+128:ymm2h
+128:ymm3h
+128:ymm4h
+128:ymm5h
+128:ymm6h
+128:ymm7h
--- ./gdb/regformats/i386/i386-avx.dat 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/regformats/i386/i386-avx.dat 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,53 @@
+# DO NOT EDIT: generated from i386/i386-avx.xml
+name:i386_avx
+xmltarget:i386-avx.xml
+expedite:ebp,esp,eip
+32:eax
+32:ecx
+32:edx
+32:ebx
+32:esp
+32:ebp
+32:esi
+32:edi
+32:eip
+32:eflags
+32:cs
+32:ss
+32:ds
+32:es
+32:fs
+32:gs
+80:st0
+80:st1
+80:st2
+80:st3
+80:st4
+80:st5
+80:st6
+80:st7
+32:fctrl
+32:fstat
+32:ftag
+32:fiseg
+32:fioff
+32:foseg
+32:fooff
+32:fop
+128:xmm0
+128:xmm1
+128:xmm2
+128:xmm3
+128:xmm4
+128:xmm5
+128:xmm6
+128:xmm7
+32:mxcsr
+128:ymm0h
+128:ymm1h
+128:ymm2h
+128:ymm3h
+128:ymm4h
+128:ymm5h
+128:ymm6h
+128:ymm7h
--- ./gdb/testsuite/ChangeLog.pseudo 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/testsuite/ChangeLog.pseudo 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,26 @@
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.arch/amd64-dword.exp: New.
+
+ * gdb.arch/amd64-word.exp: Simplified.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.arch/amd64-word.exp: New.
+ * gdb.arch/i386-word.exp: Likewise.
+
+ * gdb.arch/i386-byte.exp (nr_regs): Removed.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.arch/amd64-pseudo.c: New.
+ * gdb.arch/i386-byte.exp: Likewise.
+
+ * gdb.arch/amd64-byte.exp: Updated.
+
+ * gdb.arch/i386-pseudo.c: Make it 32bit only.
+
+2010-02-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.arch/amd64-byte.exp: New.
+ * gdb.arch/i386-pseudo.c: Likewise.
--- ./gdb/testsuite/ChangeLog.xcr 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/testsuite/ChangeLog.xcr 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,6 @@
+2010-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.arch/i386-avx.c: New.
+ * gdb.arch/i386-avx.exp: Likewise.
+
+ * gdb.arch/i386-cpuid.h: Updated from gcc 4.4.
--- ./gdb/testsuite/ChangeLog.xml 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/testsuite/ChangeLog.xml 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,4 @@
+2010-02-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gdb.xml/tdesc-regs.exp (architecture): New. Set it for x86.
+ (load_description): Set architecture if defined.
--- ./gdb/testsuite/gdb.arch/i386-avx.c 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/testsuite/gdb.arch/i386-avx.c 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,128 @@
+/* Test program for AVX registers.
+
+ Copyright 2010 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/>. */
+
+#include <stdio.h>
+#include "i386-cpuid.h"
+
+typedef struct {
+ float f[8];
+} v8sf_t;
+
+
+v8sf_t data[] =
+ {
+ { { 0.0, 0.125, 0.25, 0.375, 0.50, 0.625, 0.75, 0.875 } },
+ { { 1.0, 1.125, 1.25, 1.375, 1.50, 1.625, 1.75, 1.875 } },
+ { { 2.0, 2.125, 2.25, 2.375, 2.50, 2.625, 2.75, 2.875 } },
+ { { 3.0, 3.125, 3.25, 3.375, 3.50, 3.625, 3.75, 3.875 } },
+ { { 4.0, 4.125, 4.25, 4.375, 4.50, 4.625, 4.75, 4.875 } },
+ { { 5.0, 5.125, 5.25, 5.375, 5.50, 5.625, 5.75, 5.875 } },
+ { { 6.0, 6.125, 6.25, 6.375, 6.50, 6.625, 6.75, 6.875 } },
+ { { 7.0, 7.125, 7.25, 7.375, 7.50, 7.625, 7.75, 7.875 } },
+#ifdef __x86_64__
+ { { 8.0, 8.125, 8.25, 8.375, 8.50, 8.625, 8.75, 8.875 } },
+ { { 9.0, 9.125, 9.25, 9.375, 9.50, 9.625, 9.75, 9.875 } },
+ { { 10.0, 10.125, 10.25, 10.375, 10.50, 10.625, 10.75, 10.875 } },
+ { { 11.0, 11.125, 11.25, 11.375, 11.50, 11.625, 11.75, 11.875 } },
+ { { 12.0, 12.125, 12.25, 12.375, 12.50, 12.625, 12.75, 12.875 } },
+ { { 13.0, 13.125, 13.25, 13.375, 13.50, 13.625, 13.75, 13.875 } },
+ { { 14.0, 14.125, 14.25, 14.375, 14.50, 14.625, 14.75, 14.875 } },
+ { { 15.0, 15.125, 15.25, 15.375, 15.50, 15.625, 15.75, 15.875 } },
+#endif
+ };
+
+
+int
+have_avx (void)
+{
+ unsigned int eax, ebx, ecx, edx;
+
+ if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+ return 0;
+
+ if ((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE))
+ return 1;
+ else
+ return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+ if (have_avx ())
+ {
+ asm ("vmovaps 0(%0), %%ymm0\n\t"
+ "vmovaps 32(%0), %%ymm1\n\t"
+ "vmovaps 64(%0), %%ymm2\n\t"
+ "vmovaps 96(%0), %%ymm3\n\t"
+ "vmovaps 128(%0), %%ymm4\n\t"
+ "vmovaps 160(%0), %%ymm5\n\t"
+ "vmovaps 192(%0), %%ymm6\n\t"
+ "vmovaps 224(%0), %%ymm7\n\t"
+ : /* no output operands */
+ : "r" (data)
+ : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
+#ifdef __x86_64__
+ asm ("vmovaps 256(%0), %%ymm8\n\t"
+ "vmovaps 288(%0), %%ymm9\n\t"
+ "vmovaps 320(%0), %%ymm10\n\t"
+ "vmovaps 352(%0), %%ymm11\n\t"
+ "vmovaps 384(%0), %%ymm12\n\t"
+ "vmovaps 416(%0), %%ymm13\n\t"
+ "vmovaps 448(%0), %%ymm14\n\t"
+ "vmovaps 480(%0), %%ymm15\n\t"
+ : /* no output operands */
+ : "r" (data)
+ : "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15");
+#endif
+
+ asm ("nop"); /* first breakpoint here */
+
+ asm (
+ "vmovaps %%ymm0, 0(%0)\n\t"
+ "vmovaps %%ymm1, 32(%0)\n\t"
+ "vmovaps %%ymm2, 64(%0)\n\t"
+ "vmovaps %%ymm3, 96(%0)\n\t"
+ "vmovaps %%ymm4, 128(%0)\n\t"
+ "vmovaps %%ymm5, 160(%0)\n\t"
+ "vmovaps %%ymm6, 192(%0)\n\t"
+ "vmovaps %%ymm7, 224(%0)\n\t"
+ : /* no output operands */
+ : "r" (data)
+ : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
+#ifdef __x86_64__
+ asm (
+ "vmovaps %%ymm8, 256(%0)\n\t"
+ "vmovaps %%ymm9, 288(%0)\n\t"
+ "vmovaps %%ymm10, 320(%0)\n\t"
+ "vmovaps %%ymm11, 352(%0)\n\t"
+ "vmovaps %%ymm12, 384(%0)\n\t"
+ "vmovaps %%ymm13, 416(%0)\n\t"
+ "vmovaps %%ymm14, 448(%0)\n\t"
+ "vmovaps %%ymm15, 480(%0)\n\t"
+ : /* no output operands */
+ : "r" (data)
+ : "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15");
+#endif
+
+ puts ("Bye!"); /* second breakpoint here */
+ }
+
+ return 0;
+}
--- ./gdb/testsuite/gdb.arch/i386-avx.exp 1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/testsuite/gdb.arch/i386-avx.exp 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,110 @@
+# Copyright 2010 Free Software Foundation, Inc.
+
+# 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/>.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@gnu.org
+
+# This file is part of the gdb testsuite.
+
+if $tracelevel {
+ strace $tracelevel
+}
+
+set prms_id 0
+set bug_id 0
+
+if { ![istarget i?86-*-*] && ![istarget x86_64-*-* ] } {
+ verbose "Skipping x86 AVX tests."
+ return
+}
+
+set testfile "i386-avx"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+if [get_compiler_info ${binfile}] {
+ return -1
+}
+
+set additional_flags ""
+if [test_compiler_info gcc*] {
+ set additional_flags "additional_flags=-mavx"
+}
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } {
+ unsupported "compiler does not support AVX"
+ return
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+if ![runto_main] then {
+ gdb_suppress_tests
+}
+
+send_gdb "print have_avx ()\r"
+gdb_expect {
+ -re ".. = 1\r\n$gdb_prompt " {
+ pass "check whether processor supports AVX"
+ }
+ -re ".. = 0\r\n$gdb_prompt " {
+ verbose "processor does not support AVX; skipping AVX tests"
+ return
+ }
+ -re ".*$gdb_prompt $" {
+ fail "check whether processor supports AVX"
+ }
+ timeout {
+ fail "check whether processor supports AVX (timeout)"
+ }
+}
+
+gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
+ "Breakpoint .* at .*i386-avx.c.*" \
+ "set first breakpoint in main"
+gdb_continue_to_breakpoint "continue to first breakpoint in main"
+
+if [istarget i?86-*-*] {
+ set nr_regs 8
+} else {
+ set nr_regs 16
+}
+
+for { set r 0 } { $r < $nr_regs } { incr r } {
+ gdb_test "print \$ymm$r.v8_float" \
+ ".. = \\{$r, $r.125, $r.25, $r.375, $r.5, $r.625, $r.75, $r.875\\}.*" \
+ "check float contents of %ymm$r"
+ gdb_test "print \$ymm$r.v32_int8" \
+ ".. = \\{(-?\[0-9\]+, ){31}-?\[0-9\]+\\}.*" \
+ "check int8 contents of %ymm$r"
+}
+
+for { set r 0 } { $r < $nr_regs } { incr r } {
+ gdb_test "set var \$ymm$r.v8_float\[0\] = $r + 10" "" "set %ymm$r"
+}
+
+gdb_test "break [gdb_get_line_number "second breakpoint here"]" \
+ "Breakpoint .* at .*i386-avx.c.*" \
+ "set second breakpoint in main"
+gdb_continue_to_breakpoint "continue to second breakpoint in main"
+
+for { set r 0 } { $r < $nr_regs } { incr r } {
+ gdb_test "print data\[$r\]" \
+ ".. = \\{f = \\{[expr $r + 10], $r.125, $r.25, $r.375, $r.5, $r.625, $r.75, $r.875\\}\\}.*" \
+ "check contents of data\[$r\]"
+}
--- ./gdb/testsuite/gdb.arch/i386-cpuid.h 2010-01-01 08:32:00.000000000 +0100
+++ ./gdb/testsuite/gdb.arch/i386-cpuid.h 2010-04-03 21:12:32.000000000 +0200
@@ -1,30 +1,186 @@
-/* Helper file for i386 platform. Runtime check for MMX/SSE/SSE2 support.
+/* Helper file for i386 platform. Runtime check for MMX/SSE/SSE2/AVX
+ * support. Copied from gcc 4.4.
+ *
+ * Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+ *
+ * This file 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, or (at your option) any
+ * later version.
+ *
+ * This file 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.
+ *
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+/* %ecx */
+#define bit_SSE3 (1 << 0)
+#define bit_PCLMUL (1 << 1)
+#define bit_SSSE3 (1 << 9)
+#define bit_FMA (1 << 12)
+#define bit_CMPXCHG16B (1 << 13)
+#define bit_SSE4_1 (1 << 19)
+#define bit_SSE4_2 (1 << 20)
+#define bit_MOVBE (1 << 22)
+#define bit_POPCNT (1 << 23)
+#define bit_AES (1 << 25)
+#define bit_XSAVE (1 << 26)
+#define bit_OSXSAVE (1 << 27)
+#define bit_AVX (1 << 28)
+
+/* %edx */
+#define bit_CMPXCHG8B (1 << 8)
+#define bit_CMOV (1 << 15)
+#define bit_MMX (1 << 23)
+#define bit_FXSAVE (1 << 24)
+#define bit_SSE (1 << 25)
+#define bit_SSE2 (1 << 26)
+
+/* Extended Features */
+/* %ecx */
+#define bit_LAHF_LM (1 << 0)
+#define bit_ABM (1 << 5)
+#define bit_SSE4a (1 << 6)
+#define bit_XOP (1 << 11)
+#define bit_LWP (1 << 15)
+#define bit_FMA4 (1 << 16)
+
+/* %edx */
+#define bit_LM (1 << 29)
+#define bit_3DNOWP (1 << 30)
+#define bit_3DNOW (1 << 31)
+
+
+#if defined(__i386__) && defined(__PIC__)
+/* %ebx may be the PIC register. */
+#if __GNUC__ >= 3
+#define __cpuid(level, a, b, c, d) \
+ __asm__ ("xchg{l}\t{%%}ebx, %1\n\t" \
+ "cpuid\n\t" \
+ "xchg{l}\t{%%}ebx, %1\n\t" \
+ : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
+ : "0" (level))
+
+#define __cpuid_count(level, count, a, b, c, d) \
+ __asm__ ("xchg{l}\t{%%}ebx, %1\n\t" \
+ "cpuid\n\t" \
+ "xchg{l}\t{%%}ebx, %1\n\t" \
+ : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
+ : "0" (level), "2" (count))
+#else
+/* Host GCCs older than 3.0 weren't supporting Intel asm syntax
+ nor alternatives in i386 code. */
+#define __cpuid(level, a, b, c, d) \
+ __asm__ ("xchgl\t%%ebx, %1\n\t" \
+ "cpuid\n\t" \
+ "xchgl\t%%ebx, %1\n\t" \
+ : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
+ : "0" (level))
+
+#define __cpuid_count(level, count, a, b, c, d) \
+ __asm__ ("xchgl\t%%ebx, %1\n\t" \
+ "cpuid\n\t" \
+ "xchgl\t%%ebx, %1\n\t" \
+ : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
+ : "0" (level), "2" (count))
+#endif
+#else
+#define __cpuid(level, a, b, c, d) \
+ __asm__ ("cpuid\n\t" \
+ : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
+ : "0" (level))
+
+#define __cpuid_count(level, count, a, b, c, d) \
+ __asm__ ("cpuid\n\t" \
+ : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
+ : "0" (level), "2" (count))
+#endif
+
+/* Return highest supported input value for cpuid instruction. ext can
+ be either 0x0 or 0x8000000 to return highest supported value for
+ basic or extended cpuid information. Function returns 0 if cpuid
+ is not supported or whatever cpuid returns in eax register. If sig
+ pointer is non-null, then first four bytes of the signature
+ (as found in ebx register) are returned in location pointed by sig. */
+
+static __inline unsigned int
+__get_cpuid_max (unsigned int __ext, unsigned int *__sig)
+{
+ unsigned int __eax, __ebx, __ecx, __edx;
+
+#ifndef __x86_64__
+#if __GNUC__ >= 3
+ /* See if we can use cpuid. On AMD64 we always can. */
+ __asm__ ("pushf{l|d}\n\t"
+ "pushf{l|d}\n\t"
+ "pop{l}\t%0\n\t"
+ "mov{l}\t{%0, %1|%1, %0}\n\t"
+ "xor{l}\t{%2, %0|%0, %2}\n\t"
+ "push{l}\t%0\n\t"
+ "popf{l|d}\n\t"
+ "pushf{l|d}\n\t"
+ "pop{l}\t%0\n\t"
+ "popf{l|d}\n\t"
+ : "=&r" (__eax), "=&r" (__ebx)
+ : "i" (0x00200000));
+#else
+/* Host GCCs older than 3.0 weren't supporting Intel asm syntax
+ nor alternatives in i386 code. */
+ __asm__ ("pushfl\n\t"
+ "pushfl\n\t"
+ "popl\t%0\n\t"
+ "movl\t%0, %1\n\t"
+ "xorl\t%2, %0\n\t"
+ "pushl\t%0\n\t"
+ "popfl\n\t"
+ "pushfl\n\t"
+ "popl\t%0\n\t"
+ "popfl\n\t"
+ : "=&r" (__eax), "=&r" (__ebx)
+ : "i" (0x00200000));
+#endif
- Copyright 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+ if (!((__eax ^ __ebx) & 0x00200000))
+ return 0;
+#endif
- This file is part of GDB.
+ /* Host supports cpuid. Return highest supported cpuid input value. */
+ __cpuid (__ext, __eax, __ebx, __ecx, __edx);
- 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.
+ if (__sig)
+ *__sig = __ebx;
- 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.
+ return __eax;
+}
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
+/* Return cpuid data for requested cpuid level, as found in returned
+ eax, ebx, ecx and edx registers. The function checks if cpuid is
+ supported and returns 1 for valid cpuid information or 0 for
+ unsupported cpuid level. All pointers are required to be non-null. */
+
+static __inline int
+__get_cpuid (unsigned int __level,
+ unsigned int *__eax, unsigned int *__ebx,
+ unsigned int *__ecx, unsigned int *__edx)
+{
+ unsigned int __ext = __level & 0x80000000;
-/* Used by 20020523-2.c and i386-sse-6.c, and possibly others. */
-/* Plagarized from 20020523-2.c. */
-/* Plagarized from gcc. */
+ if (__get_cpuid_max (__ext, 0) < __level)
+ return 0;
-#define bit_CMOV (1 << 15)
-#define bit_MMX (1 << 23)
-#define bit_SSE (1 << 25)
-#define bit_SSE2 (1 << 26)
+ __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);
+ return 1;
+}
#ifndef NOINLINE
#define NOINLINE __attribute__ ((noinline))
@@ -35,41 +191,10 @@ unsigned int i386_cpuid (void) NOINLINE;
unsigned int NOINLINE
i386_cpuid (void)
{
- int fl1, fl2;
-
-#ifndef __x86_64__
- /* See if we can use cpuid. On AMD64 we always can. */
- __asm__ ("pushfl; pushfl; popl %0; movl %0,%1; xorl %2,%0;"
- "pushl %0; popfl; pushfl; popl %0; popfl"
- : "=&r" (fl1), "=&r" (fl2)
- : "i" (0x00200000));
- if (((fl1 ^ fl2) & 0x00200000) == 0)
- return (0);
-#endif
+ unsigned int eax, ebx, ecx, edx;
- /* Host supports cpuid. See if cpuid gives capabilities, try
- CPUID(0). Preserve %ebx and %ecx; cpuid insn clobbers these, we
- don't need their CPUID values here, and %ebx may be the PIC
- register. */
-#ifdef __x86_64__
- __asm__ ("pushq %%rcx; pushq %%rbx; cpuid; popq %%rbx; popq %%rcx"
- : "=a" (fl1) : "0" (0) : "rdx", "cc");
-#else
- __asm__ ("pushl %%ecx; pushl %%ebx; cpuid; popl %%ebx; popl %%ecx"
- : "=a" (fl1) : "0" (0) : "edx", "cc");
-#endif
- if (fl1 == 0)
- return (0);
-
- /* Invoke CPUID(1), return %edx; caller can examine bits to
- determine what's supported. */
-#ifdef __x86_64__
- __asm__ ("pushq %%rcx; pushq %%rbx; cpuid; popq %%rbx; popq %%rcx"
- : "=d" (fl2), "=a" (fl1) : "1" (1) : "cc");
-#else
- __asm__ ("pushl %%ecx; pushl %%ebx; cpuid; popl %%ebx; popl %%ecx"
- : "=d" (fl2), "=a" (fl1) : "1" (1) : "cc");
-#endif
+ if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+ return 0;
- return fl2;
+ return edx;
}
--- ./include/elf/ChangeLog.xstate 1970-01-01 01:00:00.000000000 +0100
+++ ./include/elf/ChangeLog.xstate 2010-04-03 21:12:32.000000000 +0200
@@ -0,0 +1,8 @@
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common.h (NT_386_XSTATE): Renamed to ...
+ (NT_X86_XSTATE): This.
+
+2010-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * common.h (NT_386_XSTATE): New.