Date: Wed, 31 Oct 2012 21:24:31 +0000 (UTC) From: "Cherry G. Mathew" <cherry@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r242414 - projects/amd64_xen_pv/sys/amd64/xen Message-ID: <201210312124.q9VLOVRB033998@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: cherry Date: Wed Oct 31 21:24:31 2012 New Revision: 242414 URL: http://svn.freebsd.org/changeset/base/242414 Log: Obtain kernel boot parameters and environment from xen. Modified: projects/amd64_xen_pv/sys/amd64/xen/machdep.c Modified: projects/amd64_xen_pv/sys/amd64/xen/machdep.c ============================================================================== --- projects/amd64_xen_pv/sys/amd64/xen/machdep.c Wed Oct 31 21:21:08 2012 (r242413) +++ projects/amd64_xen_pv/sys/amd64/xen/machdep.c Wed Oct 31 21:24:31 2012 (r242414) @@ -301,6 +301,55 @@ void xen_set_hypercall_page(vm_paddr_t); extern char hypercall_page[]; /* locore.s */ extern uint64_t xenstack; /* start of Xen provided stack */ +/* + * Modify the cmd_line by converting ',' to NULLs so that it is in a format + * suitable for the static env vars. + * XXX: nicked from, unify with i386/xen_machdep.c + */ +static char * +xen_setbootenv(char *cmd_line) +{ + char *cmd_line_next; + + /* Skip leading spaces */ + for (; *cmd_line == ' '; cmd_line++); + + printk("xen_setbootenv(): cmd_line='%s'\n", cmd_line); + + for (cmd_line_next = cmd_line; strsep(&cmd_line_next, ",") != NULL;); + return cmd_line; +} + +static struct +{ + const char *ev; + int mask; +} howto_names[] = { + {"boot_askname", RB_ASKNAME}, + {"boot_single", RB_SINGLE}, + {"boot_nosync", RB_NOSYNC}, + {"boot_halt", RB_ASKNAME}, + {"boot_serial", RB_SERIAL}, + {"boot_cdrom", RB_CDROM}, + {"boot_gdb", RB_GDB}, + {"boot_gdb_pause", RB_RESERVED1}, + {"boot_verbose", RB_VERBOSE}, + {"boot_multicons", RB_MULTIPLE}, + {NULL, 0} +}; + +static int +xen_boothowto(char *envp) +{ + int i, howto = 0; + + /* get equivalents from the environment */ + for (i = 0; howto_names[i].ev != NULL; i++) + if (getenv(howto_names[i].ev) != NULL) + howto |= howto_names[i].mask; + return howto; +} + /* * Setup early kernel environment, based on start_info passed to us by * xen @@ -389,12 +438,14 @@ initxen(struct start_info *si) if (kmdp == NULL) kmdp = preload_search_by_type("elf64 kernel"); -#ifdef notyet - boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); - kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); -#endif /* notyet */ + if (envmode == 1) + kern_envp = static_env; + else if ((caddr_t)xen_start_info->cmd_line) + kern_envp = xen_setbootenv((caddr_t)xen_start_info->cmd_line); + + boothowto |= xen_boothowto(kern_envp); -#ifdef DDB +#ifdef DDB /* XXX: */ ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t); ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t); #endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210312124.q9VLOVRB033998>