xref: /kvm-unit-tests/lib/x86/setup.c (revision 3c7d322e87043aaad022e1999844c82d7b373aa9)
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