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