svn commit: r264897 - head/sys/mips/beri
Brooks Davis
brooks at FreeBSD.org
Thu Apr 24 22:28:53 UTC 2014
Author: brooks
Date: Thu Apr 24 22:28:53 2014
New Revision: 264897
URL: http://svnweb.freebsd.org/changeset/base/264897
Log:
Merge from CheriBSD:
commit 003649d9622ce252a2794ae5891ee7e7c209caca
Author: Robert N. M. Watson <robert.watson at cl.cam.ac.uk>
Date: Wed Feb 5 18:32:09 2014 +0000
Teach the FreeBSD/beri boot to "auto-detect" whether argument 4 (a3) is a
memory size of pointer to a struct bootinfo * by looking at its value and
seeing whether it is pointer-like. If a pointer, assume it's a bootinfo
and extract memsize from it instead; otherwise, use it as memsize directly.
This allows kernels to support bootinfo being passed by loader (and boot2)
while still supporting older Miniboot setups.
commit f7045af9a1e92b6bd92541fe5d25abf66d824e8f
Author: Robert N. M. Watson <robert.watson at cl.cam.ac.uk>
Date: Thu Feb 6 13:45:34 2014 +0000
When the module metadata pointer is available from loader, use it in the
kernel.
commit 52e0e1ff2cba9dfcfab9e1d0a31fb7fdf7317450
Author: Robert N. M. Watson <robert.watson at cl.cam.ac.uk>
Date: Thu Feb 6 19:57:48 2014 +0000
In the BERI kernel boot code, extract 'boothowto' (which includes boot flags
such as '-s') and 'envp' from passed module data. Booting to single-user
mode using boot flags now works.
Sponsored by: DARPA, AFRL
Modified:
head/sys/mips/beri/beri_machdep.c
Modified: head/sys/mips/beri/beri_machdep.c
==============================================================================
--- head/sys/mips/beri/beri_machdep.c Thu Apr 24 21:18:29 2014 (r264896)
+++ head/sys/mips/beri/beri_machdep.c Thu Apr 24 22:28:53 2014 (r264897)
@@ -1,6 +1,6 @@
/*-
* Copyright (c) 2006 Wojciech A. Koszek <wkoszek at FreeBSD.org>
- * Copyright (c) 2012 Robert N. M. Watson
+ * Copyright (c) 2012-2014 Robert N. M. Watson
* All rights reserved.
*
* This software was developed by SRI International and the University of
@@ -65,6 +65,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_object.h>
#include <vm/vm_page.h>
+#include <machine/bootinfo.h>
#include <machine/clock.h>
#include <machine/cpu.h>
#include <machine/cpuregs.h>
@@ -131,60 +132,19 @@ platform_reset(void)
__asm__ __volatile("wait");
}
-#ifdef FDT
-/* Parse cmd line args as env - copied from xlp_machdep. */
-/* XXX-BZ this should really be centrally provided for all (boot) code. */
-static void
-_parse_bootargs(char *cmdline)
-{
- char *n, *v;
-
- while ((v = strsep(&cmdline, " \n")) != NULL) {
- if (*v == '\0')
- continue;
- if (*v == '-') {
- while (*v != '\0') {
- v++;
- switch (*v) {
- case 'a': boothowto |= RB_ASKNAME; break;
- /* Someone should simulate that ;-) */
- case 'C': boothowto |= RB_CDROM; break;
- case 'd': boothowto |= RB_KDB; break;
- case 'D': boothowto |= RB_MULTIPLE; break;
- case 'm': boothowto |= RB_MUTE; break;
- case 'g': boothowto |= RB_GDB; break;
- case 'h': boothowto |= RB_SERIAL; break;
- case 'p': boothowto |= RB_PAUSE; break;
- case 'r': boothowto |= RB_DFLTROOT; break;
- case 's': boothowto |= RB_SINGLE; break;
- case 'v': boothowto |= RB_VERBOSE; break;
- }
- }
- } else {
- n = strsep(&v, "=");
- if (v == NULL)
- setenv(n, "1");
- else
- setenv(n, v);
- }
- }
-}
-#endif
-
void
platform_start(__register_t a0, __register_t a1, __register_t a2,
__register_t a3)
{
+ struct bootinfo *bootinfop;
vm_offset_t kernend;
uint64_t platform_counter_freq;
int argc = a0;
char **argv = (char **)a1;
char **envp = (char **)a2;
- unsigned int memsize = a3;
+ long memsize;
#ifdef FDT
- char buf[2048]; /* early stack supposedly big enough */
vm_offset_t dtbp;
- phandle_t chosen;
void *kmdp;
#endif
int i;
@@ -197,6 +157,25 @@ platform_start(__register_t a0, __regist
mips_pcpu0_init();
+ /*
+ * Over time, we've changed out boot-time binary interface for the
+ * kernel. Miniboot simply provides a 'memsize' in a3, whereas the
+ * FreeBSD boot loader provides a 'bootinfo *' in a3. While slightly
+ * grody, we support both here by detecting 'pointer-like' values in
+ * a3 and assuming physical memory can never be that back.
+ *
+ * XXXRW: Pull more values than memsize out of bootinfop -- e.g.,
+ * module information.
+ */
+ if (a3 >= 0x9800000000000000ULL) {
+ bootinfop = (void *)a3;
+ memsize = bootinfop->bi_memsize;
+ preload_metadata = (caddr_t)bootinfop->bi_modulep;
+ } else {
+ bootinfop = NULL;
+ memsize = a3;
+ }
+
#ifdef FDT
/*
* Find the dtb passed in by the boot loader (currently fictional).
@@ -222,14 +201,13 @@ platform_start(__register_t a0, __regist
while (1);
if (OF_init((void *)dtbp) != 0)
while (1);
+#endif
/*
- * Get bootargs from FDT if specified.
+ * Configure more boot-time parameters passed in by loader.
*/
- chosen = OF_finddevice("/chosen");
- if (OF_getprop(chosen, "bootargs", buf, sizeof(buf)) != -1)
- _parse_bootargs(buf);
-#endif
+ boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
+ kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
/*
* XXXRW: We have no way to compare wallclock time to cycle rate on
@@ -252,7 +230,10 @@ platform_start(__register_t a0, __regist
for (i = 0; envp[i]; i += 2)
printf("\t%s = %s\n", envp[i], envp[i+1]);
- printf("memsize = %08x\n", memsize);
+ if (bootinfop != NULL)
+ printf("bootinfo found at %p\n", bootinfop);
+
+ printf("memsize = %p\n", (void *)memsize);
}
realmem = btoc(memsize);
More information about the svn-src-all
mailing list