Centralize amd64-linux target descriptions
This patch adds a new function amd64_linux_read_description, which creates amd64-linux target descriptions according to its two arguments, xcr0 and is_x32. gdb: 2017-09-05 Yao Qi <yao.qi@linaro.org> * amd64-linux-tdep.c (amd64_linux_read_description): New function. (amd64_linux_core_read_description): Call amd64_linux_read_description. (amd64_linux_init_abi): Likewise. (amd64_x32_linux_init_abi): Likewise. * amd64-linux-tdep.h (amd64_linux_read_description): Declare. * x86-linux-nat.c (x86_linux_read_description): Call amd64_linux_read_description.
This commit is contained in:
parent
b9f1d50ffc
commit
9d3d478be5
|
@ -1,3 +1,15 @@
|
|||
2017-09-05 Yao Qi <yao.qi@linaro.org>
|
||||
|
||||
* amd64-linux-tdep.c (amd64_linux_read_description): New
|
||||
function.
|
||||
(amd64_linux_core_read_description): Call
|
||||
amd64_linux_read_description.
|
||||
(amd64_linux_init_abi): Likewise.
|
||||
(amd64_x32_linux_init_abi): Likewise.
|
||||
* amd64-linux-tdep.h (amd64_linux_read_description): Declare.
|
||||
* x86-linux-nat.c (x86_linux_read_description): Call
|
||||
amd64_linux_read_description.
|
||||
|
||||
2017-09-05 Yao Qi <yao.qi@linaro.org>
|
||||
|
||||
* amd64-linux-tdep.c (amd64_linux_core_read_description): Update
|
||||
|
|
|
@ -1575,6 +1575,47 @@ amd64_linux_record_signal (struct gdbarch *gdbarch,
|
|||
return 0;
|
||||
}
|
||||
|
||||
const target_desc *
|
||||
amd64_linux_read_description (uint64_t xcr0_features_bit, bool is_x32)
|
||||
{
|
||||
switch (xcr0_features_bit)
|
||||
{
|
||||
case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
|
||||
if (is_x32)
|
||||
/* No MPX, PKU on x32, fallback to AVX-AVX512. */
|
||||
return tdesc_x32_avx_avx512_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_mpx_avx512_pku_linux;
|
||||
case X86_XSTATE_AVX_AVX512_MASK:
|
||||
if (is_x32)
|
||||
return tdesc_x32_avx_avx512_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_avx512_linux;
|
||||
case X86_XSTATE_MPX_MASK:
|
||||
if (is_x32)
|
||||
/* No MPX on x32, fallback to AVX. */
|
||||
return tdesc_x32_avx_linux;
|
||||
else
|
||||
return tdesc_amd64_mpx_linux;
|
||||
case X86_XSTATE_AVX_MPX_MASK:
|
||||
if (is_x32)
|
||||
/* No MPX on x32, fallback to AVX. */
|
||||
return tdesc_x32_avx_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_mpx_linux;
|
||||
case X86_XSTATE_AVX_MASK:
|
||||
if (is_x32)
|
||||
return tdesc_x32_avx_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_linux;
|
||||
default:
|
||||
if (is_x32)
|
||||
return tdesc_x32_linux;
|
||||
else
|
||||
return tdesc_amd64_linux;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get Linux/x86 target description from core dump. */
|
||||
|
||||
static const struct target_desc *
|
||||
|
@ -1585,42 +1626,8 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch,
|
|||
/* Linux/x86-64. */
|
||||
uint64_t xcr0 = i386_linux_core_read_xcr0 (abfd);
|
||||
|
||||
switch (xcr0 & X86_XSTATE_ALL_MASK)
|
||||
{
|
||||
case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
|
||||
if (gdbarch_ptr_bit (gdbarch) == 32)
|
||||
/* No MPX, PKU on x32, fallback to AVX-AVX512. */
|
||||
return tdesc_x32_avx_avx512_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_mpx_avx512_pku_linux;
|
||||
case X86_XSTATE_AVX_AVX512_MASK:
|
||||
if (gdbarch_ptr_bit (gdbarch) == 32)
|
||||
return tdesc_x32_avx_avx512_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_avx512_linux;
|
||||
case X86_XSTATE_MPX_MASK:
|
||||
if (gdbarch_ptr_bit (gdbarch) == 32)
|
||||
/* No MPX on x32, fallback to AVX. */
|
||||
return tdesc_x32_avx_linux;
|
||||
else
|
||||
return tdesc_amd64_mpx_linux;
|
||||
case X86_XSTATE_AVX_MPX_MASK:
|
||||
if (gdbarch_ptr_bit (gdbarch) == 32)
|
||||
/* No MPX on x32, fallback to AVX. */
|
||||
return tdesc_x32_avx_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_mpx_linux;
|
||||
case X86_XSTATE_AVX_MASK:
|
||||
if (gdbarch_ptr_bit (gdbarch) == 32)
|
||||
return tdesc_x32_avx_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_linux;
|
||||
default:
|
||||
if (gdbarch_ptr_bit (gdbarch) == 32)
|
||||
return tdesc_x32_linux;
|
||||
else
|
||||
return tdesc_amd64_linux;
|
||||
}
|
||||
return amd64_linux_read_description (xcr0 & X86_XSTATE_ALL_MASK,
|
||||
gdbarch_ptr_bit (gdbarch) == 32);
|
||||
}
|
||||
|
||||
/* Similar to amd64_supply_fpregset, but use XSAVE extended state. */
|
||||
|
@ -1873,7 +1880,8 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset);
|
||||
tdep->sizeof_gregset = 27 * 8;
|
||||
|
||||
amd64_init_abi (info, gdbarch, tdesc_amd64_linux);
|
||||
amd64_init_abi (info, gdbarch,
|
||||
amd64_linux_read_description (X86_XSTATE_SSE_MASK, false));
|
||||
|
||||
const target_desc *tdesc = tdep->tdesc;
|
||||
|
||||
|
@ -2086,7 +2094,9 @@ amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset);
|
||||
tdep->sizeof_gregset = 27 * 8;
|
||||
|
||||
amd64_x32_init_abi (info, gdbarch, tdesc_x32_linux);
|
||||
amd64_x32_init_abi (info, gdbarch,
|
||||
amd64_linux_read_description (X86_XSTATE_SSE_MASK,
|
||||
true));
|
||||
|
||||
/* Reserve a number for orig_rax. */
|
||||
set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS);
|
||||
|
|
|
@ -43,6 +43,12 @@ extern struct target_desc *tdesc_x32_linux;
|
|||
extern struct target_desc *tdesc_x32_avx_linux;
|
||||
extern struct target_desc *tdesc_x32_avx_avx512_linux;
|
||||
|
||||
/* Return the right amd64-linux target descriptions according to
|
||||
XCR0_FEATURES_BIT and IS_X32. */
|
||||
|
||||
const target_desc *amd64_linux_read_description (uint64_t xcr0_features_bit,
|
||||
bool is_x32);
|
||||
|
||||
/* Enum that defines the syscall identifiers for amd64 linux.
|
||||
Used for process record/replay, these will be translated into
|
||||
a gdb-canonical set of syscall ids in linux-record.c. */
|
||||
|
|
|
@ -192,40 +192,7 @@ x86_linux_read_description (struct target_ops *ops)
|
|||
if (is_64bit)
|
||||
{
|
||||
#ifdef __x86_64__
|
||||
switch (xcr0_features_bits)
|
||||
{
|
||||
case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
|
||||
if (is_x32)
|
||||
/* No MPX, PKU on x32, fall back to AVX-AVX512. */
|
||||
return tdesc_x32_avx_avx512_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_mpx_avx512_pku_linux;
|
||||
case X86_XSTATE_AVX_AVX512_MASK:
|
||||
if (is_x32)
|
||||
return tdesc_x32_avx_avx512_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_avx512_linux;
|
||||
case X86_XSTATE_MPX_MASK:
|
||||
if (is_x32)
|
||||
return tdesc_x32_avx_linux; /* No MPX on x32 using AVX. */
|
||||
else
|
||||
return tdesc_amd64_mpx_linux;
|
||||
case X86_XSTATE_AVX_MPX_MASK:
|
||||
if (is_x32)
|
||||
return tdesc_x32_avx_linux; /* No MPX on x32 using AVX. */
|
||||
else
|
||||
return tdesc_amd64_avx_mpx_linux;
|
||||
case X86_XSTATE_AVX_MASK:
|
||||
if (is_x32)
|
||||
return tdesc_x32_avx_linux;
|
||||
else
|
||||
return tdesc_amd64_avx_linux;
|
||||
default:
|
||||
if (is_x32)
|
||||
return tdesc_x32_linux;
|
||||
else
|
||||
return tdesc_amd64_linux;
|
||||
}
|
||||
return amd64_linux_read_description (xcr0_features_bits, is_x32);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue