Message ID | 20191016164145.115898-5-sameid@google.com |
---|---|
State | New |
Headers | show |
Series | Add Qemu to SeaBIOS LCHS interface | expand |
On 10/16/19 6:41 PM, Sam Eiderman wrote: > From: Sam Eiderman <shmuel.eiderman@oracle.com> > > Add an interface to provide direct logical CHS values for boot devices. > We will use this interface in the next commits. > > Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com> > Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com> > Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com> > Signed-off-by: Sam Eiderman <sameid@google.com> > --- > bootdevice.c | 55 +++++++++++++++++++++++++++++++++++++++++ > include/sysemu/sysemu.h | 3 +++ > 2 files changed, 58 insertions(+) > > diff --git a/bootdevice.c b/bootdevice.c > index 1d225202f9..bc5e1c2de4 100644 > --- a/bootdevice.c > +++ b/bootdevice.c > @@ -343,3 +343,58 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex, > /* initialize devices' bootindex property to -1 */ > object_property_set_int(obj, -1, name, NULL); > } > + > +typedef struct FWLCHSEntry FWLCHSEntry; > + > +struct FWLCHSEntry { > + QTAILQ_ENTRY(FWLCHSEntry) link; > + DeviceState *dev; > + char *suffix; > + uint32_t lcyls; > + uint32_t lheads; > + uint32_t lsecs; > +}; > + > +static QTAILQ_HEAD(, FWLCHSEntry) fw_lchs = > + QTAILQ_HEAD_INITIALIZER(fw_lchs); > + > +void add_boot_device_lchs(DeviceState *dev, const char *suffix, > + uint32_t lcyls, uint32_t lheads, uint32_t lsecs) > +{ > + FWLCHSEntry *node; > + > + if (!lcyls && !lheads && !lsecs) { > + return; > + } > + > + assert(dev != NULL || suffix != NULL); > + > + node = g_malloc0(sizeof(FWLCHSEntry)); > + node->suffix = g_strdup(suffix); > + node->dev = dev; > + node->lcyls = lcyls; > + node->lheads = lheads; > + node->lsecs = lsecs; > + > + QTAILQ_INSERT_TAIL(&fw_lchs, node, link); > +} > + > +void del_boot_device_lchs(DeviceState *dev, const char *suffix) > +{ > + FWLCHSEntry *i; > + > + if (dev == NULL) { > + return; > + } > + > + QTAILQ_FOREACH(i, &fw_lchs, link) { > + if ((!suffix || !g_strcmp0(i->suffix, suffix)) && > + i->dev == dev) { > + QTAILQ_REMOVE(&fw_lchs, i, link); > + g_free(i->suffix); > + g_free(i); > + > + break; > + } > + } > +} > diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h > index 44f18eb739..5bc5c79cbc 100644 > --- a/include/sysemu/sysemu.h > +++ b/include/sysemu/sysemu.h > @@ -103,6 +103,9 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex, > DeviceState *dev, Error **errp); > void restore_boot_order(void *opaque); > void validate_bootdevices(const char *devices, Error **errp); > +void add_boot_device_lchs(DeviceState *dev, const char *suffix, > + uint32_t lcyls, uint32_t lheads, uint32_t lsecs); > +void del_boot_device_lchs(DeviceState *dev, const char *suffix); > > /* handler to set the boot_device order for a specific type of MachineClass */ > typedef void QEMUBootSetHandler(void *opaque, const char *boot_order, > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
diff --git a/bootdevice.c b/bootdevice.c index 1d225202f9..bc5e1c2de4 100644 --- a/bootdevice.c +++ b/bootdevice.c @@ -343,3 +343,58 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex, /* initialize devices' bootindex property to -1 */ object_property_set_int(obj, -1, name, NULL); } + +typedef struct FWLCHSEntry FWLCHSEntry; + +struct FWLCHSEntry { + QTAILQ_ENTRY(FWLCHSEntry) link; + DeviceState *dev; + char *suffix; + uint32_t lcyls; + uint32_t lheads; + uint32_t lsecs; +}; + +static QTAILQ_HEAD(, FWLCHSEntry) fw_lchs = + QTAILQ_HEAD_INITIALIZER(fw_lchs); + +void add_boot_device_lchs(DeviceState *dev, const char *suffix, + uint32_t lcyls, uint32_t lheads, uint32_t lsecs) +{ + FWLCHSEntry *node; + + if (!lcyls && !lheads && !lsecs) { + return; + } + + assert(dev != NULL || suffix != NULL); + + node = g_malloc0(sizeof(FWLCHSEntry)); + node->suffix = g_strdup(suffix); + node->dev = dev; + node->lcyls = lcyls; + node->lheads = lheads; + node->lsecs = lsecs; + + QTAILQ_INSERT_TAIL(&fw_lchs, node, link); +} + +void del_boot_device_lchs(DeviceState *dev, const char *suffix) +{ + FWLCHSEntry *i; + + if (dev == NULL) { + return; + } + + QTAILQ_FOREACH(i, &fw_lchs, link) { + if ((!suffix || !g_strcmp0(i->suffix, suffix)) && + i->dev == dev) { + QTAILQ_REMOVE(&fw_lchs, i, link); + g_free(i->suffix); + g_free(i); + + break; + } + } +} diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 44f18eb739..5bc5c79cbc 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -103,6 +103,9 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex, DeviceState *dev, Error **errp); void restore_boot_order(void *opaque); void validate_bootdevices(const char *devices, Error **errp); +void add_boot_device_lchs(DeviceState *dev, const char *suffix, + uint32_t lcyls, uint32_t lheads, uint32_t lsecs); +void del_boot_device_lchs(DeviceState *dev, const char *suffix); /* handler to set the boot_device order for a specific type of MachineClass */ typedef void QEMUBootSetHandler(void *opaque, const char *boot_order,