summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbenno <benno@FreeBSD.org>2002-07-10 12:16:48 +0000
committerbenno <benno@FreeBSD.org>2002-07-10 12:16:48 +0000
commitbe338824525170f3928c124d0b05e5140cd0834f (patch)
tree6d23a971d428fba3571fabe55453550769a56e73
parent1c56b713178cc6540fbe3216fcb68fd98673e200 (diff)
downloadFreeBSD-src-be338824525170f3928c124d0b05e5140cd0834f.zip
FreeBSD-src-be338824525170f3928c124d0b05e5140cd0834f.tar.gz
- Make sure we don't trample our metadata pointer in our initial bootstrap.
- Load metadata parameters.
-rw-r--r--sys/powerpc/aim/locore.S8
-rw-r--r--sys/powerpc/aim/machdep.c33
-rw-r--r--sys/powerpc/powerpc/locore.S8
-rw-r--r--sys/powerpc/powerpc/locore.s8
-rw-r--r--sys/powerpc/powerpc/machdep.c33
5 files changed, 84 insertions, 6 deletions
diff --git a/sys/powerpc/aim/locore.S b/sys/powerpc/aim/locore.S
index 7e51a51..cafdeab 100644
--- a/sys/powerpc/aim/locore.S
+++ b/sys/powerpc/aim/locore.S
@@ -153,6 +153,10 @@ __start:
mtdbatu 0,9
isync
+ /* Save the argument pointer and length */
+ mr 20,6
+ mr 21,7
+
lis 8,openfirmware_entry@ha
stw 5,openfirmware_entry@l(8) /* save client interface handler */
mr 3,5
@@ -174,6 +178,10 @@ __start:
lis 3,kernel_text@ha
addi 3,3,kernel_text@l
+ /* Restore the argument pointer and length */
+ mr 6,20
+ mr 7,21
+
bl powerpc_init
bl mi_startup
b OF_exit
diff --git a/sys/powerpc/aim/machdep.c b/sys/powerpc/aim/machdep.c
index 38431d7..7a77124 100644
--- a/sys/powerpc/aim/machdep.c
+++ b/sys/powerpc/aim/machdep.c
@@ -100,6 +100,7 @@ static const char rcsid[] =
#include <machine/bat.h>
#include <machine/clock.h>
#include <machine/md_var.h>
+#include <machine/metadata.h>
#include <machine/reg.h>
#include <machine/fpu.h>
#include <machine/vmparam.h>
@@ -137,7 +138,7 @@ void *ksym_start, *ksym_end;
static void cpu_startup(void *);
SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL)
-void powerpc_init(u_int, u_int, u_int, char *);
+void powerpc_init(u_int, u_int, u_int, void *);
int save_ofw_mapping(void);
int restore_ofw_mapping(void);
@@ -335,10 +336,29 @@ extern ipkdblow, ipkdbsize;
#endif
void
-powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
+powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
{
struct pcpu *pc;
- vm_offset_t off;
+ vm_offset_t end, off;
+ void *kmdp;
+
+ end = 0;
+ kmdp = NULL;
+
+ /*
+ * Parse metadata if present and fetch parameters. Must be done
+ * before console is inited so cninit gets the right value of
+ * boothowto.
+ */
+ if (mdp != NULL) {
+ preload_metadata = mdp;
+ kmdp = preload_search_by_type("elf kernel");
+ if (kmdp != NULL) {
+ boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
+ kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
+ end = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
+ }
+ }
/*
* Initialize the console before printing anything.
@@ -346,6 +366,13 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
cninit();
/*
+ * Complain if there is no metadata.
+ */
+ if (mdp == NULL || kmdp == NULL) {
+ printf("powerpc_init: no loader metadata.\n");
+ }
+
+ /*
* XXX: Initialize the interrupt tables.
*/
bcopy(&trapcode, (void *)EXC_DECR, (size_t)&trapsize);
diff --git a/sys/powerpc/powerpc/locore.S b/sys/powerpc/powerpc/locore.S
index 7e51a51..cafdeab 100644
--- a/sys/powerpc/powerpc/locore.S
+++ b/sys/powerpc/powerpc/locore.S
@@ -153,6 +153,10 @@ __start:
mtdbatu 0,9
isync
+ /* Save the argument pointer and length */
+ mr 20,6
+ mr 21,7
+
lis 8,openfirmware_entry@ha
stw 5,openfirmware_entry@l(8) /* save client interface handler */
mr 3,5
@@ -174,6 +178,10 @@ __start:
lis 3,kernel_text@ha
addi 3,3,kernel_text@l
+ /* Restore the argument pointer and length */
+ mr 6,20
+ mr 7,21
+
bl powerpc_init
bl mi_startup
b OF_exit
diff --git a/sys/powerpc/powerpc/locore.s b/sys/powerpc/powerpc/locore.s
index 7e51a51..cafdeab 100644
--- a/sys/powerpc/powerpc/locore.s
+++ b/sys/powerpc/powerpc/locore.s
@@ -153,6 +153,10 @@ __start:
mtdbatu 0,9
isync
+ /* Save the argument pointer and length */
+ mr 20,6
+ mr 21,7
+
lis 8,openfirmware_entry@ha
stw 5,openfirmware_entry@l(8) /* save client interface handler */
mr 3,5
@@ -174,6 +178,10 @@ __start:
lis 3,kernel_text@ha
addi 3,3,kernel_text@l
+ /* Restore the argument pointer and length */
+ mr 6,20
+ mr 7,21
+
bl powerpc_init
bl mi_startup
b OF_exit
diff --git a/sys/powerpc/powerpc/machdep.c b/sys/powerpc/powerpc/machdep.c
index 38431d7..7a77124 100644
--- a/sys/powerpc/powerpc/machdep.c
+++ b/sys/powerpc/powerpc/machdep.c
@@ -100,6 +100,7 @@ static const char rcsid[] =
#include <machine/bat.h>
#include <machine/clock.h>
#include <machine/md_var.h>
+#include <machine/metadata.h>
#include <machine/reg.h>
#include <machine/fpu.h>
#include <machine/vmparam.h>
@@ -137,7 +138,7 @@ void *ksym_start, *ksym_end;
static void cpu_startup(void *);
SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL)
-void powerpc_init(u_int, u_int, u_int, char *);
+void powerpc_init(u_int, u_int, u_int, void *);
int save_ofw_mapping(void);
int restore_ofw_mapping(void);
@@ -335,10 +336,29 @@ extern ipkdblow, ipkdbsize;
#endif
void
-powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
+powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
{
struct pcpu *pc;
- vm_offset_t off;
+ vm_offset_t end, off;
+ void *kmdp;
+
+ end = 0;
+ kmdp = NULL;
+
+ /*
+ * Parse metadata if present and fetch parameters. Must be done
+ * before console is inited so cninit gets the right value of
+ * boothowto.
+ */
+ if (mdp != NULL) {
+ preload_metadata = mdp;
+ kmdp = preload_search_by_type("elf kernel");
+ if (kmdp != NULL) {
+ boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
+ kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
+ end = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
+ }
+ }
/*
* Initialize the console before printing anything.
@@ -346,6 +366,13 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
cninit();
/*
+ * Complain if there is no metadata.
+ */
+ if (mdp == NULL || kmdp == NULL) {
+ printf("powerpc_init: no loader metadata.\n");
+ }
+
+ /*
* XXX: Initialize the interrupt tables.
*/
bcopy(&trapcode, (void *)EXC_DECR, (size_t)&trapsize);
OpenPOWER on IntegriCloud