Skip to content

Commit

Permalink
bootdevice: add Error **errp argument for QEMUBootSetHandler
Browse files Browse the repository at this point in the history
It will be useful for checking when we change traditional
boot order dynamically and propagate error message
to the monitor.
For x86 architecture, we pass &local_err to set_boot_dev()
when vm startup in pc_coms_init().

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Alexander Graf <agraf@suse.de>
Cc: Blue Swirl <blauwirbel@gmail.com>
Cc: qemu-ppc@nongnu.org
Signed-off-by: Gonglei <arei.gonglei@huawei.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
  • Loading branch information
gongleiarei authored and root committed Dec 22, 2014
1 parent 3b08098 commit ddcd553
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 25 deletions.
5 changes: 1 addition & 4 deletions bootdevice.c
Expand Up @@ -63,10 +63,7 @@ void qemu_boot_set(const char *boot_order, Error **errp)
return;
}

if (boot_set_handler(boot_set_opaque, boot_order)) {
error_setg(errp, "setting boot device list failed");
return;
}
boot_set_handler(boot_set_opaque, boot_order, errp);
}

void validate_bootdevices(const char *devices, Error **errp)
Expand Down
22 changes: 12 additions & 10 deletions hw/i386/pc.c
Expand Up @@ -282,33 +282,32 @@ static int boot_device2nibble(char boot_device)
return 0;
}

static int set_boot_dev(ISADevice *s, const char *boot_device)
static void set_boot_dev(ISADevice *s, const char *boot_device, Error **errp)
{
#define PC_MAX_BOOT_DEVICES 3
int nbds, bds[3] = { 0, };
int i;

nbds = strlen(boot_device);
if (nbds > PC_MAX_BOOT_DEVICES) {
error_report("Too many boot devices for PC");
return(1);
error_setg(errp, "Too many boot devices for PC");
return;
}
for (i = 0; i < nbds; i++) {
bds[i] = boot_device2nibble(boot_device[i]);
if (bds[i] == 0) {
error_report("Invalid boot device for PC: '%c'",
boot_device[i]);
return(1);
error_setg(errp, "Invalid boot device for PC: '%c'",
boot_device[i]);
return;
}
}
rtc_set_memory(s, 0x3d, (bds[1] << 4) | bds[0]);
rtc_set_memory(s, 0x38, (bds[2] << 4) | (fd_bootchk ? 0x0 : 0x1));
return(0);
}

static int pc_boot_set(void *opaque, const char *boot_device)
static void pc_boot_set(void *opaque, const char *boot_device, Error **errp)
{
return set_boot_dev(opaque, boot_device);
set_boot_dev(opaque, boot_device, errp);
}

typedef struct pc_cmos_init_late_arg {
Expand Down Expand Up @@ -365,6 +364,7 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
FDriveType fd_type[2] = { FDRIVE_DRV_NONE, FDRIVE_DRV_NONE };
static pc_cmos_init_late_arg arg;
PCMachineState *pc_machine = PC_MACHINE(machine);
Error *local_err = NULL;

/* various important CMOS locations needed by PC/Bochs bios */

Expand Down Expand Up @@ -412,7 +412,9 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
object_property_set_link(OBJECT(machine), OBJECT(s),
"rtc_state", &error_abort);

if (set_boot_dev(s, boot_device)) {
set_boot_dev(s, boot_device, &local_err);
if (local_err) {
error_report("%s", error_get_pretty(local_err));
exit(1);
}

Expand Down
4 changes: 2 additions & 2 deletions hw/ppc/mac_newworld.c
Expand Up @@ -116,10 +116,10 @@ static const MemoryRegionOps unin_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};

static int fw_cfg_boot_set(void *opaque, const char *boot_device)
static void fw_cfg_boot_set(void *opaque, const char *boot_device,
Error **errp)
{
fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
return 0;
}

static uint64_t translate_kernel_address(void *opaque, uint64_t addr)
Expand Down
5 changes: 2 additions & 3 deletions hw/ppc/mac_oldworld.c
Expand Up @@ -49,13 +49,12 @@
#define CLOCKFREQ 266000000UL
#define BUSFREQ 66000000UL

static int fw_cfg_boot_set(void *opaque, const char *boot_device)
static void fw_cfg_boot_set(void *opaque, const char *boot_device,
Error **errp)
{
fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
return 0;
}


static uint64_t translate_kernel_address(void *opaque, uint64_t addr)
{
return (addr & 0x0fffffff) + KERNEL_LOAD_ADDR;
Expand Down
4 changes: 2 additions & 2 deletions hw/sparc/sun4m.c
Expand Up @@ -121,10 +121,10 @@ void DMA_register_channel (int nchan,
{
}

static int fw_cfg_boot_set(void *opaque, const char *boot_device)
static void fw_cfg_boot_set(void *opaque, const char *boot_device,
Error **errp)
{
fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
return 0;
}

static void nvram_init(M48t59State *nvram, uint8_t *macaddr,
Expand Down
4 changes: 2 additions & 2 deletions hw/sparc64/sun4u.c
Expand Up @@ -124,10 +124,10 @@ void DMA_register_channel (int nchan,
{
}

static int fw_cfg_boot_set(void *opaque, const char *boot_device)
static void fw_cfg_boot_set(void *opaque, const char *boot_device,
Error **errp)
{
fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
return 0;
}

static int sun4u_NVRAM_set_params(M48t59State *nvram, uint16_t NVRAM_size,
Expand Down
4 changes: 2 additions & 2 deletions include/sysemu/sysemu.h
Expand Up @@ -220,8 +220,8 @@ void restore_boot_order(void *opaque);
void validate_bootdevices(const char *devices, Error **errp);

/* handler to set the boot_device order for a specific type of QEMUMachine */
/* return 0 if success */
typedef int QEMUBootSetHandler(void *opaque, const char *boot_order);
typedef void QEMUBootSetHandler(void *opaque, const char *boot_order,
Error **errp);
void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque);
void qemu_boot_set(const char *boot_order, Error **errp);

Expand Down

0 comments on commit ddcd553

Please sign in to comment.