aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/elfnn-aarch64.c6
-rw-r--r--bfd/elfxx-aarch64.h3
-rw-r--r--binutils/readelf.c1
-rw-r--r--gdb/MAINTAINERS1
-rw-r--r--include/elf/aarch64.h1
-rw-r--r--ld/emultempl/aarch64elf.em5
-rw-r--r--ld/ld.texi5
-rw-r--r--ld/testsuite/ld-aarch64/aarch64-elf.exp1
-rw-r--r--ld/testsuite/ld-aarch64/dt-memtag-stack.d7
9 files changed, 30 insertions, 0 deletions
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 0e9e22e..9e98215d 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -9786,6 +9786,12 @@ elfNN_aarch64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
&& !add_dynamic_entry (DT_AARCH64_MEMTAG_MODE,
htab->memtag_opts.memtag_mode == AARCH64_MEMTAG_MODE_ASYNC))
return false;
+
+ if (is_aarch64_elf (output_bfd)
+ && htab->memtag_opts.memtag_stack == 1
+ && !add_dynamic_entry (DT_AARCH64_MEMTAG_STACK,
+ htab->memtag_opts.memtag_stack == 1))
+ return false;
}
#undef add_dynamic_entry
diff --git a/bfd/elfxx-aarch64.h b/bfd/elfxx-aarch64.h
index 66c1f48..bd3642c 100644
--- a/bfd/elfxx-aarch64.h
+++ b/bfd/elfxx-aarch64.h
@@ -147,6 +147,9 @@ struct aarch64_memtag_opts
{
/* Mode of MTE operation. */
aarch64_memtag_mode_type memtag_mode;
+
+ /* Whether stack accesses use MTE insns. */
+ unsigned int memtag_stack;
};
typedef struct aarch64_memtag_opts aarch64_memtag_opts;
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 0d8daf3..cfccdd2 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -2588,6 +2588,7 @@ get_aarch64_dynamic_type (unsigned long type)
case DT_AARCH64_PAC_PLT: return "AARCH64_PAC_PLT";
case DT_AARCH64_VARIANT_PCS: return "AARCH64_VARIANT_PCS";
case DT_AARCH64_MEMTAG_MODE: return "AARCH64_MEMTAG_MODE";
+ case DT_AARCH64_MEMTAG_STACK: return "AARCH64_MEMTAG_STACK";
default:
return NULL;
diff --git a/gdb/MAINTAINERS b/gdb/MAINTAINERS
index 79b2233..9284c46 100644
--- a/gdb/MAINTAINERS
+++ b/gdb/MAINTAINERS
@@ -608,6 +608,7 @@ Raoul Gough RaoulGough@yahoo.co.uk
Anthony Green green@redhat.com
Matthew Green mrg@eterna.com.au
Matthew Gretton-Dann matthew.gretton-dann@arm.com
+Aaron Griffith aargri@gmail.com
Maxim Grigoriev maxim2405@gmail.com
Jerome Guitton guitton@act-europe.fr
Alexandra Hájková ahajkova@redhat.com
diff --git a/include/elf/aarch64.h b/include/elf/aarch64.h
index 747d8dc..74bd7b4 100644
--- a/include/elf/aarch64.h
+++ b/include/elf/aarch64.h
@@ -53,6 +53,7 @@
#define DT_AARCH64_PAC_PLT (DT_LOPROC + 3)
#define DT_AARCH64_VARIANT_PCS (DT_LOPROC + 5)
#define DT_AARCH64_MEMTAG_MODE (DT_LOPROC + 9)
+#define DT_AARCH64_MEMTAG_STACK (DT_LOPROC + 12)
/* AArch64-specific values for st_other. */
#define STO_AARCH64_VARIANT_PCS 0x80 /* Symbol may follow different call
diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em
index d7e4eb7..66eaf1c 100644
--- a/ld/emultempl/aarch64elf.em
+++ b/ld/emultempl/aarch64elf.em
@@ -44,6 +44,7 @@ static aarch64_protection_opts sw_protections = {
static aarch64_memtag_opts memtag_opts = {
.memtag_mode = AARCH64_MEMTAG_MODE_NONE,
+ .memtag_stack = 0,
};
#define COMPILE_TIME_STRLEN(s) \
@@ -557,6 +558,8 @@ PARSE_AND_LIST_OPTIONS='
sync: Enable precise exceptions when mismatched address and\n\
allocation tags detected on load/store operations.\n\
async: Enable imprecise exceptions.\n"));
+ fprintf (file, _("\
+ -z memtag-stack Mark program stack with MTE protection.\n"));
'
PARSE_AND_LIST_ARGS_CASE_Z_AARCH64='
@@ -574,6 +577,8 @@ PARSE_AND_LIST_ARGS_CASE_Z_AARCH64='
{}
else if (aarch64_parse_memtag_mode_option (optarg))
{}
+ else if (strcmp (optarg, "memtag-stack") == 0)
+ memtag_opts.memtag_stack = 1;
'
PARSE_AND_LIST_ARGS_CASE_Z="$PARSE_AND_LIST_ARGS_CASE_Z $PARSE_AND_LIST_ARGS_CASE_Z_AARCH64"
diff --git a/ld/ld.texi b/ld/ld.texi
index f5350e7..413335a 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -8384,6 +8384,11 @@ implies precise exceptions, with the runtime providing the exact
instruction where the fault occurred, and the exact faulting address.
The @samp{async} mode implies imprecise exceptions.
+@kindex -z memtag-stack
+@cindex Mark program stack for MTE protection
+The @samp{-z memtag-stack} specifies that output object uses MTE
+instructions for stack memory usage.
+
@ifclear GENERIC
@lowersections
@end ifclear
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 56e68c5..8d56beb 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -378,6 +378,7 @@ run_dump_test_lp64 "variant_pcs-now"
run_dump_test_lp64 "mte-tagged-frame"
run_dump_test_lp64 "dt-memtag-mode"
+run_dump_test_lp64 "dt-memtag-stack"
set aarch64elflinktests {
{"ld-aarch64/so with global symbol" "-shared" "" "" {copy-reloc-so.s}
diff --git a/ld/testsuite/ld-aarch64/dt-memtag-stack.d b/ld/testsuite/ld-aarch64/dt-memtag-stack.d
new file mode 100644
index 0000000..242f61f
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/dt-memtag-stack.d
@@ -0,0 +1,7 @@
+#source: dt-memtag.s
+#ld: -shared -z memtag-stack
+#readelf: -d
+
+#...
+ 0x000000007000000c \(AARCH64_MEMTAG_STACK\) 0x1
+#...