Module Name:    src
Committed By:   ryo
Date:           Tue Aug 23 05:29:44 UTC 2022

Modified Files:
        src/sys/arch/aarch64/aarch64: start.S

Log Message:
Align the loaded kernel image to 2Mbytes, if necessary.

It appears that there are bootloaders that cannot specify the load address or 
ignore it.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/aarch64/aarch64/start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/aarch64/start.S
diff -u src/sys/arch/aarch64/aarch64/start.S:1.11 src/sys/arch/aarch64/aarch64/start.S:1.12
--- src/sys/arch/aarch64/aarch64/start.S:1.11	Tue Sep 15 09:28:20 2020
+++ src/sys/arch/aarch64/aarch64/start.S	Tue Aug 23 05:29:44 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: start.S,v 1.11 2020/09/15 09:28:20 ryo Exp $	*/
+/*	$NetBSD: start.S,v 1.12 2022/08/23 05:29:44 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -33,12 +33,13 @@
 #include <aarch64/asm.h>
 #include "assym.h"
 
-RCSID("$NetBSD: start.S,v 1.11 2020/09/15 09:28:20 ryo Exp $")
+RCSID("$NetBSD: start.S,v 1.12 2022/08/23 05:29:44 ryo Exp $")
 
 /*
  * Padding at start of kernel image to make room for 64-byte header
  * (non-ELF booting)
  */
+.header:
 	.space	64, 0x0
 
 /*
@@ -46,6 +47,40 @@ RCSID("$NetBSD: start.S,v 1.11 2020/09/1
  */
 	.global start
 start:
+	/* DON'T CLOBBER X0-X3 REGISTERS. THEY ARE UBOOT ARGUMENTS */
+
+	/*
+	 * Relocate to L2_SIZE(2Mbyte) align if necessary
+	 *
+	 * x8 = currently loaded address
+	 * x9 = (x8 + L2_SIZE - 1) & -L2_SIZE = new (aligned) loaded address
+	 */
+	adrl	x8, .header
+	mov	x9, #(L2_SIZE-1)
+	add	x9, x9, x8
+	and	x9, x9, #-L2_SIZE
+	cmp	x8, x9
+	b.eq	9f
+
+	/* x10 = size = (_edata - __kernel_text) */
+	adrl	x10, _edata
+	adrl	x11, __kernel_text
+	sub	x10, x10, x11
+
+	/* do memmove(x9, x8, x10) */
+	add	x8, x8, x10
+	add	x13, x9, x10
+1:
+	ldp	x11, x12, [x8, #-16]!
+	stp	x11, x12, [x13, #-16]!
+	cmp	x13, x9
+	b.hi	1b
+
+	/* jump to new (aligned) loaded address */
+	add	x9, x9, #(start - .header)	/* skip header */
+	br	x9
+9:
+
 	mrs	x8, CurrentEL
 	lsr	x8, x8, #2
 	cmp	x8, #0x2

Reply via email to