Re: [PATCH] libgloss/aarch64: Add support for Armv8-R AArch64

Alex Coplan via Newlib <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Hi Richard,

On 29/09/2020 15:06, Richard Earnshaw (lists) wrote:
> On 18/09/2020 15:43, Alex Coplan wrote:
> > Hello,
> > 
> > This patch adds support for Armv8-R AArch64. We update the AArch64 CPU
> > boot code to work on Armv8-R if __ARM_ARCH_PROFILE is set to 'R'.
> > 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.
> > 
> > We also add a specs file for use with Armv8-R AArch64 models.
> > 
> > Testing:
> >  * Ran AArch64 GCC testsuite using --with-arch=armv8-r together with the
> >    new specs file and boot code in an Armv8-R AArch64 model.
> >  * Ran newlib testsuite, no regressions.
> > 
> > OK for master?
> > 
> > Thanks,
> > Alex
> > 
> > ---
> > 
> > 2020-09-18  Alex Coplan  <[email protected]>
> > 
> > libgloss/ChangeLog:
> > 
> > 	* aarch64/Makefile.in: Install new specs file.
> > 	* aarch64/cpu-init/Makefile.in: Also build boot code for Armv8-R.
> > 	* aarch64/cpu-init/rdimon-aem-el3.S: Add support for Armv8-R.
> > 	* aarch64/elf-aem-v8-r.specs: New.
> > 
> 
> The main problem I see with this is that it assumes that the compiler
> being used is *not* configured for a default CPU architecture of
> ARMv8-r.  If it is, then the normal rdimon-aem-el3.o file will in fact
> become the same as the v8-r version, which is not really what we want.

Good catch. Thanks for the review.

> 
> Perhaps, rather than hacking around the __ARM_ARCH_PROFILE setting you
> should just set things up to build the file twice, but with a different
> conventional pre-define set each time.
> 
> R.

Sounds sensible. Is the revised patch (attached) OK?

Thanks,
Alex
v2.diff (text/x-diff, 3 KB)
diff --git a/libgloss/aarch64/Makefile.in b/libgloss/aarch64/Makefile.in
index 546557e3c..b8c2ca43c 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 08aa1760f..c96f4ee0e 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 e00f0b2c8..0296a8054 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 000000000..4daeffd11
--- /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}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.