xref: /kvm-unit-tests/lib/x86/setup.c (revision 716cea8ab268eca57c7d7e9586b85fa9a2454d92)
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"
9*716cea8aSPaolo Bonzini #include "fwcfg.h"
10*716cea8aSPaolo Bonzini #include "alloc_phys.h"
1193dd2aa3SAndrew Jones 
12*716cea8aSPaolo Bonzini extern char edata;
13*716cea8aSPaolo Bonzini 
14*716cea8aSPaolo Bonzini struct mbi_bootinfo {
15*716cea8aSPaolo Bonzini 	u32 flags;
16*716cea8aSPaolo Bonzini 	u32 mem_lower;
17*716cea8aSPaolo Bonzini 	u32 mem_upper;
18*716cea8aSPaolo Bonzini 	u32 boot_device;
19*716cea8aSPaolo Bonzini 	u32 cmdline;
20*716cea8aSPaolo Bonzini 	u32 mods_count;
21*716cea8aSPaolo Bonzini 	u32 mods_addr;
22*716cea8aSPaolo Bonzini 	u32 reserved[5];   /* 28-47 */
23*716cea8aSPaolo Bonzini 	u32 mmap_addr;
24*716cea8aSPaolo Bonzini 	u32 reserved0[3];  /* 52-63 */
25*716cea8aSPaolo Bonzini 	u32 bootloader;
26*716cea8aSPaolo Bonzini 	u32 reserved1[5];  /* 68-87 */
27*716cea8aSPaolo Bonzini 	u32 size;
28*716cea8aSPaolo Bonzini };
29*716cea8aSPaolo Bonzini 
30*716cea8aSPaolo Bonzini struct mbi_module {
31*716cea8aSPaolo Bonzini 	u32 start, end;
32*716cea8aSPaolo Bonzini 	u32 cmdline;
33*716cea8aSPaolo Bonzini 	u32 unused;
34*716cea8aSPaolo Bonzini };
3593dd2aa3SAndrew Jones 
363c7d322eSAndrew Jones #define ENV_SIZE 16384
373c7d322eSAndrew Jones 
383c7d322eSAndrew Jones extern void setup_env(char *env, int size);
393c7d322eSAndrew Jones 
4093dd2aa3SAndrew Jones char *initrd;
4193dd2aa3SAndrew Jones u32 initrd_size;
4293dd2aa3SAndrew Jones 
433c7d322eSAndrew Jones static char env[ENV_SIZE];
443c7d322eSAndrew Jones 
45*716cea8aSPaolo Bonzini void setup_multiboot(struct mbi_bootinfo *bootinfo)
4693dd2aa3SAndrew Jones {
47*716cea8aSPaolo Bonzini 	struct mbi_module *mods;
4893dd2aa3SAndrew Jones 
49*716cea8aSPaolo Bonzini 	if (bootinfo->mods_count != 1)
5093dd2aa3SAndrew Jones 		return;
5193dd2aa3SAndrew Jones 
52*716cea8aSPaolo Bonzini 	mods = (struct mbi_module *)(uintptr_t) bootinfo->mods_addr;
5393dd2aa3SAndrew Jones 
54*716cea8aSPaolo Bonzini 	initrd = (char *)(uintptr_t) mods->start;
55*716cea8aSPaolo Bonzini 	initrd_size = mods->end - mods->start;
5693dd2aa3SAndrew Jones }
573c7d322eSAndrew Jones 
58*716cea8aSPaolo Bonzini void setup_libcflat(void)
593c7d322eSAndrew Jones {
603c7d322eSAndrew Jones 	if (initrd) {
613c7d322eSAndrew Jones 		/* environ is currently the only file in the initrd */
623c7d322eSAndrew Jones 		u32 size = MIN(initrd_size, ENV_SIZE);
633c7d322eSAndrew Jones 		memcpy(env, initrd, size);
643c7d322eSAndrew Jones 		setup_env(env, size);
653c7d322eSAndrew Jones 	}
663c7d322eSAndrew Jones }
67