193dd2aa3SAndrew Jones /* 293dd2aa3SAndrew Jones * Initialize machine setup information 393dd2aa3SAndrew Jones * 493dd2aa3SAndrew Jones * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@redhat.com> 593dd2aa3SAndrew Jones * 693dd2aa3SAndrew Jones * This work is licensed under the terms of the GNU LGPL, version 2. 793dd2aa3SAndrew Jones */ 893dd2aa3SAndrew Jones #include "libcflat.h" 993dd2aa3SAndrew Jones 1093dd2aa3SAndrew Jones #define MBI_MODS_COUNT 20 1193dd2aa3SAndrew Jones #define MBI_MODS_ADDR 24 1293dd2aa3SAndrew Jones #define MB_MOD_START 0 1393dd2aa3SAndrew Jones #define MB_MOD_END 4 1493dd2aa3SAndrew Jones 15*3c7d322eSAndrew Jones #define ENV_SIZE 16384 16*3c7d322eSAndrew Jones 17*3c7d322eSAndrew Jones extern void setup_env(char *env, int size); 18*3c7d322eSAndrew Jones 1993dd2aa3SAndrew Jones char *initrd; 2093dd2aa3SAndrew Jones u32 initrd_size; 2193dd2aa3SAndrew Jones 22*3c7d322eSAndrew Jones static char env[ENV_SIZE]; 23*3c7d322eSAndrew Jones 2493dd2aa3SAndrew Jones void setup_get_initrd(u8 *bootinfo) 2593dd2aa3SAndrew Jones { 2693dd2aa3SAndrew Jones u32 *mods_addr, *mod_start, *mod_end; 2793dd2aa3SAndrew Jones 2893dd2aa3SAndrew Jones if (*((u32 *)&bootinfo[MBI_MODS_COUNT]) != 1) 2993dd2aa3SAndrew Jones return; 3093dd2aa3SAndrew Jones 3193dd2aa3SAndrew Jones mods_addr = (u32 *)&bootinfo[MBI_MODS_ADDR]; 3293dd2aa3SAndrew Jones mod_start = (u32 *)(ulong)(*mods_addr + MB_MOD_START); 3393dd2aa3SAndrew Jones mod_end = (u32 *)(ulong)(*mods_addr + MB_MOD_END); 3493dd2aa3SAndrew Jones 3593dd2aa3SAndrew Jones initrd = (char *)(ulong)*mod_start; 3693dd2aa3SAndrew Jones initrd_size = *mod_end - *mod_start; 3793dd2aa3SAndrew Jones } 38*3c7d322eSAndrew Jones 39*3c7d322eSAndrew Jones void setup_environ(void) 40*3c7d322eSAndrew Jones { 41*3c7d322eSAndrew Jones if (initrd) { 42*3c7d322eSAndrew Jones /* environ is currently the only file in the initrd */ 43*3c7d322eSAndrew Jones u32 size = MIN(initrd_size, ENV_SIZE); 44*3c7d322eSAndrew Jones memcpy(env, initrd, size); 45*3c7d322eSAndrew Jones setup_env(env, size); 46*3c7d322eSAndrew Jones } 47*3c7d322eSAndrew Jones } 48