From b7e90df871fe29e2c499e469aa53e5e356dbec07 Mon Sep 17 00:00:00 2001 From: Luis Machado Date: Thu, 26 Mar 2020 11:58:01 -0300 Subject: [PATCH] [Morello] Generate target descriptions based on runtime capability feature checks This patch adds code to do runtime checks for Morello, so GDB can pick the correct target description and register set. gdb/ChangeLog: 2020-10-20 Luis Machado * aarch64-linux-nat.c (aarch64_linux_nat_target::read_description): Check for HWCAP2_MORELLO. * aarch64-linux-tdep.c (aarch64_linux_core_read_description): Likewise. * aarch64-tdep.c (tdesc_aarch64_list): Add one more dimension. (aarch64_read_description): New parameter capability_p, use it to generate the proper target description. (aarch64_gdbarch_init): Update invocation of aarch64_read_description. * aarch64-tdep.h (aarch64_read_description): New parameter capability_p. * arch/aarch64.c (aarch64_create_target_description): New parameter capability_p. Use it. * arch/aarch64.h (aarch64_create_target_description): New parameter capability_p. gdbserver/ChangeLog: 2020-10-20 Luis Machado * linux-aarch64-ipa.cc (get_ipa_tdesc): Update. * linux-aarch64-low.cc (aarch64_target::low_arch_setup): Check for HWCAP2_MORELLO and use it. * linux-aarch64-tdesc.cc (tdesc_aarch64_list): Add one more dimension. (aarch64_linux_read_description): New parameter capability_p. Use it. * linux-aarch64-tdesc.h (aarch64_linux_read_description): New parameter capability_p. --- gdb/aarch64-linux-nat.c | 1 + gdb/aarch64-linux-tdep.c | 1 + gdb/aarch64-tdep.c | 5 +++++ gdb/arch/aarch64.c | 3 ++- gdb/arch/aarch64.h | 5 ++++- gdbserver/linux-aarch64-low.cc | 2 ++ 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c index 9cde72b247b..b429fa31a03 100644 --- a/gdb/aarch64-linux-nat.c +++ b/gdb/aarch64-linux-nat.c @@ -714,6 +714,7 @@ aarch64_linux_nat_target::read_description () features.pauth = hwcap & AARCH64_HWCAP_PACA; features.mte = hwcap2 & HWCAP2_MTE; features.tls = true; + features.capacity = hwcap2 & HWCAP2_MORELLO; return aarch64_read_description (features); } diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index f626d499215..f63759f98c6 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -787,6 +787,7 @@ aarch64_linux_core_read_description (struct gdbarch *gdbarch, features.pauth = hwcap & AARCH64_HWCAP_PACA; features.mte = hwcap2 & HWCAP2_MTE; features.tls = tls != nullptr; + features.capability = hwcap2 & HWCAP2_MORELLO; return aarch64_read_description (features); } diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 5f7ec0356c8..14974230f0e 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -3476,6 +3476,10 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return best_arch->gdbarch; } + /* FIXME-Morello: Put a check in place so we can determine, from ELF, if + we are dealing with a capability-enabled binary or not. */ + bool have_capability = false; + /* Ensure we always have a target descriptor, and that it is for the given VQ value. */ const struct target_desc *tdesc = info.target_desc; @@ -3483,6 +3487,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { aarch64_features features; features.vq = vq; + features.capability = have_capability; tdesc = aarch64_read_description (features); } gdb_assert (tdesc); diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c index e74dcfa4ae6..edfd8f5710f 100644 --- a/gdb/arch/aarch64.c +++ b/gdb/arch/aarch64.c @@ -61,7 +61,8 @@ aarch64_create_target_description (const aarch64_features &features) the existing target description. Figure out how to do that. Maybe replace the general purpose register description with the capability registers. */ - regnum = create_feature_aarch64_capability (tdesc.get (), regnum); + if (features.capability) + regnum = create_feature_aarch64_capability (tdesc.get (), regnum); return tdesc.release (); } diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h index 8e3fd36726a..19f418478cc 100644 --- a/gdb/arch/aarch64.h +++ b/gdb/arch/aarch64.h @@ -34,6 +34,7 @@ struct aarch64_features bool pauth = false; bool mte = false; bool tls = false; + bool capability = false; }; inline bool operator==(const aarch64_features &lhs, const aarch64_features &rhs) @@ -41,7 +42,8 @@ inline bool operator==(const aarch64_features &lhs, const aarch64_features &rhs) return lhs.vq == rhs.vq && lhs.pauth == rhs.pauth && lhs.mte == rhs.mte - && lhs.tls == rhs.tls; + && lhs.tls == rhs.tls + && lhs.capability == rhs.capability; } namespace std @@ -57,6 +59,7 @@ namespace std h = h << 1 | features.pauth; h = h << 1 | features.mte; h = h << 1 | features.tls; + h = h << 1 | features.capability; return h; } }; diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc index 1b9a1cdabba..9f7a636fc42 100644 --- a/gdbserver/linux-aarch64-low.cc +++ b/gdbserver/linux-aarch64-low.cc @@ -830,6 +830,8 @@ aarch64_target::low_arch_setup () /* A-profile MTE is 64-bit only. */ features.mte = linux_get_hwcap2 (8) & HWCAP2_MTE; features.tls = true; + /* Morello is 64-bit only. */ + features.capability = linux_get_hwcap2 (8) & HWCAP2_MORELLO; current_process ()->tdesc = aarch64_linux_read_description (features); -- 2.47.2