S390: IPL: Use different firmware for different machines

We have a virtio-s390 and a virtio-ccw machine in QEMU. Both use vastly
different ways to do I/O. Having the same firmware blob for both doesn't
really make any sense.

Instead, let's parametrize the firmware file name, so that we can have
different blobs for different machines.

Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
Alexander Graf 2013-04-22 16:52:53 +02:00
parent 3325995640
commit d0249ce5a8
4 changed files with 11 additions and 6 deletions

View file

@ -23,7 +23,6 @@
#define INITRD_PARM_START 0x010408UL #define INITRD_PARM_START 0x010408UL
#define INITRD_PARM_SIZE 0x010410UL #define INITRD_PARM_SIZE 0x010410UL
#define PARMFILE_START 0x001000UL #define PARMFILE_START 0x001000UL
#define ZIPL_FILENAME "s390-zipl.rom"
#define ZIPL_IMAGE_START 0x009000UL #define ZIPL_IMAGE_START 0x009000UL
#define IPL_PSW_MASK (PSW_MASK_32 | PSW_MASK_64) #define IPL_PSW_MASK (PSW_MASK_32 | PSW_MASK_64)
@ -54,6 +53,7 @@ typedef struct S390IPLState {
char *kernel; char *kernel;
char *initrd; char *initrd;
char *cmdline; char *cmdline;
char *firmware;
} S390IPLState; } S390IPLState;
@ -78,7 +78,7 @@ static int s390_ipl_init(SysBusDevice *dev)
/* Load zipl bootloader */ /* Load zipl bootloader */
if (bios_name == NULL) { if (bios_name == NULL) {
bios_name = ZIPL_FILENAME; bios_name = ipl->firmware;
} }
bios_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); bios_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
@ -144,6 +144,7 @@ static Property s390_ipl_properties[] = {
DEFINE_PROP_STRING("kernel", S390IPLState, kernel), DEFINE_PROP_STRING("kernel", S390IPLState, kernel),
DEFINE_PROP_STRING("initrd", S390IPLState, initrd), DEFINE_PROP_STRING("initrd", S390IPLState, initrd),
DEFINE_PROP_STRING("cmdline", S390IPLState, cmdline), DEFINE_PROP_STRING("cmdline", S390IPLState, cmdline),
DEFINE_PROP_STRING("firmware", S390IPLState, firmware),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}; };

View file

@ -83,7 +83,7 @@ static void ccw_init(QEMUMachineInitArgs *args)
css_bus = virtual_css_bus_init(); css_bus = virtual_css_bus_init();
s390_sclp_init(); s390_sclp_init();
s390_init_ipl_dev(args->kernel_filename, args->kernel_cmdline, s390_init_ipl_dev(args->kernel_filename, args->kernel_cmdline,
args->initrd_filename); args->initrd_filename, "s390-zipl.rom");
/* register hypercalls */ /* register hypercalls */
virtio_ccw_register_hcalls(); virtio_ccw_register_hcalls();

View file

@ -49,6 +49,7 @@
#endif #endif
#define MAX_BLK_DEVS 10 #define MAX_BLK_DEVS 10
#define ZIPL_FILENAME "s390-zipl.rom"
static VirtIOS390Bus *s390_bus; static VirtIOS390Bus *s390_bus;
static S390CPU **ipi_states; static S390CPU **ipi_states;
@ -158,7 +159,8 @@ unsigned s390_del_running_cpu(S390CPU *cpu)
void s390_init_ipl_dev(const char *kernel_filename, void s390_init_ipl_dev(const char *kernel_filename,
const char *kernel_cmdline, const char *kernel_cmdline,
const char *initrd_filename) const char *initrd_filename,
const char *firmware)
{ {
DeviceState *dev; DeviceState *dev;
@ -170,6 +172,7 @@ void s390_init_ipl_dev(const char *kernel_filename,
qdev_prop_set_string(dev, "initrd", initrd_filename); qdev_prop_set_string(dev, "initrd", initrd_filename);
} }
qdev_prop_set_string(dev, "cmdline", kernel_cmdline); qdev_prop_set_string(dev, "cmdline", kernel_cmdline);
qdev_prop_set_string(dev, "firmware", firmware);
qdev_init_nofail(dev); qdev_init_nofail(dev);
} }
@ -247,7 +250,7 @@ static void s390_init(QEMUMachineInitArgs *args)
s390_bus = s390_virtio_bus_init(&my_ram_size); s390_bus = s390_virtio_bus_init(&my_ram_size);
s390_sclp_init(); s390_sclp_init();
s390_init_ipl_dev(args->kernel_filename, args->kernel_cmdline, s390_init_ipl_dev(args->kernel_filename, args->kernel_cmdline,
args->initrd_filename); args->initrd_filename, ZIPL_FILENAME);
/* register hypercalls */ /* register hypercalls */
s390_virtio_register_hcalls(); s390_virtio_register_hcalls();

View file

@ -23,6 +23,7 @@ void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn);
void s390_init_cpus(const char *cpu_model, uint8_t *storage_keys); void s390_init_cpus(const char *cpu_model, uint8_t *storage_keys);
void s390_init_ipl_dev(const char *kernel_filename, void s390_init_ipl_dev(const char *kernel_filename,
const char *kernel_cmdline, const char *kernel_cmdline,
const char *initrd_filename); const char *initrd_filename,
const char *firmware);
void s390_create_virtio_net(BusState *bus, const char *name); void s390_create_virtio_net(BusState *bus, const char *name);
#endif #endif