summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2021-04-25 17:36:11 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2021-04-25 17:36:11 +0200
commit9f54c2831717bc656df6e5a2fde2bf7be8e29fef (patch)
tree326308ee7850db62566bf29e91aef0ef76bfc128
parent6b4b8e405ae17d5004085df03d166cddcc99c11b (diff)
downloadplan9front-9f54c2831717bc656df6e5a2fde2bf7be8e29fef.tar.xz
bcm: try ATAGS/DTB pointer from R2 on entry
-rw-r--r--sys/src/9/bcm/armv6.s3
-rw-r--r--sys/src/9/bcm/armv7.s3
-rw-r--r--sys/src/9/bcm/bootargs.c2
-rw-r--r--sys/src/9/bcm/l.s3
-rw-r--r--sys/src/9/bcm/main.c4
-rw-r--r--sys/src/9/bcm/rebootcode.s1
6 files changed, 13 insertions, 3 deletions
diff --git a/sys/src/9/bcm/armv6.s b/sys/src/9/bcm/armv6.s
index 3eae17b83..771949e28 100644
--- a/sys/src/9/bcm/armv6.s
+++ b/sys/src/9/bcm/armv6.s
@@ -76,6 +76,9 @@ TEXT _startpg(SB), 1, $-4
MOVW $1, R1
MCR CpSC, 0, R1, C(CpSPM), C(CpSPMperf), CpSPMctl
+ /* first arg to main is saved R2 */
+ MOVW R10, R0
+
/*
* call main and loop forever if it returns
*/
diff --git a/sys/src/9/bcm/armv7.s b/sys/src/9/bcm/armv7.s
index 4f0bd2b5a..4b448b6ef 100644
--- a/sys/src/9/bcm/armv7.s
+++ b/sys/src/9/bcm/armv7.s
@@ -126,6 +126,9 @@ TEXT _startpg(SB), 1, $-4
MOVW $1, R1
MCR CpSC, 0, R1, C(CpCLD), C(CpCLDena), CpCLDenapmnc
+ /* first arg to main is saved R2 */
+ MOVW R10, R0
+
/*
* call main and loop forever if it returns
*/
diff --git a/sys/src/9/bcm/bootargs.c b/sys/src/9/bcm/bootargs.c
index b0feae75e..445e0baef 100644
--- a/sys/src/9/bcm/bootargs.c
+++ b/sys/src/9/bcm/bootargs.c
@@ -265,7 +265,7 @@ bootargsinit(uintptr pa)
uintptr len;
/*
- * kernel gets DTB/ATAGS pointer in R0 on entry
+ * kernel gets DTB/ATAGS pointer on entry
*/
if(pa != 0 && (len = cankaddr(pa)) != 0){
void *va = KADDR(pa);
diff --git a/sys/src/9/bcm/l.s b/sys/src/9/bcm/l.s
index 005f03a44..cf9c8a59c 100644
--- a/sys/src/9/bcm/l.s
+++ b/sys/src/9/bcm/l.s
@@ -10,6 +10,9 @@
* other cpus enter at cpureset in armv7.s
*/
TEXT _start(SB), 1, $-4
+ /* save R2 in extern register R10 (Mach *m) */
+ MOVW R2, R10
+
/*
* load physical base for SB addressing while mmu is off
* keep a handy zero in R0 until first function call
diff --git a/sys/src/9/bcm/main.c b/sys/src/9/bcm/main.c
index ba289ad08..d6c4acaa6 100644
--- a/sys/src/9/bcm/main.c
+++ b/sys/src/9/bcm/main.c
@@ -75,7 +75,7 @@ launchinit(void)
}
void
-main(void)
+main(uintptr arg0)
{
extern char edata[], end[];
uint fw, board;
@@ -84,7 +84,7 @@ main(void)
memset(edata, 0, end - edata); /* clear bss */
mach0init();
quotefmtinstall();
- bootargsinit(0);
+ bootargsinit(arg0);
confinit(); /* figures out amount of memory */
xinit();
uartconsinit();
diff --git a/sys/src/9/bcm/rebootcode.s b/sys/src/9/bcm/rebootcode.s
index 8ae2da2b7..796e98a46 100644
--- a/sys/src/9/bcm/rebootcode.s
+++ b/sys/src/9/bcm/rebootcode.s
@@ -84,6 +84,7 @@ dowfi:
BEQ dowfi /* if zero, wait again */
bootcpu:
+ MOVW $0, R2 /* no ATAGS/DTB pointer */
BIC $KSEGM, R8 /* entry to physical */
ORR $PHYSDRAM, R8
BL (R8)