prep: add support for OpenBIOS
PATCH 1/1 prep: add support for OpenBIOS
Note that OHW is still the default firmware.
Signed-off-by Hervé Poussineau <[email protected]>
--- hw/ppc/prep.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)
hw/ppc/prep.c +42 -0
@@ -52,6 +52,8 @@#define MAX_IDE_BUS 2 +#define CFG_ADDR 0xf0000510 +#define BIOS_SIZE (1024 * 1024)#define BIOS_FILENAME "ppc_rom.bin"#define KERNEL_LOAD_ADDR 0x01000000
@@ -358,6 +360,12 @@ static const MemoryRegionPortio prep_portio_list[] = { PORTIO_END_OF_LIST(), }; +static int fw_cfg_boot_set (void *opaque,const char *boot_device) +{ +fw_cfg_add_i16 (opaque,FW_CFG_BOOT_DEVICE , boot_device[0 ]); +return 0 ; +} +/* PowerPC PREP hardware initialisation */ static void ppc_prep_init (QEMUMachineInitArgs *args) {
@@ -389,6 +397,7 @@ static void ppc_prep_init(QEMUMachineInitArgs *args)qemu_irq *cpu_exit_irq;int ppc_boot_device;DriveInfo *hd[MAX_IDE_BUS *MAX_IDE_DEVS ]; +void *fw_cfg; sysctrl =g_malloc0 (sizeof (sysctrl_t));
@@ -559,6 +568,39 @@ static void ppc_prep_init(QEMUMachineInitArgs *args)/* XXX: need an option to load a NVRAM image */ 0 , graphic_width, graphic_height, graphic_depth); + +/* Prepare firmware configuration for OpenBIOS */ + fw_cfg =fw_cfg_init (0 ,0 ,CFG_ADDR ,CFG_ADDR +2 ); +fw_cfg_add_i16 (fw_cfg,FW_CFG_MAX_CPUS , (uint16_t )max_cpus); +fw_cfg_add_i32 (fw_cfg,FW_CFG_ID ,1 ); +fw_cfg_add_i64 (fw_cfg,FW_CFG_RAM_SIZE , (uint64_t )args->ram_size); +fw_cfg_add_i16 (fw_cfg,FW_CFG_MACHINE_ID ,ARCH_PREP ); +fw_cfg_add_i32 (fw_cfg,FW_CFG_KERNEL_ADDR ,0 ); +fw_cfg_add_i32 (fw_cfg,FW_CFG_KERNEL_SIZE ,0 ); +fw_cfg_add_i32 (fw_cfg,FW_CFG_KERNEL_CMDLINE ,0 ); +fw_cfg_add_i32 (fw_cfg,FW_CFG_INITRD_ADDR ,0 ); +fw_cfg_add_i32 (fw_cfg,FW_CFG_INITRD_SIZE ,0 ); +fw_cfg_add_i16 (fw_cfg,FW_CFG_BOOT_DEVICE , boot_device[0 ]); + +fw_cfg_add_i16 (fw_cfg,FW_CFG_PPC_WIDTH , graphic_width); +fw_cfg_add_i16 (fw_cfg,FW_CFG_PPC_HEIGHT , graphic_height); +fw_cfg_add_i16 (fw_cfg,FW_CFG_PPC_DEPTH , graphic_depth); + +fw_cfg_add_i32 (fw_cfg,FW_CFG_PPC_IS_KVM ,kvm_enabled ()); +if (kvm_enabled ()) { +#ifdef CONFIG_KVM +uint8_t *hypercall; + +fw_cfg_add_i32 (fw_cfg,FW_CFG_PPC_TBFREQ ,kvmppc_get_tbfreq ()); + hypercall =g_malloc (16 ); +kvmppc_get_hypercall (env, hypercall,16 ); +fw_cfg_add_bytes (fw_cfg,FW_CFG_PPC_KVM_HC , hypercall,16 ); +fw_cfg_add_i32 (fw_cfg,FW_CFG_PPC_KVM_PID ,getpid ()); +#endif + }else { +fw_cfg_add_i32 (fw_cfg,FW_CFG_PPC_TBFREQ ,get_ticks_per_sec ()); + } +qemu_register_boot_set (fw_cfg_boot_set, fw_cfg); }static QEMUMachine prep_machine = {
Signature · 1 line
1.7.10.4