X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-aarch64-tdesc.c;h=6f9b4f1efc634271c4fe27e6d3872aa6bf559ddb;hb=c5adaa1921c34d2b9711ec7cecd3cb4a253620db;hp=f433038351ec3d0ed06d210fdda8145b9f990008;hpb=190852c8ac75cb62a737c58edfadfb0e1fcef78a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-aarch64-tdesc.c b/gdb/gdbserver/linux-aarch64-tdesc.c index f433038351..6f9b4f1efc 100644 --- a/gdb/gdbserver/linux-aarch64-tdesc.c +++ b/gdb/gdbserver/linux-aarch64-tdesc.c @@ -1,6 +1,6 @@ /* GNU/Linux/aarch64 specific target description, for the remote server for GDB. - Copyright (C) 2017-2018 Free Software Foundation, Inc. + Copyright (C) 2017-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -21,22 +21,37 @@ #include "tdesc.h" #include "arch/aarch64.h" #include "linux-aarch32-low.h" +#include + +/* All possible aarch64 target descriptors. */ +struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/]; /* Create the aarch64 target description. */ const target_desc * -aarch64_linux_read_description () +aarch64_linux_read_description (uint64_t vq, bool pauth_p) { - static target_desc *aarch64_tdesc = NULL; - target_desc **tdesc = &aarch64_tdesc; + 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]; - if (*tdesc == NULL) + if (tdesc == NULL) { - *tdesc = aarch64_create_target_description (); + tdesc = aarch64_create_target_description (vq, pauth_p); static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL }; - init_target_desc (*tdesc, expedite_regs_aarch64); + static const char *expedite_regs_aarch64_sve[] = { "x29", "sp", "pc", + "vg", NULL }; + + if (vq == 0) + init_target_desc (tdesc, expedite_regs_aarch64); + else + init_target_desc (tdesc, expedite_regs_aarch64_sve); + + tdesc_aarch64_list[vq][pauth_p] = tdesc; } - return *tdesc; + return tdesc; }