On Sun, Nov 14, 2010 at 3:39 PM, Gleb Natapov <gleb@xxxxxxxxxx> wrote: > > Signed-off-by: Gleb Natapov <gleb@xxxxxxxxxx> > --- > Âhw/fw_cfg.c |  14 ++++++++++++++ > Âhw/fw_cfg.h |  Â4 +++- > Âsysemu.h  Â|  Â1 + > Âvl.c    Â|  51 +++++++++++++++++++++++++++++++++++++++++++++++++++ > Â4 files changed, 69 insertions(+), 1 deletions(-) > > diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c > index 7b9434f..f6a67db 100644 > --- a/hw/fw_cfg.c > +++ b/hw/fw_cfg.c > @@ -53,6 +53,7 @@ struct FWCfgState { >   FWCfgFiles *files; >   uint16_t cur_entry; >   uint32_t cur_offset; > +  ÂNotifier machine_ready; > Â}; > > Âstatic void fw_cfg_write(FWCfgState *s, uint8_t value) > @@ -315,6 +316,15 @@ int fw_cfg_add_file(FWCfgState *s, Âconst char *filename, uint8_t *data, >   return 1; > Â} > > +static void fw_cfg_machine_ready(struct Notifier* n) > +{ > +  Âuint32_t len; > +  Âchar *bootindex = get_boot_devices_list(&len); > + > +  Âfw_cfg_add_bytes(container_of(n, FWCfgState, machine_ready), > +           FW_CFG_BOOTINDEX, (uint8_t*)bootindex, len); > +} > + > ÂFWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port, >             target_phys_addr_t ctl_addr, target_phys_addr_t data_addr) > Â{ > @@ -343,6 +353,10 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port, >   fw_cfg_add_i16(s, FW_CFG_MAX_CPUS, (uint16_t)max_cpus); >   fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu); > > + > +  Âs->machine_ready.notify = fw_cfg_machine_ready; > +  Âqemu_add_machine_init_done_notifier(&s->machine_ready); > + >   return s; > Â} > > diff --git a/hw/fw_cfg.h b/hw/fw_cfg.h > index 856bf91..4d61410 100644 > --- a/hw/fw_cfg.h > +++ b/hw/fw_cfg.h > @@ -30,7 +30,9 @@ > > Â#define FW_CFG_FILE_FIRST    0x20 > Â#define FW_CFG_FILE_SLOTS    0x10 > -#define FW_CFG_MAX_ENTRY    Â(FW_CFG_FILE_FIRST+FW_CFG_FILE_SLOTS) > +#define FW_CFG_FILE_LAST_SLOT  (FW_CFG_FILE_FIRST+FW_CFG_FILE_SLOTS) > +#define FW_CFG_BOOTINDEX    Â(FW_CFG_FILE_LAST_SLOT + 1) > +#define FW_CFG_MAX_ENTRY    ÂFW_CFG_BOOTINDEX This should be #define FW_CFG_MAX_ENTRY (FW_CFG_BOOTINDEX + 1) because the check is like this: if ((key & FW_CFG_ENTRY_MASK) >= FW_CFG_MAX_ENTRY) { s->cur_entry = FW_CFG_INVALID; With that change, I got the bootindex passed to OpenBIOS: OpenBIOS for Sparc64 Configuration device id QEMU version 1 machine id 0 kernel cmdline CPUs: 1 x SUNW,UltraSPARC-IIi UUID: 00000000-0000-0000-0000-000000000000 bootindex num_strings 1 bootindex /pbm@000001fe00000000/ide@5/drive@1/disk@0 The device path does not match exactly, but it's close: /pci@1fe,0/pci-ata@5/ide1@600/disk@0 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html