mirror of https://github.com/xqemu/xqemu.git
Add bootindex for option roms.
Extend -option-rom command to have additional parameter ,bootindex=. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
de1f34cb63
commit
2e55e84282
16
hw/loader.c
16
hw/loader.c
|
@ -107,7 +107,7 @@ int load_image_targphys(const char *filename,
|
||||||
|
|
||||||
size = get_image_size(filename);
|
size = get_image_size(filename);
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
rom_add_file_fixed(filename, addr);
|
rom_add_file_fixed(filename, addr, -1);
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -557,10 +557,11 @@ static void rom_insert(Rom *rom)
|
||||||
}
|
}
|
||||||
|
|
||||||
int rom_add_file(const char *file, const char *fw_dir,
|
int rom_add_file(const char *file, const char *fw_dir,
|
||||||
target_phys_addr_t addr)
|
target_phys_addr_t addr, int32_t bootindex)
|
||||||
{
|
{
|
||||||
Rom *rom;
|
Rom *rom;
|
||||||
int rc, fd = -1;
|
int rc, fd = -1;
|
||||||
|
char devpath[100];
|
||||||
|
|
||||||
rom = qemu_mallocz(sizeof(*rom));
|
rom = qemu_mallocz(sizeof(*rom));
|
||||||
rom->name = qemu_strdup(file);
|
rom->name = qemu_strdup(file);
|
||||||
|
@ -605,7 +606,12 @@ int rom_add_file(const char *file, const char *fw_dir,
|
||||||
snprintf(fw_file_name, sizeof(fw_file_name), "%s/%s", rom->fw_dir,
|
snprintf(fw_file_name, sizeof(fw_file_name), "%s/%s", rom->fw_dir,
|
||||||
basename);
|
basename);
|
||||||
fw_cfg_add_file(fw_cfg, fw_file_name, rom->data, rom->romsize);
|
fw_cfg_add_file(fw_cfg, fw_file_name, rom->data, rom->romsize);
|
||||||
|
snprintf(devpath, sizeof(devpath), "/rom@%s", fw_file_name);
|
||||||
|
} else {
|
||||||
|
snprintf(devpath, sizeof(devpath), "/rom@" TARGET_FMT_plx, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add_boot_device_path(bootindex, NULL, devpath);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
@ -635,12 +641,12 @@ int rom_add_blob(const char *name, const void *blob, size_t len,
|
||||||
|
|
||||||
int rom_add_vga(const char *file)
|
int rom_add_vga(const char *file)
|
||||||
{
|
{
|
||||||
return rom_add_file(file, "vgaroms", 0);
|
return rom_add_file(file, "vgaroms", 0, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int rom_add_option(const char *file)
|
int rom_add_option(const char *file, int32_t bootindex)
|
||||||
{
|
{
|
||||||
return rom_add_file(file, "genroms", 0);
|
return rom_add_file(file, "genroms", 0, bootindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rom_reset(void *unused)
|
static void rom_reset(void *unused)
|
||||||
|
|
|
@ -22,7 +22,7 @@ void pstrcpy_targphys(const char *name,
|
||||||
|
|
||||||
|
|
||||||
int rom_add_file(const char *file, const char *fw_dir,
|
int rom_add_file(const char *file, const char *fw_dir,
|
||||||
target_phys_addr_t addr);
|
target_phys_addr_t addr, int32_t bootindex);
|
||||||
int rom_add_blob(const char *name, const void *blob, size_t len,
|
int rom_add_blob(const char *name, const void *blob, size_t len,
|
||||||
target_phys_addr_t addr);
|
target_phys_addr_t addr);
|
||||||
int rom_load_all(void);
|
int rom_load_all(void);
|
||||||
|
@ -31,8 +31,8 @@ int rom_copy(uint8_t *dest, target_phys_addr_t addr, size_t size);
|
||||||
void *rom_ptr(target_phys_addr_t addr);
|
void *rom_ptr(target_phys_addr_t addr);
|
||||||
void do_info_roms(Monitor *mon);
|
void do_info_roms(Monitor *mon);
|
||||||
|
|
||||||
#define rom_add_file_fixed(_f, _a) \
|
#define rom_add_file_fixed(_f, _a, _i) \
|
||||||
rom_add_file(_f, NULL, _a)
|
rom_add_file(_f, NULL, _a, _i)
|
||||||
#define rom_add_blob_fixed(_f, _b, _l, _a) \
|
#define rom_add_blob_fixed(_f, _b, _l, _a) \
|
||||||
rom_add_blob(_f, _b, _l, _a)
|
rom_add_blob(_f, _b, _l, _a)
|
||||||
|
|
||||||
|
@ -43,6 +43,6 @@ void do_info_roms(Monitor *mon);
|
||||||
#define PC_ROM_SIZE (PC_ROM_MAX - PC_ROM_MIN_VGA)
|
#define PC_ROM_SIZE (PC_ROM_MAX - PC_ROM_MIN_VGA)
|
||||||
|
|
||||||
int rom_add_vga(const char *file);
|
int rom_add_vga(const char *file);
|
||||||
int rom_add_option(const char *file);
|
int rom_add_option(const char *file, int32_t bootindex);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -331,7 +331,8 @@ int load_multiboot(void *fw_cfg,
|
||||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data,
|
fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data,
|
||||||
sizeof(bootinfo));
|
sizeof(bootinfo));
|
||||||
|
|
||||||
option_rom[nb_option_roms] = "multiboot.bin";
|
option_rom[nb_option_roms].name = "multiboot.bin";
|
||||||
|
option_rom[nb_option_roms].bootindex = 0;
|
||||||
nb_option_roms++;
|
nb_option_roms++;
|
||||||
|
|
||||||
return 1; /* yes, we are multiboot */
|
return 1; /* yes, we are multiboot */
|
||||||
|
|
|
@ -742,7 +742,7 @@ static int pci_ne2000_init(PCIDevice *pci_dev)
|
||||||
if (!pci_dev->qdev.hotplugged) {
|
if (!pci_dev->qdev.hotplugged) {
|
||||||
static int loaded = 0;
|
static int loaded = 0;
|
||||||
if (!loaded) {
|
if (!loaded) {
|
||||||
rom_add_option("pxe-ne2k_pci.bin");
|
rom_add_option("pxe-ne2k_pci.bin", -1);
|
||||||
loaded = 1;
|
loaded = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1326,7 +1326,7 @@ static void n8x0_init(ram_addr_t ram_size, const char *boot_device,
|
||||||
qemu_register_reset(n8x0_boot_init, s);
|
qemu_register_reset(n8x0_boot_init, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (option_rom[0] && (boot_device[0] == 'n' || !kernel_filename)) {
|
if (option_rom[0].name && (boot_device[0] == 'n' || !kernel_filename)) {
|
||||||
int rom_size;
|
int rom_size;
|
||||||
uint8_t nolo_tags[0x10000];
|
uint8_t nolo_tags[0x10000];
|
||||||
/* No, wait, better start at the ROM. */
|
/* No, wait, better start at the ROM. */
|
||||||
|
@ -1341,7 +1341,7 @@ static void n8x0_init(ram_addr_t ram_size, const char *boot_device,
|
||||||
*
|
*
|
||||||
* The code above is for loading the `zImage' file from Nokia
|
* The code above is for loading the `zImage' file from Nokia
|
||||||
* images. */
|
* images. */
|
||||||
rom_size = load_image_targphys(option_rom[0],
|
rom_size = load_image_targphys(option_rom[0].name,
|
||||||
OMAP2_Q2_BASE + 0x400000,
|
OMAP2_Q2_BASE + 0x400000,
|
||||||
sdram_size - 0x400000);
|
sdram_size - 0x400000);
|
||||||
printf("%i bytes of image loaded\n", rom_size);
|
printf("%i bytes of image loaded\n", rom_size);
|
||||||
|
|
|
@ -238,20 +238,20 @@ static void palmte_init(ram_addr_t ram_size,
|
||||||
|
|
||||||
/* Setup initial (reset) machine state */
|
/* Setup initial (reset) machine state */
|
||||||
if (nb_option_roms) {
|
if (nb_option_roms) {
|
||||||
rom_size = get_image_size(option_rom[0]);
|
rom_size = get_image_size(option_rom[0].name);
|
||||||
if (rom_size > flash_size) {
|
if (rom_size > flash_size) {
|
||||||
fprintf(stderr, "%s: ROM image too big (%x > %x)\n",
|
fprintf(stderr, "%s: ROM image too big (%x > %x)\n",
|
||||||
__FUNCTION__, rom_size, flash_size);
|
__FUNCTION__, rom_size, flash_size);
|
||||||
rom_size = 0;
|
rom_size = 0;
|
||||||
}
|
}
|
||||||
if (rom_size > 0) {
|
if (rom_size > 0) {
|
||||||
rom_size = load_image_targphys(option_rom[0], OMAP_CS0_BASE,
|
rom_size = load_image_targphys(option_rom[0].name, OMAP_CS0_BASE,
|
||||||
flash_size);
|
flash_size);
|
||||||
rom_loaded = 1;
|
rom_loaded = 1;
|
||||||
}
|
}
|
||||||
if (rom_size < 0) {
|
if (rom_size < 0) {
|
||||||
fprintf(stderr, "%s: error loading '%s'\n",
|
fprintf(stderr, "%s: error loading '%s'\n",
|
||||||
__FUNCTION__, option_rom[0]);
|
__FUNCTION__, option_rom[0].name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
7
hw/pc.c
7
hw/pc.c
|
@ -733,7 +733,8 @@ static void load_linux(void *fw_cfg,
|
||||||
fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, setup_size);
|
fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, setup_size);
|
||||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA, setup, setup_size);
|
fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA, setup, setup_size);
|
||||||
|
|
||||||
option_rom[nb_option_roms] = "linuxboot.bin";
|
option_rom[nb_option_roms].name = "linuxboot.bin";
|
||||||
|
option_rom[nb_option_roms].bootindex = 0;
|
||||||
nb_option_roms++;
|
nb_option_roms++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -937,7 +938,7 @@ void pc_memory_init(ram_addr_t ram_size,
|
||||||
goto bios_error;
|
goto bios_error;
|
||||||
}
|
}
|
||||||
bios_offset = qemu_ram_alloc(NULL, "pc.bios", bios_size);
|
bios_offset = qemu_ram_alloc(NULL, "pc.bios", bios_size);
|
||||||
ret = rom_add_file_fixed(bios_name, (uint32_t)(-bios_size));
|
ret = rom_add_file_fixed(bios_name, (uint32_t)(-bios_size), -1);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
bios_error:
|
bios_error:
|
||||||
fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
|
fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
|
||||||
|
@ -969,7 +970,7 @@ void pc_memory_init(ram_addr_t ram_size,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nb_option_roms; i++) {
|
for (i = 0; i < nb_option_roms; i++) {
|
||||||
rom_add_option(option_rom[i]);
|
rom_add_option(option_rom[i].name, option_rom[i].bootindex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
hw/pci.c
2
hw/pci.c
|
@ -1832,7 +1832,7 @@ static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom)
|
||||||
if (class == 0x0300) {
|
if (class == 0x0300) {
|
||||||
rom_add_vga(pdev->romfile);
|
rom_add_vga(pdev->romfile);
|
||||||
} else {
|
} else {
|
||||||
rom_add_option(pdev->romfile);
|
rom_add_option(pdev->romfile, -1);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,7 +310,7 @@ static int pci_pcnet_init(PCIDevice *pci_dev)
|
||||||
if (!pci_dev->qdev.hotplugged) {
|
if (!pci_dev->qdev.hotplugged) {
|
||||||
static int loaded = 0;
|
static int loaded = 0;
|
||||||
if (!loaded) {
|
if (!loaded) {
|
||||||
rom_add_option("pxe-pcnet.bin");
|
rom_add_option("pxe-pcnet.bin", -1);
|
||||||
loaded = 1;
|
loaded = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -429,6 +429,22 @@ QemuOptsList qemu_spice_opts = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
QemuOptsList qemu_option_rom_opts = {
|
||||||
|
.name = "option-rom",
|
||||||
|
.implied_opt_name = "romfile",
|
||||||
|
.head = QTAILQ_HEAD_INITIALIZER(qemu_option_rom_opts.head),
|
||||||
|
.desc = {
|
||||||
|
{
|
||||||
|
.name = "bootindex",
|
||||||
|
.type = QEMU_OPT_NUMBER,
|
||||||
|
}, {
|
||||||
|
.name = "romfile",
|
||||||
|
.type = QEMU_OPT_STRING,
|
||||||
|
},
|
||||||
|
{ /* end if list */ }
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static QemuOptsList *vm_config_groups[32] = {
|
static QemuOptsList *vm_config_groups[32] = {
|
||||||
&qemu_drive_opts,
|
&qemu_drive_opts,
|
||||||
&qemu_chardev_opts,
|
&qemu_chardev_opts,
|
||||||
|
@ -442,6 +458,7 @@ static QemuOptsList *vm_config_groups[32] = {
|
||||||
#ifdef CONFIG_SIMPLE_TRACE
|
#ifdef CONFIG_SIMPLE_TRACE
|
||||||
&qemu_trace_opts,
|
&qemu_trace_opts,
|
||||||
#endif
|
#endif
|
||||||
|
&qemu_option_rom_opts,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
6
sysemu.h
6
sysemu.h
|
@ -139,7 +139,11 @@ extern uint64_t node_mem[MAX_NODES];
|
||||||
extern uint64_t node_cpumask[MAX_NODES];
|
extern uint64_t node_cpumask[MAX_NODES];
|
||||||
|
|
||||||
#define MAX_OPTION_ROMS 16
|
#define MAX_OPTION_ROMS 16
|
||||||
extern const char *option_rom[MAX_OPTION_ROMS];
|
typedef struct QEMUOptionRom {
|
||||||
|
const char *name;
|
||||||
|
int32_t bootindex;
|
||||||
|
} QEMUOptionRom;
|
||||||
|
extern QEMUOptionRom option_rom[MAX_OPTION_ROMS];
|
||||||
extern int nb_option_roms;
|
extern int nb_option_roms;
|
||||||
|
|
||||||
#define MAX_PROM_ENVS 128
|
#define MAX_PROM_ENVS 128
|
||||||
|
|
11
vl.c
11
vl.c
|
@ -218,7 +218,7 @@ int cursor_hide = 1;
|
||||||
int graphic_rotate = 0;
|
int graphic_rotate = 0;
|
||||||
uint8_t irq0override = 1;
|
uint8_t irq0override = 1;
|
||||||
const char *watchdog;
|
const char *watchdog;
|
||||||
const char *option_rom[MAX_OPTION_ROMS];
|
QEMUOptionRom option_rom[MAX_OPTION_ROMS];
|
||||||
int nb_option_roms;
|
int nb_option_roms;
|
||||||
int semihosting_enabled = 0;
|
int semihosting_enabled = 0;
|
||||||
int old_param = 0;
|
int old_param = 0;
|
||||||
|
@ -2520,7 +2520,14 @@ int main(int argc, char **argv, char **envp)
|
||||||
fprintf(stderr, "Too many option ROMs\n");
|
fprintf(stderr, "Too many option ROMs\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
option_rom[nb_option_roms] = optarg;
|
opts = qemu_opts_parse(qemu_find_opts("option-rom"), optarg, 1);
|
||||||
|
option_rom[nb_option_roms].name = qemu_opt_get(opts, "romfile");
|
||||||
|
option_rom[nb_option_roms].bootindex =
|
||||||
|
qemu_opt_get_number(opts, "bootindex", -1);
|
||||||
|
if (!option_rom[nb_option_roms].name) {
|
||||||
|
fprintf(stderr, "Option ROM file is not specified\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
nb_option_roms++;
|
nb_option_roms++;
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_semihosting:
|
case QEMU_OPTION_semihosting:
|
||||||
|
|
Loading…
Reference in New Issue