diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc index a2588a6e2a9..d326341e63a 100644 --- a/gdbserver/linux-aarch64-low.cc +++ b/gdbserver/linux-aarch64-low.cc @@ -45,6 +45,7 @@ #include "linux-aarch32-tdesc.h" #include "linux-aarch64-tdesc.h" #include "nat/aarch64-fpmr-linux.h" +#include "nat/aarch64-poe-linux.h" #include "nat/aarch64-gcs-linux.h" #include "nat/aarch64-mte-linux-ptrace.h" #include "nat/aarch64-scalable-linux-ptrace.h" @@ -250,6 +251,26 @@ aarch64_store_fpregset (struct regcache *regcache, const void *buf) supply_register (regcache, AARCH64_FPCR_REGNUM, ®set->fpcr); } +/* Fill BUF with the POE (POR_EL0) register set from the regcache. */ + +static void +aarch64_fill_por_el0_regset (struct regcache *regcache, void *buf) +{ + uint64_t *poe = (uint64_t *) buf; + int poe_regnum = find_regno (regcache->tdesc, "por_el0"); + collect_register (regcache, poe_regnum, poe); +} + +/* Store the POE (POR_EL0) register set to regcache. */ + +static void +aarch64_store_por_el0_regset (struct regcache *regcache, const void *buf) +{ + uint64_t *poe = (uint64_t *) buf; + int poe_regnum = find_regno (regcache->tdesc, "por_el0"); + supply_register (regcache, poe_regnum, poe); +} + /* Fill BUF with the FPMR register set from the regcache. */ static void @@ -901,6 +922,10 @@ static struct regset_info aarch64_regsets[] = { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_FPMR, 0, OPTIONAL_REGS, aarch64_fill_fpmr_regset, aarch64_store_fpmr_regset }, + /* POE register (POR_EL0). */ + { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_POE, + 0, OPTIONAL_REGS, + aarch64_fill_por_el0_regset, aarch64_store_por_el0_regset }, /* TLS register. */ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TLS, 0, OPTIONAL_REGS, @@ -980,6 +1005,10 @@ aarch64_adjust_register_sets (const struct aarch64_features &features) if (features.fpmr) regset->size = sizeof (uint64_t); break; + case NT_ARM_POE: + if (features.poe) + regset->size = sizeof (uint64_t); + break; default: gdb_assert_not_reached ("Unknown register set found."); } @@ -1010,6 +1039,7 @@ aarch64_target::low_arch_setup () features.tls = aarch64_tls_register_count (tid); features.gcs = features.gcs_linux = linux_get_hwcap (pid, 8) & HWCAP_GCS; features.fpmr = linux_get_hwcap2 (pid, 8) & HWCAP2_FPMR; + features.poe = linux_get_hwcap2 (pid, 8) & HWCAP2_POE; /* Scalable Matrix Extension feature and size check. */ if (linux_get_hwcap2 (pid, 8) & HWCAP2_SME)