Changeset View
Changeset View
Standalone View
Standalone View
head/sys/boot/i386/libi386/bootinfo32.c
Show All 26 Lines | |||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <stand.h> | #include <stand.h> | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/reboot.h> | #include <sys/reboot.h> | ||||
#include <sys/linker.h> | #include <sys/linker.h> | ||||
#include <machine/bootinfo.h> | #include <machine/bootinfo.h> | ||||
#include <machine/metadata.h> | |||||
#include "bootstrap.h" | #include "bootstrap.h" | ||||
#include "libi386.h" | #include "libi386.h" | ||||
#include "btxv86.h" | #include "btxv86.h" | ||||
#ifdef LOADER_GELI_SUPPORT | |||||
#include "geliboot.h" | |||||
static const size_t keybuf_size = sizeof(struct keybuf) + | |||||
(GELI_MAX_KEYS * sizeof(struct keybuf_ent)); | |||||
#endif | |||||
static struct bootinfo bi; | static struct bootinfo bi; | ||||
/* | /* | ||||
* Copy module-related data into the load area, where it can be | * Copy module-related data into the load area, where it can be | ||||
* used as a directory for loaded modules. | * used as a directory for loaded modules. | ||||
* | * | ||||
* Module data is presented in a self-describing format. Each datum | * Module data is presented in a self-describing format. Each datum | ||||
* is preceded by a 32-bit identifier and a 32-bit size field. | * is preceded by a 32-bit identifier and a 32-bit size field. | ||||
▲ Show 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | bi_load32(char *args, int *howtop, int *bootdevp, vm_offset_t *bip, vm_offset_t *modulep, vm_offset_t *kernendp) | ||||
vm_offset_t kernend; | vm_offset_t kernend; | ||||
vm_offset_t envp; | vm_offset_t envp; | ||||
vm_offset_t size; | vm_offset_t size; | ||||
vm_offset_t ssym, esym; | vm_offset_t ssym, esym; | ||||
char *rootdevname; | char *rootdevname; | ||||
int bootdevnr, i, howto; | int bootdevnr, i, howto; | ||||
char *kernelname; | char *kernelname; | ||||
const char *kernelpath; | const char *kernelpath; | ||||
#ifdef LOADER_GELI_SUPPORT | |||||
char buf[keybuf_size]; | |||||
struct keybuf *keybuf = (struct keybuf *)buf; | |||||
#endif | |||||
howto = bi_getboothowto(args); | howto = bi_getboothowto(args); | ||||
/* | /* | ||||
* Allow the environment variable 'rootdev' to override the supplied device | * Allow the environment variable 'rootdev' to override the supplied device | ||||
* This should perhaps go to MI code and/or have $rootdev tested/set by | * This should perhaps go to MI code and/or have $rootdev tested/set by | ||||
* MI code before launching the kernel. | * MI code before launching the kernel. | ||||
*/ | */ | ||||
rootdevname = getenv("rootdev"); | rootdevname = getenv("rootdev"); | ||||
i386_getdev((void **)(&rootdev), rootdevname, NULL); | i386_getdev((void **)(&rootdev), rootdevname, NULL); | ||||
if (rootdev == NULL) { /* bad $rootdev/$currdev */ | if (rootdev == NULL) { /* bad $rootdev/$currdev */ | ||||
printf("can't determine root device\n"); | printf("can't determine root device\n"); | ||||
return(EINVAL); | return(EINVAL); | ||||
Show All 18 Lines | #endif | ||||
/* pass in the BIOS device number of the current disk */ | /* pass in the BIOS device number of the current disk */ | ||||
bi.bi_bios_dev = bd_unit2bios(rootdev->d_unit); | bi.bi_bios_dev = bd_unit2bios(rootdev->d_unit); | ||||
bootdevnr = bd_getdev(rootdev); | bootdevnr = bd_getdev(rootdev); | ||||
break; | break; | ||||
case DEVT_NET: | case DEVT_NET: | ||||
case DEVT_ZFS: | case DEVT_ZFS: | ||||
break; | break; | ||||
default: | default: | ||||
printf("WARNING - don't know how to boot from device type %d\n", rootdev->d_type); | printf("WARNING - don't know how to boot from device type %d\n", rootdev->d_type); | ||||
} | } | ||||
if (bootdevnr == -1) { | if (bootdevnr == -1) { | ||||
printf("root device %s invalid\n", i386_fmtdev(rootdev)); | printf("root device %s invalid\n", i386_fmtdev(rootdev)); | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
free(rootdev); | free(rootdev); | ||||
Show All 19 Lines | if (kfp == NULL) | ||||
kfp = file_findfile(NULL, "elf32 kernel"); | kfp = file_findfile(NULL, "elf32 kernel"); | ||||
if (kfp == NULL) | if (kfp == NULL) | ||||
panic("can't find kernel file"); | panic("can't find kernel file"); | ||||
kernend = 0; /* fill it in later */ | kernend = 0; /* fill it in later */ | ||||
file_addmetadata(kfp, MODINFOMD_HOWTO, sizeof howto, &howto); | file_addmetadata(kfp, MODINFOMD_HOWTO, sizeof howto, &howto); | ||||
file_addmetadata(kfp, MODINFOMD_ENVP, sizeof envp, &envp); | file_addmetadata(kfp, MODINFOMD_ENVP, sizeof envp, &envp); | ||||
file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof kernend, &kernend); | file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof kernend, &kernend); | ||||
bios_addsmapdata(kfp); | bios_addsmapdata(kfp); | ||||
#ifdef LOADER_GELI_SUPPORT | |||||
geli_fill_keybuf(keybuf); | |||||
file_addmetadata(kfp, MODINFOMD_KEYBUF, keybuf_size, buf); | |||||
bzero(buf, sizeof(buf)); | |||||
#endif | |||||
/* Figure out the size and location of the metadata */ | /* Figure out the size and location of the metadata */ | ||||
*modulep = addr; | *modulep = addr; | ||||
size = bi_copymodules32(0); | size = bi_copymodules32(0); | ||||
kernend = roundup(addr + size, PAGE_SIZE); | kernend = roundup(addr + size, PAGE_SIZE); | ||||
*kernendp = kernend; | *kernendp = kernend; | ||||
/* patch MODINFOMD_KERNEND */ | /* patch MODINFOMD_KERNEND */ | ||||
▲ Show 20 Lines • Show All 43 Lines • Show Last 20 Lines |