فهرست منبع

fw_cfg: ignore suffixes in the bootdevice list dependent on machine class

For the older machines (such as Mac and SPARC) the DT nodes representing
bootdevices for disk nodes are irregular for mainly historical reasons.

Since the majority of bootdevice nodes for these machines either do not have a
separate disk node or require different (custom) names then it is much easier
for processing to just disable all suffixes for a particular machine.

Introduce a new ignore_boot_device_suffixes MachineClass property to control
bootdevice suffix generation, defaulting to false in order to preserve
compatibility.

Suggested-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20180810124027.10698-1-mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Mark Cave-Ayland 7 سال پیش
والد
کامیت
907aac2f6a
5فایلهای تغییر یافته به همراه9 افزوده شده و 4 حذف شده
  1. 4 1
      bootdevice.c
  2. 1 1
      hw/nvram/fw_cfg.c
  3. 2 1
      hw/ppc/spapr.c
  4. 1 0
      include/hw/boards.h
  5. 1 1
      include/sysemu/sysemu.h

+ 4 - 1
bootdevice.c

@@ -29,6 +29,7 @@
 #include "qemu/error-report.h"
 #include "qemu/error-report.h"
 #include "sysemu/reset.h"
 #include "sysemu/reset.h"
 #include "hw/qdev-core.h"
 #include "hw/qdev-core.h"
+#include "hw/boards.h"
 
 
 typedef struct FWBootEntry FWBootEntry;
 typedef struct FWBootEntry FWBootEntry;
 
 
@@ -208,11 +209,13 @@ DeviceState *get_boot_device(uint32_t position)
  * memory pointed by "size" is assigned total length of the array in bytes
  * memory pointed by "size" is assigned total length of the array in bytes
  *
  *
  */
  */
-char *get_boot_devices_list(size_t *size, bool ignore_suffixes)
+char *get_boot_devices_list(size_t *size)
 {
 {
     FWBootEntry *i;
     FWBootEntry *i;
     size_t total = 0;
     size_t total = 0;
     char *list = NULL;
     char *list = NULL;
+    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+    bool ignore_suffixes = mc->ignore_boot_device_suffixes;
 
 
     QTAILQ_FOREACH(i, &fw_boot_order, link) {
     QTAILQ_FOREACH(i, &fw_boot_order, link) {
         char *devpath = NULL,  *suffix = NULL;
         char *devpath = NULL,  *suffix = NULL;

+ 1 - 1
hw/nvram/fw_cfg.c

@@ -861,7 +861,7 @@ static void fw_cfg_machine_reset(void *opaque)
     void *ptr;
     void *ptr;
     size_t len;
     size_t len;
     FWCfgState *s = opaque;
     FWCfgState *s = opaque;
-    char *bootindex = get_boot_devices_list(&len, false);
+    char *bootindex = get_boot_devices_list(&len);
 
 
     ptr = fw_cfg_modify_file(s, "bootorder", (uint8_t *)bootindex, len);
     ptr = fw_cfg_modify_file(s, "bootorder", (uint8_t *)bootindex, len);
     g_free(ptr);
     g_free(ptr);

+ 2 - 1
hw/ppc/spapr.c

@@ -1160,7 +1160,7 @@ static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt)
     const char *boot_device = machine->boot_order;
     const char *boot_device = machine->boot_order;
     char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus);
     char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus);
     size_t cb = 0;
     size_t cb = 0;
-    char *bootlist = get_boot_devices_list(&cb, true);
+    char *bootlist = get_boot_devices_list(&cb);
 
 
     _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen"));
     _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen"));
 
 
@@ -3949,6 +3949,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     InterruptStatsProviderClass *ispc = INTERRUPT_STATS_PROVIDER_CLASS(oc);
     InterruptStatsProviderClass *ispc = INTERRUPT_STATS_PROVIDER_CLASS(oc);
 
 
     mc->desc = "pSeries Logical Partition (PAPR compliant)";
     mc->desc = "pSeries Logical Partition (PAPR compliant)";
+    mc->ignore_boot_device_suffixes = true;
 
 
     /*
     /*
      * We set up the default / latest behaviour here.  The class_init
      * We set up the default / latest behaviour here.  The class_init

+ 1 - 0
include/hw/boards.h

@@ -206,6 +206,7 @@ struct MachineClass {
     bool auto_enable_numa_with_memhp;
     bool auto_enable_numa_with_memhp;
     void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
     void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
                                  int nb_nodes, ram_addr_t size);
                                  int nb_nodes, ram_addr_t size);
+    bool ignore_boot_device_suffixes;
 
 
     HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
     HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
                                            DeviceState *dev);
                                            DeviceState *dev);

+ 1 - 1
include/sysemu/sysemu.h

@@ -182,7 +182,7 @@ void hmp_info_usb(Monitor *mon, const QDict *qdict);
 
 
 void add_boot_device_path(int32_t bootindex, DeviceState *dev,
 void add_boot_device_path(int32_t bootindex, DeviceState *dev,
                           const char *suffix);
                           const char *suffix);
-char *get_boot_devices_list(size_t *size, bool ignore_suffixes);
+char *get_boot_devices_list(size_t *size);
 
 
 DeviceState *get_boot_device(uint32_t position);
 DeviceState *get_boot_device(uint32_t position);
 void check_boot_index(int32_t bootindex, Error **errp);
 void check_boot_index(int32_t bootindex, Error **errp);