8272 lines
266 KiB
Diff
8272 lines
266 KiB
Diff
[ 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.
|