Newer
Older
minerva / Toolchain / Patches / binutils / 0001-Add-support-for-Minerva.patch
@minerva minerva on 13 Jul 10 KB Initial commit
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Daniel Bertalan <dani@danielbertalan.dev>
Date: Mon, 27 Mar 2023 19:24:04 +1100
Subject: [PATCH] Add support for Minerva

Teaches the assembler, BFD, and the linker about the Minerva target
triple.

We set '/' to not start a comment in GAS, as the QEMU port uses it for
division in constant expressions in assembly files (cf. as --divide).

`/usr/lib/Loader.so` is set as the default ELF interpreter.

On AArch64, we set `COMMONPAGESIZE` to enable RELRO support.
---
 bfd/config.bfd                       | 10 ++++++++++
 gas/config/tc-i386.c                 |  3 ++-
 gas/config/te-minerva.h             |  3 +++
 gas/configure.tgt                    |  3 +++
 ld/Makefile.am                       |  3 +++
 ld/Makefile.in                       |  6 ++++++
 ld/configure.tgt                     |  9 +++++++++
 ld/emulparams/aarch64minerva.sh     |  5 +++++
 ld/emulparams/elf64lriscvminerva.sh |  2 ++
 ld/emulparams/elf_minerva.sh        |  1 +
 ld/emulparams/elf_x86_64_minerva.sh |  2 ++
 11 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 gas/config/te-minerva.h
 create mode 100644 ld/emulparams/aarch64minerva.sh
 create mode 100644 ld/emulparams/elf64lriscvminerva.sh
 create mode 100644 ld/emulparams/elf_minerva.sh
 create mode 100644 ld/emulparams/elf_x86_64_minerva.sh

diff --git a/bfd/config.bfd b/bfd/config.bfd
index 0d7901175036952b076ce6adebdbb84eaa6c3e7b..da83aa4ec2516c092e0317a14facf6f6518d37cb 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -284,6 +284,11 @@ case "${targ}" in
     targ_selvecs="aarch64_elf64_be_vec aarch64_elf32_le_vec aarch64_elf32_be_vec arm_elf32_le_vec arm_elf32_be_vec"
     want64=true
     ;;
+  aarch64-*-minerva*)
+    targ_defvec=aarch64_elf64_le_vec
+    targ_selvecs=
+    want64=true
+    ;;
   aarch64-*-linux* | aarch64-*-netbsd* | aarch64-*-nto* | aarch64-*-gnu*)
     targ_defvec=aarch64_elf64_le_vec
     targ_selvecs="aarch64_elf64_be_vec aarch64_elf32_le_vec aarch64_elf32_be_vec arm_elf32_le_vec arm_elf32_be_vec aarch64_pei_le_vec aarch64_pe_le_vec"
@@ -735,6 +740,11 @@ case "${targ}" in
     targ_selvecs="i386_elf32_vec iamcu_elf32_vec x86_64_elf32_vec"
     want64=true
     ;;
+  x86_64-*-minerva*)
+    targ_defvec=x86_64_elf64_vec
+    targ_selvecs=i386_elf32_vec
+    want64=true
+    ;;
 #endif
   i[3-7]86-*-lynxos*)
     targ_defvec=i386_elf32_vec
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index e5988347e0a59679ea429da5aa844ec8b23a75d0..a19e434e998ef2ab3040226d1b057e997858f357 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -571,7 +571,8 @@ const char extra_symbol_chars[] = "*%-(["
      && !defined (TE_Haiku)				\
      && !defined (TE_FreeBSD)				\
      && !defined (TE_DragonFly)				\
-     && !defined (TE_NetBSD))
+     && !defined (TE_NetBSD)				\
+     && !defined (TE_Minerva))
 /* This array holds the chars that always start a comment.  If the
    pre-processor is disabled, these aren't very useful.  The option
    --divide will remove '/' from this list.  */
diff --git a/gas/config/te-minerva.h b/gas/config/te-minerva.h
new file mode 100644
index 0000000000000000000000000000000000000000..f38faf598cba7f561ed9528ee37328228ee55bdc
--- /dev/null
+++ b/gas/config/te-minerva.h
@@ -0,0 +1,3 @@
+#include "te-generic.h"
+
+#define TE_Minerva 1
diff --git a/gas/configure.tgt b/gas/configure.tgt
index 7c81bffa16bf1793357ecdf37b172fbc21b51e06..d07145ed396da716c52402a05cfb27e5ff6d2869 100644
--- a/gas/configure.tgt
+++ b/gas/configure.tgt
@@ -139,6 +139,7 @@ case ${generic_target} in
   aarch64*-*-nto*)			fmt=elf;;
   aarch64*-*-openbsd*)			fmt=elf;;
   aarch64*-*-pe* | aarch64*-*-mingw*)	fmt=coff em=pepaarch64 ;;
+  aarch64*-*-minerva*)     fmt=elf em=minerva ;;
   alpha-*-*vms*)			fmt=evax ;;
   alpha-*-osf*)				fmt=ecoff ;;
   alpha-*-linux*ecoff*)			fmt=ecoff ;;
@@ -267,6 +268,7 @@ case ${generic_target} in
   i386-*-*nt*)				fmt=coff em=pe ;;
   i386-*-rdos*)				fmt=elf ;;
   i386-*-darwin*)			fmt=macho ;;
+  i386-*-minerva)			fmt=elf em=minerva ;;
 
   ia16-*-elf*)				fmt=elf ;;
 
@@ -372,6 +374,7 @@ case ${generic_target} in
 
   pru-*-*)				fmt=elf ;;
 
+  riscv64-*-minerva*)			fmt=elf endian=little em=minerva ;;
   riscv*-*-haiku*)			fmt=elf endian=little em=haiku ;;
   riscv*-*-*)				fmt=elf ;;
 
diff --git a/ld/Makefile.am b/ld/Makefile.am
index ccff92899249fc8bca672c6f28e77ad14a55de79..797727456c6896a566d4658f2841e7a5ad0842f9 100644
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -390,6 +390,7 @@ ALL_64_EMULATION_SOURCES = \
 	eaarch64linuxb.c \
 	eaarch64nto.c \
 	eaarch64pe.c \
+	eaarch64minerva.c \
 	earm64pe.c \
 	eelf32_x86_64.c \
 	eelf32b4300.c \
@@ -447,6 +448,7 @@ ALL_64_EMULATION_SOURCES = \
 	eelf64lppc.c \
 	eelf64lppc_fbsd.c \
 	eelf64lriscv.c \
+	eelf64lriscvminerva.c \
 	eelf64lriscv_lp64.c \
 	eelf64lriscv_lp64f.c \
 	eelf64ltsmip.c \
@@ -462,6 +464,7 @@ ALL_64_EMULATION_SOURCES = \
 	eelf_x86_64_cloudabi.c \
 	eelf_x86_64_fbsd.c \
 	eelf_x86_64_haiku.c \
+	eelf_x86_64_minerva.c \
 	eelf_x86_64_sol2.c \
 	ehppa64linux.c \
 	ei386pep.c \
diff --git a/ld/Makefile.in b/ld/Makefile.in
index 3e24bd4deb26f787439c69e57f9321755f2d258a..301e6e7b77ba8893356a7d3c78f4bb38947f7d4d 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -900,6 +900,7 @@ ALL_64_EMULATION_SOURCES = \
 	eaarch64linuxb.c \
 	eaarch64nto.c \
 	eaarch64pe.c \
+	eaarch64minerva.c \
 	earm64pe.c \
 	eelf32_x86_64.c \
 	eelf32b4300.c \
@@ -957,6 +958,7 @@ ALL_64_EMULATION_SOURCES = \
 	eelf64lppc.c \
 	eelf64lppc_fbsd.c \
 	eelf64lriscv.c \
+	eelf64lriscvminerva.c \
 	eelf64lriscv_lp64.c \
 	eelf64lriscv_lp64f.c \
 	eelf64ltsmip.c \
@@ -972,6 +974,7 @@ ALL_64_EMULATION_SOURCES = \
 	eelf_x86_64_cloudabi.c \
 	eelf_x86_64_fbsd.c \
 	eelf_x86_64_haiku.c \
+	eelf_x86_64_minerva.c \
 	eelf_x86_64_sol2.c \
 	ehppa64linux.c \
 	ei386pep.c \
@@ -1284,6 +1287,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaarch64linuxb.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaarch64nto.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaarch64pe.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaarch64minerva.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaix5ppc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaix5rs6.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaixppc.Po@am__quote@
@@ -1465,6 +1469,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64lppc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64lppc_fbsd.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64lriscv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64lriscvminerva.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64lriscv_lp64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64lriscv_lp64f.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64ltsmip.Po@am__quote@
@@ -1489,6 +1494,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64_cloudabi.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64_fbsd.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64_haiku.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64_minerva.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64_sol2.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eh8300elf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eh8300elf_linux.Po@am__quote@
diff --git a/ld/configure.tgt b/ld/configure.tgt
index ea01ccf9a1b7f959b25768397057e33a990541cb..c0f81114d44aef3deccd63c6325c60fa5fe4641d 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -98,6 +98,9 @@ aarch64-*-freebsd*)	targ_emul=aarch64fbsd
 aarch64-*-fuchsia*)	targ_emul=aarch64elf
 			targ_extra_emuls="aarch64elfb armelf armelfb"
 			;;
+aarch64-*-minerva*)	targ_emul=aarch64minerva
+			targ_extra_emuls=aarch64elf
+			;;
 aarch64_be-*-linux-gnu_ilp32)
 			targ_emul=aarch64linux32b
 			targ_extra_libpath="aarch64linuxb aarch64linux aarch64linux32 armelfb_linux_eabi armelf_linux_eabi"
@@ -833,6 +836,9 @@ riscv64*-*-linux*)	targ_emul=elf64lriscv
 			targ_extra_emuls="elf64lriscv_lp64f elf64lriscv_lp64 elf32lriscv elf32lriscv_ilp32f elf32lriscv_ilp32 elf64briscv elf64briscv_lp64f elf64briscv_lp64 elf32briscv elf32briscv_ilp32f elf32briscv_ilp32"
 			targ_extra_libpath=$targ_extra_emuls
 			;;
+riscv64-*-minerva*)	targ_emul=elf64lriscvminerva
+			targ_extra_emuls=elf64lriscv
+			;;
 riscv64be*-*-*)		targ_emul=elf64briscv
 			targ_extra_emuls="elf32briscv elf64lriscv elf32lriscv"
 			targ_extra_libpath=$targ_extra_emuls
@@ -1019,6 +1025,9 @@ x86_64-*-linux-*)	targ_emul=elf_x86_64
 x86_64-*-redox*)	targ_emul=elf_x86_64
 			targ_extra_emuls=elf_i386
 			;;
+x86_64-*-minerva*)	targ_emul=elf_x86_64_minerva
+			targ_extra_emuls="elf_x86_64 elf_i386"
+			;;
 x86_64-*-solaris2*)	targ_emul=elf_x86_64_sol2
 			targ_extra_emuls="elf_x86_64 elf_i386_sol2 elf_i386_ldso elf_i386 elf_iamcu"
 			targ_extra_libpath=$targ_extra_emuls
diff --git a/ld/emulparams/aarch64minerva.sh b/ld/emulparams/aarch64minerva.sh
new file mode 100644
index 0000000000000000000000000000000000000000..23aed1440a033e2ac06536f43c1bacaf98832b92
--- /dev/null
+++ b/ld/emulparams/aarch64minerva.sh
@@ -0,0 +1,5 @@
+source_sh ${srcdir}/emulparams/aarch64elf.sh
+source_sh ${srcdir}/emulparams/elf_minerva.sh
+
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
+unset EMBEDDED
diff --git a/ld/emulparams/elf64lriscvminerva.sh b/ld/emulparams/elf64lriscvminerva.sh
new file mode 100644
index 0000000000000000000000000000000000000000..8bcbea812b49363cf4e2e94e1554998277b21cb1
--- /dev/null
+++ b/ld/emulparams/elf64lriscvminerva.sh
@@ -0,0 +1,2 @@
+source_sh ${srcdir}/emulparams/elf64lriscv.sh
+source_sh ${srcdir}/emulparams/elf_minerva.sh
diff --git a/ld/emulparams/elf_minerva.sh b/ld/emulparams/elf_minerva.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c434bacaa7fa16a9bb1c4934ad061230fbf56825
--- /dev/null
+++ b/ld/emulparams/elf_minerva.sh
@@ -0,0 +1 @@
+ELF_INTERPRETER_NAME=\"/usr/lib/Loader.so\"
diff --git a/ld/emulparams/elf_x86_64_minerva.sh b/ld/emulparams/elf_x86_64_minerva.sh
new file mode 100644
index 0000000000000000000000000000000000000000..536af1e31d761b22e3e40cafd339d5bf7a285756
--- /dev/null
+++ b/ld/emulparams/elf_x86_64_minerva.sh
@@ -0,0 +1,2 @@
+source_sh ${srcdir}/emulparams/elf_x86_64.sh
+source_sh ${srcdir}/emulparams/elf_minerva.sh