bootdevice: move bootdevice related code to new file bootdevice.c
Signed-off-by: Gonglei <arei.gonglei@huawei.com> Reviewed-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
b1d28ec6a7
commit
bc74112f7e
@ -127,7 +127,7 @@ endif #CONFIG_BSD_USER
|
|||||||
# System emulator target
|
# System emulator target
|
||||||
ifdef CONFIG_SOFTMMU
|
ifdef CONFIG_SOFTMMU
|
||||||
obj-y += arch_init.o cpus.o monitor.o gdbstub.o balloon.o ioport.o numa.o
|
obj-y += arch_init.o cpus.o monitor.o gdbstub.o balloon.o ioport.o numa.o
|
||||||
obj-y += qtest.o
|
obj-y += qtest.o bootdevice.o
|
||||||
obj-y += hw/
|
obj-y += hw/
|
||||||
obj-$(CONFIG_FDT) += device_tree.o
|
obj-$(CONFIG_FDT) += device_tree.o
|
||||||
obj-$(CONFIG_KVM) += kvm-all.o
|
obj-$(CONFIG_KVM) += kvm-all.o
|
||||||
|
142
bootdevice.c
Normal file
142
bootdevice.c
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
/*
|
||||||
|
* QEMU Boot Device Implement
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 HUAWEI TECHNOLOGIES CO.,LTD.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sysemu/sysemu.h"
|
||||||
|
|
||||||
|
typedef struct FWBootEntry FWBootEntry;
|
||||||
|
|
||||||
|
struct FWBootEntry {
|
||||||
|
QTAILQ_ENTRY(FWBootEntry) link;
|
||||||
|
int32_t bootindex;
|
||||||
|
DeviceState *dev;
|
||||||
|
char *suffix;
|
||||||
|
};
|
||||||
|
|
||||||
|
static QTAILQ_HEAD(, FWBootEntry) fw_boot_order =
|
||||||
|
QTAILQ_HEAD_INITIALIZER(fw_boot_order);
|
||||||
|
|
||||||
|
void add_boot_device_path(int32_t bootindex, DeviceState *dev,
|
||||||
|
const char *suffix)
|
||||||
|
{
|
||||||
|
FWBootEntry *node, *i;
|
||||||
|
|
||||||
|
if (bootindex < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(dev != NULL || suffix != NULL);
|
||||||
|
|
||||||
|
node = g_malloc0(sizeof(FWBootEntry));
|
||||||
|
node->bootindex = bootindex;
|
||||||
|
node->suffix = g_strdup(suffix);
|
||||||
|
node->dev = dev;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(i, &fw_boot_order, link) {
|
||||||
|
if (i->bootindex == bootindex) {
|
||||||
|
fprintf(stderr, "Two devices with same boot index %d\n", bootindex);
|
||||||
|
exit(1);
|
||||||
|
} else if (i->bootindex < bootindex) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
QTAILQ_INSERT_BEFORE(i, node, link);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QTAILQ_INSERT_TAIL(&fw_boot_order, node, link);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceState *get_boot_device(uint32_t position)
|
||||||
|
{
|
||||||
|
uint32_t counter = 0;
|
||||||
|
FWBootEntry *i = NULL;
|
||||||
|
DeviceState *res = NULL;
|
||||||
|
|
||||||
|
if (!QTAILQ_EMPTY(&fw_boot_order)) {
|
||||||
|
QTAILQ_FOREACH(i, &fw_boot_order, link) {
|
||||||
|
if (counter == position) {
|
||||||
|
res = i->dev;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function returns null terminated string that consist of new line
|
||||||
|
* separated device paths.
|
||||||
|
*
|
||||||
|
* memory pointed by "size" is assigned total length of the array in bytes
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
char *get_boot_devices_list(size_t *size, bool ignore_suffixes)
|
||||||
|
{
|
||||||
|
FWBootEntry *i;
|
||||||
|
size_t total = 0;
|
||||||
|
char *list = NULL;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(i, &fw_boot_order, link) {
|
||||||
|
char *devpath = NULL, *bootpath;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (i->dev) {
|
||||||
|
devpath = qdev_get_fw_dev_path(i->dev);
|
||||||
|
assert(devpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i->suffix && !ignore_suffixes && devpath) {
|
||||||
|
size_t bootpathlen = strlen(devpath) + strlen(i->suffix) + 1;
|
||||||
|
|
||||||
|
bootpath = g_malloc(bootpathlen);
|
||||||
|
snprintf(bootpath, bootpathlen, "%s%s", devpath, i->suffix);
|
||||||
|
g_free(devpath);
|
||||||
|
} else if (devpath) {
|
||||||
|
bootpath = devpath;
|
||||||
|
} else if (!ignore_suffixes) {
|
||||||
|
assert(i->suffix);
|
||||||
|
bootpath = g_strdup(i->suffix);
|
||||||
|
} else {
|
||||||
|
bootpath = g_strdup("");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (total) {
|
||||||
|
list[total-1] = '\n';
|
||||||
|
}
|
||||||
|
len = strlen(bootpath) + 1;
|
||||||
|
list = g_realloc(list, total + len);
|
||||||
|
memcpy(&list[total], bootpath, len);
|
||||||
|
total += len;
|
||||||
|
g_free(bootpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
*size = total;
|
||||||
|
|
||||||
|
if (boot_strict && *size > 0) {
|
||||||
|
list[total-1] = '\n';
|
||||||
|
list = g_realloc(list, total + 5);
|
||||||
|
memcpy(&list[total], "HALT", 5);
|
||||||
|
*size = total + 5;
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
@ -130,6 +130,7 @@ extern int no_shutdown;
|
|||||||
extern int semihosting_enabled;
|
extern int semihosting_enabled;
|
||||||
extern int old_param;
|
extern int old_param;
|
||||||
extern int boot_menu;
|
extern int boot_menu;
|
||||||
|
extern bool boot_strict;
|
||||||
extern uint8_t *boot_splash_filedata;
|
extern uint8_t *boot_splash_filedata;
|
||||||
extern size_t boot_splash_filedata_size;
|
extern size_t boot_splash_filedata_size;
|
||||||
extern uint8_t qemu_extra_params_fw[2];
|
extern uint8_t qemu_extra_params_fw[2];
|
||||||
|
118
vl.c
118
vl.c
@ -180,23 +180,12 @@ int ctrl_grab = 0;
|
|||||||
unsigned int nb_prom_envs = 0;
|
unsigned int nb_prom_envs = 0;
|
||||||
const char *prom_envs[MAX_PROM_ENVS];
|
const char *prom_envs[MAX_PROM_ENVS];
|
||||||
int boot_menu;
|
int boot_menu;
|
||||||
static bool boot_strict;
|
bool boot_strict;
|
||||||
uint8_t *boot_splash_filedata;
|
uint8_t *boot_splash_filedata;
|
||||||
size_t boot_splash_filedata_size;
|
size_t boot_splash_filedata_size;
|
||||||
uint8_t qemu_extra_params_fw[2];
|
uint8_t qemu_extra_params_fw[2];
|
||||||
|
|
||||||
int icount_align_option;
|
int icount_align_option;
|
||||||
typedef struct FWBootEntry FWBootEntry;
|
|
||||||
|
|
||||||
struct FWBootEntry {
|
|
||||||
QTAILQ_ENTRY(FWBootEntry) link;
|
|
||||||
int32_t bootindex;
|
|
||||||
DeviceState *dev;
|
|
||||||
char *suffix;
|
|
||||||
};
|
|
||||||
|
|
||||||
static QTAILQ_HEAD(, FWBootEntry) fw_boot_order =
|
|
||||||
QTAILQ_HEAD_INITIALIZER(fw_boot_order);
|
|
||||||
|
|
||||||
int nb_numa_nodes;
|
int nb_numa_nodes;
|
||||||
int max_numa_nodeid;
|
int max_numa_nodeid;
|
||||||
@ -1246,111 +1235,6 @@ static void restore_boot_order(void *opaque)
|
|||||||
g_free(normal_boot_order);
|
g_free(normal_boot_order);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_boot_device_path(int32_t bootindex, DeviceState *dev,
|
|
||||||
const char *suffix)
|
|
||||||
{
|
|
||||||
FWBootEntry *node, *i;
|
|
||||||
|
|
||||||
if (bootindex < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(dev != NULL || suffix != NULL);
|
|
||||||
|
|
||||||
node = g_malloc0(sizeof(FWBootEntry));
|
|
||||||
node->bootindex = bootindex;
|
|
||||||
node->suffix = g_strdup(suffix);
|
|
||||||
node->dev = dev;
|
|
||||||
|
|
||||||
QTAILQ_FOREACH(i, &fw_boot_order, link) {
|
|
||||||
if (i->bootindex == bootindex) {
|
|
||||||
fprintf(stderr, "Two devices with same boot index %d\n", bootindex);
|
|
||||||
exit(1);
|
|
||||||
} else if (i->bootindex < bootindex) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
QTAILQ_INSERT_BEFORE(i, node, link);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QTAILQ_INSERT_TAIL(&fw_boot_order, node, link);
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceState *get_boot_device(uint32_t position)
|
|
||||||
{
|
|
||||||
uint32_t counter = 0;
|
|
||||||
FWBootEntry *i = NULL;
|
|
||||||
DeviceState *res = NULL;
|
|
||||||
|
|
||||||
if (!QTAILQ_EMPTY(&fw_boot_order)) {
|
|
||||||
QTAILQ_FOREACH(i, &fw_boot_order, link) {
|
|
||||||
if (counter == position) {
|
|
||||||
res = i->dev;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
counter++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function returns null terminated string that consist of new line
|
|
||||||
* separated device paths.
|
|
||||||
*
|
|
||||||
* memory pointed by "size" is assigned total length of the array in bytes
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
char *get_boot_devices_list(size_t *size, bool ignore_suffixes)
|
|
||||||
{
|
|
||||||
FWBootEntry *i;
|
|
||||||
size_t total = 0;
|
|
||||||
char *list = NULL;
|
|
||||||
|
|
||||||
QTAILQ_FOREACH(i, &fw_boot_order, link) {
|
|
||||||
char *devpath = NULL, *bootpath;
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
if (i->dev) {
|
|
||||||
devpath = qdev_get_fw_dev_path(i->dev);
|
|
||||||
assert(devpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i->suffix && !ignore_suffixes && devpath) {
|
|
||||||
size_t bootpathlen = strlen(devpath) + strlen(i->suffix) + 1;
|
|
||||||
|
|
||||||
bootpath = g_malloc(bootpathlen);
|
|
||||||
snprintf(bootpath, bootpathlen, "%s%s", devpath, i->suffix);
|
|
||||||
g_free(devpath);
|
|
||||||
} else if (devpath) {
|
|
||||||
bootpath = devpath;
|
|
||||||
} else if (!ignore_suffixes) {
|
|
||||||
assert(i->suffix);
|
|
||||||
bootpath = g_strdup(i->suffix);
|
|
||||||
} else {
|
|
||||||
bootpath = g_strdup("");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (total) {
|
|
||||||
list[total-1] = '\n';
|
|
||||||
}
|
|
||||||
len = strlen(bootpath) + 1;
|
|
||||||
list = g_realloc(list, total + len);
|
|
||||||
memcpy(&list[total], bootpath, len);
|
|
||||||
total += len;
|
|
||||||
g_free(bootpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
*size = total;
|
|
||||||
|
|
||||||
if (boot_strict && *size > 0) {
|
|
||||||
list[total-1] = '\n';
|
|
||||||
list = g_realloc(list, total + 5);
|
|
||||||
memcpy(&list[total], "HALT", 5);
|
|
||||||
*size = total + 5;
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QemuOptsList qemu_smp_opts = {
|
static QemuOptsList qemu_smp_opts = {
|
||||||
.name = "smp-opts",
|
.name = "smp-opts",
|
||||||
.implied_opt_name = "cpus",
|
.implied_opt_name = "cpus",
|
||||||
|
Loading…
Reference in New Issue
Block a user