Files
binutils-gdb/gdbserver/linux-aarch64-tdesc.cc
Thiago Jung Bauermann 43af2e08dc gdbserver: aarch64: Fix expedited registers list
Since this commit:

  commit a8651ef518
  CommitDate: Fri Jun 14 14:47:38 2024 +0100

      gdb/aarch64: prevent crash from in process agent

gdbserver isn't sending expedited registers with its stop reply packets
anymore.  The problem is with how the constructor of the
expedited_registers std::vector is called:

The intent of the expedited_registers initialization in
aarch64_linux_read_description is to create a vector with capacity for 6
elements, but that's not how the std::vector constructor works.

Instead it creates a vector pre-populated with 6 elements initialized
with the default value for the type of the elements, and thus the first
6 elements are null pointers.  The actual expedited registers are added
starting at the 7th element.

This causes init_target_desc to consider that the expedite_regs list is
empty, since it stops checking at the first nullptr element.  The end
result is that gdbserver doesn't send any expedited registers to GDB in
its stop replies.

Fix by not specifying an element count when declaring the vector.

Tested for regressions on aarch64-linux-gnu native-extended-remote.

Approved-By: Andrew Burgess <aburgess@redhat.com>
2024-09-05 01:02:51 -03:00

77 lines
2.5 KiB
C++

/* GNU/Linux/aarch64 specific target description, for the remote server
for GDB.
Copyright (C) 2017-2024 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "linux-aarch64-tdesc.h"
#include "tdesc.h"
#include "arch/aarch64.h"
#include "linux-aarch32-low.h"
#include <inttypes.h>
#include <unordered_map>
/* Create the aarch64 target description. */
const target_desc *
aarch64_linux_read_description (const aarch64_features &features)
{
/* All possible aarch64 target descriptors. This map must live within
this function as the in-process-agent calls this function from a
constructor function, when globals might not yet have been
initialised. */
static std::unordered_map<aarch64_features, target_desc *> tdesc_aarch64_map;
if (features.vq > AARCH64_MAX_SVE_VQ)
error (_("VQ is %" PRIu64 ", maximum supported value is %d"), features.vq,
AARCH64_MAX_SVE_VQ);
if (features.svq > AARCH64_MAX_SVE_VQ)
error (_("Streaming svq is %" PRIu8 ", maximum supported value is %d"),
features.svq,
AARCH64_MAX_SVE_VQ);
struct target_desc *tdesc = tdesc_aarch64_map[features];
if (tdesc == NULL)
{
tdesc = aarch64_create_target_description (features);
/* Configure the expedited registers. Calling init_target_desc takes
a copy of all the strings pointed to by expedited_registers so this
vector only needs to live for the scope of this function. */
std::vector<const char *> expedited_registers;
expedited_registers.push_back ("x29");
expedited_registers.push_back ("sp");
expedited_registers.push_back ("pc");
if (features.vq > 0)
expedited_registers.push_back ("vg");
if (features.svq > 0)
expedited_registers.push_back ("svg");
expedited_registers.push_back (nullptr);
init_target_desc (tdesc, (const char **) expedited_registers.data ());
tdesc_aarch64_map[features] = tdesc;
}
return tdesc;
}