Add an arm-tls feature which includes the tpidruro register from CP15.

This commit is contained in:
John Baldwin 2022-05-03 16:05:10 -07:00
parent 40c23d8803
commit 92d48a1e4e
12 changed files with 66 additions and 17 deletions

View File

@ -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 ();
}

View File

@ -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 ();
}

View File

@ -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. */

View File

@ -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;

View File

@ -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 ();

View File

@ -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;

View File

@ -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 ();

View File

@ -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;

View File

@ -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. */

View File

@ -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 \

View 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;
}

View 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>