Add target description/feature for MTE registers

This patch adds a target description and feature "mte" for aarch64.

It includes a couple registers: sctlr and gcr. Both 64-bit in size.

The patch also adjusts the code that creates the target descriptions at
runtime based on CPU feature checks.

gdb/ChangeLog:

YYYY-MM-DD  Luis Machado  <luis.machado@linaro.org>

	* aarch64-linux-nat.c
	(aarch64_linux_nat_target::read_description): Take MTE flag into
	account.
	* aarch64-linux-tdep.c
	(aarch64_linux_core_read_description): Likewise.
	* aarch64-tdep.c (tdesc_aarch64_list): Add one more dimension for
	MTE.
	(aarch64_read_description): Add mte_p parameter and update to use it.
	Update the documentation.
	(aarch64_gdbarch_init): Update call to aarch64_read_description.
	* aarch64-tdep.h (aarch64_read_description): Add mte_p parameter.
	* arch/aarch64.c: Include ../features/aarch64-mte.c.
	(aarch64_create_target_description): Add mte_p parameter and update
	the code to use it.
	* arch/aarch64.h (aarch64_create_target_description): Add mte_p
	parameter.
	* features/Makefile (FEATURE_XMLFILES): Add aarch64-mte.xml.
	* features/aarch64-mte.c: New file, generated.
	* features/aarch64-mte.xml: New file.

gdbserver/ChangeLog:

YYYY-MM-DD  Luis Machado  <luis.machado@linaro.org>

	* linux-aarch64-ipa.cc (get_ipa_tdesc): Update call to
	aarch64_linux_read_description.
	(initialize_low_tracepoint): Likewise.
	* linux-aarch64-low.cc (aarch64_target::low_arch_setup): Take MTE flag
	into account.
	* linux-aarch64-tdesc.cc (tdesc_aarch64_list): Add one more dimension
	for MTE.
	(aarch64_linux_read_description): Add mte_p parameter and update to
	use it.
	* linux-aarch64-tdesc.h (aarch64_linux_read_description): Add mte_p
	parameter.
This commit is contained in:
Luis Machado
2020-06-15 13:52:27 -03:00
parent 48d2ae75f2
commit d7212f00a4
13 changed files with 73 additions and 24 deletions

View File

@@ -653,9 +653,12 @@ aarch64_linux_nat_target::read_description ()
return aarch32_read_description ();
CORE_ADDR hwcap = linux_get_hwcap (this);
CORE_ADDR hwcap2 = linux_get_hwcap2 (this);
bool mte_p = hwcap2 & HWCAP2_MTE;
return aarch64_read_description (aarch64_sve_get_vq (tid),
hwcap & AARCH64_HWCAP_PACA);
hwcap & AARCH64_HWCAP_PACA, mte_p);
}
/* Convert a native/host siginfo object, into/from the siginfo in the

View File

@@ -654,9 +654,11 @@ aarch64_linux_core_read_description (struct gdbarch *gdbarch,
struct target_ops *target, bfd *abfd)
{
CORE_ADDR hwcap = linux_get_hwcap (target);
CORE_ADDR hwcap2 = linux_get_hwcap2 (target);
bool mte_p = (hwcap2 & HWCAP2_MTE)? true : false;
return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, abfd),
hwcap & AARCH64_HWCAP_PACA);
hwcap & AARCH64_HWCAP_PACA, mte_p);
}
/* Implementation of `gdbarch_stap_is_single_operand', as defined in

View File

@@ -62,7 +62,7 @@
#define HA_MAX_NUM_FLDS 4
/* All possible aarch64 target descriptors. */
struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/];
struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/][2 /* mte */];
/* The standard register names, and all the valid aliases for them. */
static const struct
@@ -3139,21 +3139,23 @@ aarch64_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
/* Get the correct target description for the given VQ value.
If VQ is zero then it is assumed SVE is not supported.
(It is not possible to set VQ to zero on an SVE system). */
(It is not possible to set VQ to zero on an SVE system).
MTE_P indicates the presence of the Memory Tagging Extension feature. */
const target_desc *
aarch64_read_description (uint64_t vq, bool pauth_p)
aarch64_read_description (uint64_t vq, bool pauth_p, bool mte_p)
{
if (vq > AARCH64_MAX_SVE_VQ)
error (_("VQ is %" PRIu64 ", maximum supported value is %d"), vq,
AARCH64_MAX_SVE_VQ);
struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p];
struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p][mte_p];
if (tdesc == NULL)
{
tdesc = aarch64_create_target_description (vq, pauth_p);
tdesc_aarch64_list[vq][pauth_p] = tdesc;
tdesc = aarch64_create_target_description (vq, pauth_p, mte_p);
tdesc_aarch64_list[vq][pauth_p][mte_p] = tdesc;
}
return tdesc;
@@ -3253,7 +3255,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
value. */
const struct target_desc *tdesc = info.target_desc;
if (!tdesc_has_registers (tdesc) || vq != aarch64_get_tdesc_vq (tdesc))
tdesc = aarch64_read_description (vq, false);
tdesc = aarch64_read_description (vq, false, false);
gdb_assert (tdesc);
feature_core = tdesc_find_feature (tdesc,"org.gnu.gdb.aarch64.core");

View File

@@ -102,7 +102,8 @@ struct gdbarch_tdep
}
};
const target_desc *aarch64_read_description (uint64_t vq, bool pauth_p);
const target_desc *aarch64_read_description (uint64_t vq, bool pauth_p,
bool mte_p);
extern int aarch64_process_record (struct gdbarch *gdbarch,
struct regcache *regcache, CORE_ADDR addr);

View File

@@ -23,11 +23,12 @@
#include "../features/aarch64-fpu.c"
#include "../features/aarch64-sve.c"
#include "../features/aarch64-pauth.c"
#include "../features/aarch64-mte.c"
/* See arch/aarch64.h. */
target_desc *
aarch64_create_target_description (uint64_t vq, bool pauth_p)
aarch64_create_target_description (uint64_t vq, bool pauth_p, bool mte_p)
{
target_desc *tdesc = allocate_target_description ();
@@ -47,5 +48,9 @@ aarch64_create_target_description (uint64_t vq, bool pauth_p)
if (pauth_p)
regnum = create_feature_aarch64_pauth (tdesc, regnum);
/* Memory tagging extension registers. */
if (mte_p)
regnum = create_feature_aarch64_mte (tdesc, regnum);
return tdesc;
}

View File

@@ -25,9 +25,12 @@
/* Create the aarch64 target description. A non zero VQ value indicates both
the presence of SVE and the Vector Quotient - the number of 128bit chunks in
an SVE Z register. HAS_PAUTH_P indicates the presence of the PAUTH
feature. */
feature.
target_desc *aarch64_create_target_description (uint64_t vq, bool has_pauth_p);
MTE_P indicates the presence of the Memory Tagging Extension feature. */
target_desc *aarch64_create_target_description (uint64_t vq, bool has_pauth_p,
bool mte_p);
/* Register numbers of various important registers.
Note that on SVE, the Z registers reuse the V register numbers and the V

View File

@@ -204,6 +204,7 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
FEATURE_XMLFILES = aarch64-core.xml \
aarch64-fpu.xml \
aarch64-pauth.xml \
aarch64-mte.xml \
arc/core-v2.xml \
arc/aux-v2.xml \
arc/core-arcompact.xml \

View File

@@ -0,0 +1,15 @@
/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
Original: aarch64-mte.xml */
#include "gdbsupport/tdesc.h"
static int
create_feature_aarch64_mte (struct target_desc *result, long regnum)
{
struct tdesc_feature *feature;
feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.mte");
tdesc_create_reg (feature, "sctlr", regnum++, 1, "mte", 64, "uint64");
tdesc_create_reg (feature, "gcr", regnum++, 1, "mte", 64, "uint64");
return regnum;
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!-- Copyright (C) 2020 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.aarch64.mte">
<reg name="sctlr" bitsize="64" type="uint64" group="mte"/>
<reg name="gcr" bitsize="64" type="uint64" group="mte"/>
</feature>

View File

@@ -147,12 +147,12 @@ get_raw_reg (const unsigned char *raw_regs, int regnum)
/* Return target_desc to use for IPA, given the tdesc index passed by
gdbserver. Index is ignored, since we have only one tdesc
at the moment. SVE and pauth not yet supported. */
at the moment. SVE, pauth and MTE not yet supported. */
const struct target_desc *
get_ipa_tdesc (int idx)
{
return aarch64_linux_read_description (0, false);
return aarch64_linux_read_description (0, false, false);
}
/* Allocate buffer for the jump pads. The branch instruction has a reach
@@ -204,6 +204,6 @@ alloc_jump_pad_buffer (size_t size)
void
initialize_low_tracepoint (void)
{
/* SVE and pauth not yet supported. */
aarch64_linux_read_description (0, false);
/* SVE, pauth and MTE not yet supported. */
aarch64_linux_read_description (0, false, false);
}

View File

@@ -642,9 +642,13 @@ aarch64_target::low_arch_setup ()
{
uint64_t vq = aarch64_sve_get_vq (tid);
unsigned long hwcap = linux_get_hwcap (8);
unsigned long hwcap2 = linux_get_hwcap2 (8);
bool pauth_p = hwcap & AARCH64_HWCAP_PACA;
/* MTE is AArch64-only. */
bool mte_p = hwcap2 & HWCAP2_MTE;
current_process ()->tdesc = aarch64_linux_read_description (vq, pauth_p);
current_process ()->tdesc
= aarch64_linux_read_description (vq, pauth_p, mte_p);
}
else
current_process ()->tdesc = aarch32_linux_read_description ();

View File

@@ -27,22 +27,22 @@
#include <inttypes.h>
/* All possible aarch64 target descriptors. */
struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/];
struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/][2 /* mte */];
/* Create the aarch64 target description. */
const target_desc *
aarch64_linux_read_description (uint64_t vq, bool pauth_p)
aarch64_linux_read_description (uint64_t vq, bool pauth_p, bool mte_p)
{
if (vq > AARCH64_MAX_SVE_VQ)
error (_("VQ is %" PRIu64 ", maximum supported value is %d"), vq,
AARCH64_MAX_SVE_VQ);
struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p];
struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p][mte_p];
if (tdesc == NULL)
{
tdesc = aarch64_create_target_description (vq, pauth_p);
tdesc = aarch64_create_target_description (vq, pauth_p, mte_p);
static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL };
static const char *expedite_regs_aarch64_sve[] = { "x29", "sp", "pc",
@@ -53,7 +53,7 @@ aarch64_linux_read_description (uint64_t vq, bool pauth_p)
else
init_target_desc (tdesc, expedite_regs_aarch64_sve);
tdesc_aarch64_list[vq][pauth_p] = tdesc;
tdesc_aarch64_list[vq][pauth_p][mte_p] = tdesc;
}
return tdesc;

View File

@@ -20,6 +20,7 @@
#ifndef GDBSERVER_LINUX_AARCH64_TDESC_H
#define GDBSERVER_LINUX_AARCH64_TDESC_H
const target_desc * aarch64_linux_read_description (uint64_t vq, bool pauth_p);
const target_desc * aarch64_linux_read_description (uint64_t vq, bool pauth_p,
bool mte_p);
#endif /* GDBSERVER_LINUX_AARCH64_TDESC_H */