/* * Initialize machine setup information * * Copyright (C) 2017, Red Hat Inc, Andrew Jones * * This work is licensed under the terms of the GNU LGPL, version 2. */ #include "libcflat.h" #define MBI_MODS_COUNT 20 #define MBI_MODS_ADDR 24 #define MB_MOD_START 0 #define MB_MOD_END 4 #define ENV_SIZE 16384 extern void setup_env(char *env, int size); char *initrd; u32 initrd_size; static char env[ENV_SIZE]; void setup_get_initrd(u8 *bootinfo) { u32 *mods_addr, *mod_start, *mod_end; if (*((u32 *)&bootinfo[MBI_MODS_COUNT]) != 1) return; mods_addr = (u32 *)&bootinfo[MBI_MODS_ADDR]; mod_start = (u32 *)(ulong)(*mods_addr + MB_MOD_START); mod_end = (u32 *)(ulong)(*mods_addr + MB_MOD_END); initrd = (char *)(ulong)*mod_start; initrd_size = *mod_end - *mod_start; } void setup_environ(void) { if (initrd) { /* environ is currently the only file in the initrd */ u32 size = MIN(initrd_size, ENV_SIZE); memcpy(env, initrd, size); setup_env(env, size); } }