aboutsummaryrefslogtreecommitdiff
path: root/libgloss/aarch64
diff options
context:
space:
mode:
authorAlex Coplan via Newlib <newlib@sourceware.org>2020-09-29 17:27:18 +0100
committerRichard Earnshaw <rearnsha@arm.com>2020-09-30 11:08:46 +0100
commit63a901705ee7e720820539c8732caeeb970f77e4 (patch)
tree831aed471b326fa07f84f4f406ac3d8e4cd04868 /libgloss/aarch64
parentc5bdf60ac46401a51a7e974333d9622966e22d67 (diff)
downloadnewlib-63a901705ee7e720820539c8732caeeb970f77e4.zip
newlib-63a901705ee7e720820539c8732caeeb970f77e4.tar.gz
newlib-63a901705ee7e720820539c8732caeeb970f77e4.tar.bz2
libgloss: aarch64: Add support for Armv8-R AArch64
This patch adds support for Armv8-R AArch64. Armv8-R AArch64 has no EL3, so we don't set vbar_el3, and adjust the code to set up the MPU for Armv8-R. So build a different flavour of the startup code to support that. We also add a specs file that uses this alternative startup code which can be used with Armv8-R AArch64 models.
Diffstat (limited to 'libgloss/aarch64')
-rw-r--r--libgloss/aarch64/Makefile.in3
-rw-r--r--libgloss/aarch64/cpu-init/Makefile.in8
-rw-r--r--libgloss/aarch64/cpu-init/rdimon-aem-el3.S11
-rw-r--r--libgloss/aarch64/elf-aem-v8-r.specs20
4 files changed, 38 insertions, 4 deletions
diff --git a/libgloss/aarch64/Makefile.in b/libgloss/aarch64/Makefile.in
index 546557e..b8c2ca4 100644
--- a/libgloss/aarch64/Makefile.in
+++ b/libgloss/aarch64/Makefile.in
@@ -85,7 +85,8 @@ RDIMON_BSP = librdimon${${MULTILIBNAME}}.a
RDIMON_OBJS = $(patsubst %,rdimon-%,$(OBJS))
RDIMON_SCRIPTS = rdimon${${MULTILIBNAME}}.specs \
aem-ve${${MULTILIBNAME}}.specs \
- aem-validation${${MULTILIBNAME}}.specs
+ aem-validation${${MULTILIBNAME}}.specs \
+ aem-v8-r${${MULTILIBNAME}}.specs
RDIMON_INSTALL = install-rdimon
CFLAGS = -g
diff --git a/libgloss/aarch64/cpu-init/Makefile.in b/libgloss/aarch64/cpu-init/Makefile.in
index 08aa176..c96f4ee 100644
--- a/libgloss/aarch64/cpu-init/Makefile.in
+++ b/libgloss/aarch64/cpu-init/Makefile.in
@@ -62,7 +62,7 @@ AR = @AR@
LD = @LD@
RANLIB = @RANLIB@
-CPU_INIT_OBJS = rdimon-aem-el3.o
+CPU_INIT_OBJS = rdimon-aem-el3.o rdimon-aem-v8-r.o
CPU_INIT_INSTALL = install-cpu-init
CFLAGS = -g
@@ -79,10 +79,12 @@ all: ${CPU_INIT_OBJS}
.PHONY: test
test:
-# Static pattern rule for assembling cpu init files to object files.
-${CPU_INIT_OBJS}: %.o: %.S
+rdimon-aem-el3.o : rdimon-aem-el3.S
$(CC) $(CFLAGS_FOR_TARGET) $(CFLAGS) $(INCLUDES) -DARM_RDI_MONITOR -o $@ -c $<
+rdimon-aem-v8-r.o : rdimon-aem-el3.S
+ $(CC) $(CFLAGS_FOR_TARGET) $(CFLAGS) $(INCLUDES) -DARM_RDI_MONITOR -DBUILD_FOR_R_PROFILE -o $@ -c $<
+
clean mostlyclean:
rm -f a.out core *.i *.o *-test *.srec *.dis *.x
diff --git a/libgloss/aarch64/cpu-init/rdimon-aem-el3.S b/libgloss/aarch64/cpu-init/rdimon-aem-el3.S
index e00f0b2..0296a80 100644
--- a/libgloss/aarch64/cpu-init/rdimon-aem-el3.S
+++ b/libgloss/aarch64/cpu-init/rdimon-aem-el3.S
@@ -43,7 +43,9 @@ _init_vectors:
/* Installs a table of exception vectors to catch and handle all
exceptions by terminating the process with a diagnostic. */
adr x0, vectors
+#ifndef BUILD_FOR_R_PROFILE
msr vbar_el3, x0
+#endif
msr vbar_el2, x0
msr vbar_el1, x0
ret
@@ -110,6 +112,14 @@ vectors:
.text
.align 2
_flat_map:
+#ifdef BUILD_FOR_R_PROFILE
+ mrs x0, sctlr_el2
+ orr x0, x0, #1 // SCTLR_EL2.M (enable MPU)
+ orr x0, x0, #(1 << 17) // SCTLR_EL2.BR (background regions)
+ msr sctlr_el2, x0
+ isb
+ ret
+#else
/* Page table setup (identity mapping). */
adrp x0, ttb
add x0, x0, :lo12:ttb
@@ -173,6 +183,7 @@ _flat_map:
isb
.Lnosve:
ret
+#endif
.data
.align 12
diff --git a/libgloss/aarch64/elf-aem-v8-r.specs b/libgloss/aarch64/elf-aem-v8-r.specs
new file mode 100644
index 0000000..4daeffd
--- /dev/null
+++ b/libgloss/aarch64/elf-aem-v8-r.specs
@@ -0,0 +1,20 @@
+# elf-aem-v8-r.specs
+#
+# Spec file for AArch64 baremetal newlib, libgloss on Armv8-R with version 2 of
+# AngelAPI semi-hosting.
+
+%rename link old_link
+
+*link:
+-Ttext-segment 0x10000 %(old_link)
+
+%rename lib libc
+
+*libgloss:
+-lrdimon
+
+*lib:
+cpu-init/rdimon-aem-v8-r.o%s --start-group %(libc) %(libgloss) --end-group
+
+*startfile:
+crti%O%s crtbegin%O%s %{!pg:rdimon-crt0%O%s} %{pg:rdimon-crt0%O%s}