diff options
author | benno <benno@FreeBSD.org> | 2002-07-10 12:16:48 +0000 |
---|---|---|
committer | benno <benno@FreeBSD.org> | 2002-07-10 12:16:48 +0000 |
commit | be338824525170f3928c124d0b05e5140cd0834f (patch) | |
tree | 6d23a971d428fba3571fabe55453550769a56e73 | |
parent | 1c56b713178cc6540fbe3216fcb68fd98673e200 (diff) | |
download | FreeBSD-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.S | 8 | ||||
-rw-r--r-- | sys/powerpc/aim/machdep.c | 33 | ||||
-rw-r--r-- | sys/powerpc/powerpc/locore.S | 8 | ||||
-rw-r--r-- | sys/powerpc/powerpc/locore.s | 8 | ||||
-rw-r--r-- | sys/powerpc/powerpc/machdep.c | 33 |
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); |