mirror of
https://github.com/mii443/qemu.git
synced 2025-12-18 06:19:07 +00:00
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:
16
hw/loader.c
16
hw/loader.c
@@ -107,7 +107,7 @@ int load_image_targphys(const char *filename,
|
||||
|
||||
size = get_image_size(filename);
|
||||
if (size > 0)
|
||||
rom_add_file_fixed(filename, addr);
|
||||
rom_add_file_fixed(filename, addr, -1);
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -557,10 +557,11 @@ static void rom_insert(Rom *rom)
|
||||
}
|
||||
|
||||
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;
|
||||
int rc, fd = -1;
|
||||
char devpath[100];
|
||||
|
||||
rom = qemu_mallocz(sizeof(*rom));
|
||||
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,
|
||||
basename);
|
||||
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;
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -22,7 +22,7 @@ void pstrcpy_targphys(const char *name,
|
||||
|
||||
|
||||
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,
|
||||
target_phys_addr_t addr);
|
||||
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 do_info_roms(Monitor *mon);
|
||||
|
||||
#define rom_add_file_fixed(_f, _a) \
|
||||
rom_add_file(_f, NULL, _a)
|
||||
#define rom_add_file_fixed(_f, _a, _i) \
|
||||
rom_add_file(_f, NULL, _a, _i)
|
||||
#define rom_add_blob_fixed(_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)
|
||||
|
||||
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
|
||||
|
||||
@@ -331,7 +331,8 @@ int load_multiboot(void *fw_cfg,
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data,
|
||||
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++;
|
||||
|
||||
return 1; /* yes, we are multiboot */
|
||||
|
||||
@@ -742,7 +742,7 @@ static int pci_ne2000_init(PCIDevice *pci_dev)
|
||||
if (!pci_dev->qdev.hotplugged) {
|
||||
static int loaded = 0;
|
||||
if (!loaded) {
|
||||
rom_add_option("pxe-ne2k_pci.bin");
|
||||
rom_add_option("pxe-ne2k_pci.bin", -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);
|
||||
}
|
||||
|
||||
if (option_rom[0] && (boot_device[0] == 'n' || !kernel_filename)) {
|
||||
if (option_rom[0].name && (boot_device[0] == 'n' || !kernel_filename)) {
|
||||
int rom_size;
|
||||
uint8_t nolo_tags[0x10000];
|
||||
/* 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
|
||||
* images. */
|
||||
rom_size = load_image_targphys(option_rom[0],
|
||||
rom_size = load_image_targphys(option_rom[0].name,
|
||||
OMAP2_Q2_BASE + 0x400000,
|
||||
sdram_size - 0x400000);
|
||||
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 */
|
||||
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) {
|
||||
fprintf(stderr, "%s: ROM image too big (%x > %x)\n",
|
||||
__FUNCTION__, rom_size, flash_size);
|
||||
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);
|
||||
rom_loaded = 1;
|
||||
}
|
||||
if (rom_size < 0) {
|
||||
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_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++;
|
||||
}
|
||||
|
||||
@@ -937,7 +938,7 @@ void pc_memory_init(ram_addr_t ram_size,
|
||||
goto bios_error;
|
||||
}
|
||||
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) {
|
||||
bios_error:
|
||||
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++) {
|
||||
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) {
|
||||
rom_add_vga(pdev->romfile);
|
||||
} else {
|
||||
rom_add_option(pdev->romfile);
|
||||
rom_add_option(pdev->romfile, -1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -310,7 +310,7 @@ static int pci_pcnet_init(PCIDevice *pci_dev)
|
||||
if (!pci_dev->qdev.hotplugged) {
|
||||
static int loaded = 0;
|
||||
if (!loaded) {
|
||||
rom_add_option("pxe-pcnet.bin");
|
||||
rom_add_option("pxe-pcnet.bin", -1);
|
||||
loaded = 1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user