mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 10:03:47 +08:00
Add an arm-tls feature which includes the tpidruro register from CP15.
This commit is contained in:
parent
40c23d8803
commit
92d48a1e4e
@ -19,6 +19,7 @@
|
||||
#include "aarch32.h"
|
||||
|
||||
#include "../features/arm/arm-core.c"
|
||||
#include "../features/arm/arm-tls.c"
|
||||
#include "../features/arm/arm-vfpv3.c"
|
||||
|
||||
/* See aarch32.h. */
|
||||
@ -38,6 +39,7 @@ aarch32_create_target_description ()
|
||||
/* Create a vfpv3 feature, then a blank NEON feature. */
|
||||
regnum = create_feature_arm_arm_vfpv3 (tdesc.get (), regnum);
|
||||
tdesc_create_feature (tdesc.get (), "org.gnu.gdb.arm.neon");
|
||||
regnum = create_feature_arm_arm_tls (tdesc.get (), regnum);
|
||||
|
||||
return tdesc.release ();
|
||||
}
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "arm.h"
|
||||
|
||||
#include "../features/arm/arm-core.c"
|
||||
#include "../features/arm/arm-tls.c"
|
||||
#include "../features/arm/arm-vfpv2.c"
|
||||
#include "../features/arm/arm-vfpv3.c"
|
||||
#include "../features/arm/xscale-iwmmxt.c"
|
||||
@ -374,7 +375,7 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
|
||||
/* See arch/arm.h. */
|
||||
|
||||
target_desc *
|
||||
arm_create_target_description (arm_fp_type fp_type)
|
||||
arm_create_target_description (arm_fp_type fp_type, bool tls)
|
||||
{
|
||||
target_desc_up tdesc = allocate_target_description ();
|
||||
|
||||
@ -410,6 +411,9 @@ arm_create_target_description (arm_fp_type fp_type)
|
||||
error (_("Invalid Arm FP type: %d"), fp_type);
|
||||
}
|
||||
|
||||
if (tls)
|
||||
regnum = create_feature_arm_arm_tls (tdesc.get (), regnum);
|
||||
|
||||
return tdesc.release ();
|
||||
}
|
||||
|
||||
|
@ -207,7 +207,7 @@ unsigned long shifted_reg_val (struct regcache *regcache,
|
||||
|
||||
/* Create an Arm target description with the given FP hardware type. */
|
||||
|
||||
target_desc *arm_create_target_description (arm_fp_type fp_type);
|
||||
target_desc *arm_create_target_description (arm_fp_type fp_type, bool tls);
|
||||
|
||||
/* Create an Arm M-profile target description with the given hardware type. */
|
||||
|
||||
|
@ -188,9 +188,9 @@ arm_fbsd_read_description_auxv (struct target_ops *target)
|
||||
return aarch32_read_description ();
|
||||
else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPD32))
|
||||
== (HWCAP_VFPv3 | HWCAP_VFPD32))
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV3);
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV3, false);
|
||||
else
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV2);
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV2, false);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
@ -550,7 +550,7 @@ arm_linux_nat_target::read_description ()
|
||||
}
|
||||
|
||||
if (arm_hwcap & HWCAP_IWMMXT)
|
||||
return arm_read_description (ARM_FP_TYPE_IWMMXT);
|
||||
return arm_read_description (ARM_FP_TYPE_IWMMXT, false);
|
||||
|
||||
if (arm_hwcap & HWCAP_VFP)
|
||||
{
|
||||
@ -567,9 +567,9 @@ arm_linux_nat_target::read_description ()
|
||||
if (arm_hwcap & HWCAP_NEON)
|
||||
return aarch32_read_description ();
|
||||
else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV3);
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV3, false);
|
||||
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV2);
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV2, false);
|
||||
}
|
||||
|
||||
return this->beneath ()->read_description ();
|
||||
|
@ -741,9 +741,9 @@ arm_linux_core_read_description (struct gdbarch *gdbarch,
|
||||
if (arm_hwcap & HWCAP_NEON)
|
||||
return aarch32_read_description ();
|
||||
else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV3);
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV3, false);
|
||||
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV2);
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV2, false);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
@ -346,13 +346,13 @@ arm_netbsd_nat_target::read_description ()
|
||||
|
||||
if (sysctlbyname("machdep.fpu_present", &flag, &len, NULL, 0) != 0
|
||||
|| !flag)
|
||||
return arm_read_description (ARM_FP_TYPE_NONE);
|
||||
return arm_read_description (ARM_FP_TYPE_NONE, false);
|
||||
|
||||
len = sizeof(flag);
|
||||
if (sysctlbyname("machdep.neon_present", &flag, &len, NULL, 0) == 0 && flag)
|
||||
return aarch32_read_description ();
|
||||
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV3);
|
||||
return arm_read_description (ARM_FP_TYPE_VFPV3, false);
|
||||
}
|
||||
|
||||
void _initialize_arm_netbsd_nat ();
|
||||
|
@ -240,7 +240,7 @@ static const char **valid_disassembly_styles;
|
||||
static const char *disassembly_style;
|
||||
|
||||
/* All possible arm target descriptors. */
|
||||
static struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID];
|
||||
static struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID][2];
|
||||
static struct target_desc *tdesc_arm_mprofile_list[ARM_M_TYPE_INVALID];
|
||||
|
||||
/* This is used to keep the bfd arch_info in sync with the disassembly
|
||||
@ -9606,6 +9606,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
int m_profile_psp_ns_regnum = -1;
|
||||
int m_profile_msp_s_regnum = -1;
|
||||
int m_profile_psp_s_regnum = -1;
|
||||
int tls_regnum = 0;
|
||||
|
||||
/* If we have an object to base this architecture on, try to determine
|
||||
its ABI. */
|
||||
@ -9973,6 +9974,19 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for the TLS register feature. */
|
||||
feature = tdesc_find_feature (tdesc, "org.gnu.gdb.arm.tls");
|
||||
if (feature != nullptr)
|
||||
{
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
register_count, "tpidruro");
|
||||
if (!valid_p)
|
||||
return nullptr;
|
||||
|
||||
tls_regnum = register_count;
|
||||
register_count++;
|
||||
}
|
||||
|
||||
/* Check for MVE after all the checks for GPR's, VFP and Neon.
|
||||
MVE (Helium) is an M-profile extension. */
|
||||
if (is_m)
|
||||
@ -10128,6 +10142,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
tdep->have_s_pseudos = have_s_pseudos;
|
||||
tdep->have_q_pseudos = have_q_pseudos;
|
||||
tdep->have_neon = have_neon;
|
||||
tdep->tls_regnum = tls_regnum;
|
||||
|
||||
/* Adjust the MVE feature settings. */
|
||||
if (have_mve)
|
||||
@ -14416,14 +14431,14 @@ arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
||||
/* See arm-tdep.h. */
|
||||
|
||||
const target_desc *
|
||||
arm_read_description (arm_fp_type fp_type)
|
||||
arm_read_description (arm_fp_type fp_type, bool tls)
|
||||
{
|
||||
struct target_desc *tdesc = tdesc_arm_list[fp_type];
|
||||
struct target_desc *tdesc = tdesc_arm_list[fp_type][tls];
|
||||
|
||||
if (tdesc == nullptr)
|
||||
{
|
||||
tdesc = arm_create_target_description (fp_type);
|
||||
tdesc_arm_list[fp_type] = tdesc;
|
||||
tdesc = arm_create_target_description (fp_type, tls);
|
||||
tdesc_arm_list[fp_type][tls] = tdesc;
|
||||
}
|
||||
|
||||
return tdesc;
|
||||
|
@ -134,6 +134,8 @@ struct arm_gdbarch_tdep : gdbarch_tdep
|
||||
int m_profile_msp_s_regnum = ARM_SP_REGNUM; /* M-profile MSP_S register number. */
|
||||
int m_profile_psp_s_regnum = ARM_SP_REGNUM; /* M-profile PSP_S register number. */
|
||||
|
||||
int tls_regnum = 0; /* Number of the tpidruro register. */
|
||||
|
||||
bool is_m = false; /* Does the target follow the "M" profile. */
|
||||
bool have_sec_ext = false; /* Do we have security extensions? */
|
||||
CORE_ADDR lowest_pc = 0; /* Lowest address at which instructions
|
||||
@ -317,7 +319,7 @@ extern void
|
||||
const struct regcache *regcache);
|
||||
|
||||
/* Get the correct Arm target description with given FP hardware type. */
|
||||
const target_desc *arm_read_description (arm_fp_type fp_type);
|
||||
const target_desc *arm_read_description (arm_fp_type fp_type, bool tls);
|
||||
|
||||
/* Get the correct Arm M-Profile target description with given hardware
|
||||
type. */
|
||||
|
@ -208,6 +208,7 @@ FEATURE_XMLFILES = aarch64-core.xml \
|
||||
arm/arm-m-profile-mve.xml \
|
||||
arm/arm-m-system.xml \
|
||||
arm/arm-m-profile-with-fpa.xml \
|
||||
arm/arm-tls.xml \
|
||||
arm/arm-vfpv2.xml \
|
||||
arm/arm-vfpv3.xml \
|
||||
arm/xscale-iwmmxt.xml \
|
||||
|
14
gdb/features/arm/arm-tls.c
Normal file
14
gdb/features/arm/arm-tls.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
|
||||
Original: arm-tls.xml */
|
||||
|
||||
#include "gdbsupport/tdesc.h"
|
||||
|
||||
static int
|
||||
create_feature_arm_arm_tls (struct target_desc *result, long regnum)
|
||||
{
|
||||
struct tdesc_feature *feature;
|
||||
|
||||
feature = tdesc_create_feature (result, "org.gnu.gdb.arm.tls");
|
||||
tdesc_create_reg (feature, "tpidruro", regnum++, 1, NULL, 32, "data_ptr");
|
||||
return regnum;
|
||||
}
|
11
gdb/features/arm/arm-tls.xml
Normal file
11
gdb/features/arm/arm-tls.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- Copyright (C) 2022 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.arm.tls">
|
||||
<reg name="tpidruro" bitsize="32" type="data_ptr"/>
|
||||
</feature>
|
Loading…
Reference in New Issue
Block a user