summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorNathan Whitehorn <nwhitehorn@FreeBSD.org>2017-11-26 03:53:20 +0000
committerNathan Whitehorn <nwhitehorn@FreeBSD.org>2017-11-26 03:53:20 +0000
commit47f69f4f2be372ec6fd3e646ca8087dc2dadd503 (patch)
tree35c9401526c2428e8c67555f75c9a9eb4c6bebef /sys
parent5e53a4f90f82c4345f277dd87cc9292f26e04a29 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/powerpc/aim/locore32.S4
-rw-r--r--sys/powerpc/aim/locore64.S4
-rw-r--r--sys/powerpc/booke/booke_machdep.c9
-rw-r--r--sys/powerpc/powerpc/machdep.c16
4 files changed, 25 insertions, 8 deletions
diff --git a/sys/powerpc/aim/locore32.S b/sys/powerpc/aim/locore32.S
index b14215cb58d3d..f911c7bafa8bb 100644
--- a/sys/powerpc/aim/locore32.S
+++ b/sys/powerpc/aim/locore32.S
@@ -79,13 +79,14 @@ __start:
/* Set up temporary stack pointer */
lwz %r1,8(%r30)
add %r1,%r1,%r30
- addi %r1,%r1,(8+TMPSTKSZ-32)
+ addi %r1,%r1,(8+TMPSTKSZ-40)
/* Relocate self */
stw %r3,16(%r1)
stw %r4,20(%r1)
stw %r5,24(%r1)
stw %r6,28(%r1)
+ stw %r7,32(%r1)
lwz %r3,0(%r30) /* _DYNAMIC in %r3 */
add %r3,%r3,%r30
@@ -99,6 +100,7 @@ __start:
lwz %r4,20(%r1)
lwz %r5,24(%r1)
lwz %r6,28(%r1)
+ lwz %r7,32(%r1)
/* MD setup */
bl powerpc_init
diff --git a/sys/powerpc/aim/locore64.S b/sys/powerpc/aim/locore64.S
index e7d27b53b4309..cd1b426abe87a 100644
--- a/sys/powerpc/aim/locore64.S
+++ b/sys/powerpc/aim/locore64.S
@@ -73,6 +73,7 @@ btext:
* r4: ignored
* r5: OF client interface pointer (or zero)
* r6: Loader metadata pointer (or zero)
+ * r7: Magic cookie (0xfb5d104d) to indicate that r6 has loader metadata
*/
.text
ASENTRY_NOPROF(__start)
@@ -108,6 +109,8 @@ ASENTRY_NOPROF(__start)
std %r4,56(%r1)
std %r5,64(%r1)
std %r6,72(%r1)
+ std %r7,80(%r1)
+
bl 1f
.llong _DYNAMIC-.
1: mflr %r3
@@ -120,6 +123,7 @@ ASENTRY_NOPROF(__start)
ld %r4,56(%r1)
ld %r5,64(%r1)
ld %r6,72(%r1)
+ ld %r7,80(%r1)
/* Begin CPU init */
mr %r4,%r2 /* Replace ignored r4 with tocbase for trap handlers */
diff --git a/sys/powerpc/booke/booke_machdep.c b/sys/powerpc/booke/booke_machdep.c
index a75b7e8056ab4..5512cc491e6d2 100644
--- a/sys/powerpc/booke/booke_machdep.c
+++ b/sys/powerpc/booke/booke_machdep.c
@@ -200,7 +200,8 @@ extern void *int_performance_counter;
("Handler " #handler " too far from interrupt vector base")); \
mtspr(ivor, (uintptr_t)(&handler) & 0xffffUL);
-uintptr_t powerpc_init(vm_offset_t fdt, vm_offset_t, vm_offset_t, void *mdp);
+uintptr_t powerpc_init(vm_offset_t fdt, vm_offset_t, vm_offset_t, void *mdp,
+ vm_offset_t mdp_cookie);
void booke_cpu_init(void);
void
@@ -346,7 +347,11 @@ booke_init(u_long arg1, u_long arg2)
break;
}
- ret = powerpc_init(dtbp, 0, 0, mdp);
+ /*
+ * Last element is a magic cookie that indicates that the metadata
+ * pointer is meaningful.
+ */
+ ret = powerpc_init(dtbp, 0, 0, mdp, (mdp == NULL) ? 0 : 0xfb5d104d);
/* Enable caches */
booke_enable_l1_cache();
diff --git a/sys/powerpc/powerpc/machdep.c b/sys/powerpc/powerpc/machdep.c
index 05736bb9efdd9..85db11ba1d5d1 100644
--- a/sys/powerpc/powerpc/machdep.c
+++ b/sys/powerpc/powerpc/machdep.c
@@ -154,7 +154,8 @@ SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size,
CTLFLAG_RD, &cacheline_size, 0, "");
-uintptr_t powerpc_init(vm_offset_t, vm_offset_t, vm_offset_t, void *);
+uintptr_t powerpc_init(vm_offset_t, vm_offset_t, vm_offset_t, void *,
+ vm_offset_t);
long Maxmem = 0;
long realmem = 0;
@@ -232,7 +233,8 @@ void aim_cpu_init(vm_offset_t toc);
void booke_cpu_init(void);
uintptr_t
-powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
+powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp,
+ vm_offset_t mdp_cookie)
{
struct pcpu *pc;
struct cpuref bsp;
@@ -251,8 +253,11 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
startkernel = __startkernel;
endkernel = __endkernel;
- /* Check for ePAPR loader, which puts a magic value into r6 */
- if (mdp == (void *)0x65504150)
+ /*
+ * If the metadata pointer cookie is not set to the magic value,
+ * the number in mdp should be treated as nonsense.
+ */
+ if (mdp_cookie != 0xfb5d104d)
mdp = NULL;
#ifdef AIM
@@ -352,7 +357,8 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
platform_probe_and_attach();
/*
- * Set up real per-cpu data.
+ * Set up per-cpu data for the BSP now that the platform can tell
+ * us which that is.
*/
if (platform_smp_get_bsp(&bsp) != 0)
bsp.cr_cpuid = 0;