On Wed, Oct 16, 2019 at 12:22 PM Sergio Lopez <s...@redhat.com> wrote: > > This allows to alter the contents of an already added item. > > Signed-off-by: Sergio Lopez <s...@redhat.com> > Reviewed-by: Michael S. Tsirkin <m...@redhat.com>
Used to fix kernel command line in following patch "hw/i386: Introduce the microvm machine type", except fw_cfg_modify_i64(). Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > include/hw/nvram/fw_cfg.h | 42 +++++++++++++++++++++++++++++++++++++++ > hw/nvram/fw_cfg.c | 29 +++++++++++++++++++++++++++ > 2 files changed, 71 insertions(+) > > diff --git a/include/hw/nvram/fw_cfg.h b/include/hw/nvram/fw_cfg.h > index 80e435d303..b5291eefad 100644 > --- a/include/hw/nvram/fw_cfg.h > +++ b/include/hw/nvram/fw_cfg.h > @@ -98,6 +98,20 @@ void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void > *data, size_t len); > */ > void fw_cfg_add_string(FWCfgState *s, uint16_t key, const char *value); > > +/** > + * fw_cfg_modify_string: > + * @s: fw_cfg device being modified > + * @key: selector key value for new fw_cfg item > + * @value: NUL-terminated ascii string > + * > + * Replace the fw_cfg item available by selecting the given key. The new > + * data will consist of a dynamically allocated copy of the provided string, > + * including its NUL terminator. The data being replaced, assumed to have > + * been dynamically allocated during an earlier call to either > + * fw_cfg_add_string() or fw_cfg_modify_string(), is freed before returning. > + */ > +void fw_cfg_modify_string(FWCfgState *s, uint16_t key, const char *value); > + > /** > * fw_cfg_add_i16: > * @s: fw_cfg device being modified > @@ -136,6 +150,20 @@ void fw_cfg_modify_i16(FWCfgState *s, uint16_t key, > uint16_t value); > */ > void fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value); > > +/** > + * fw_cfg_modify_i32: > + * @s: fw_cfg device being modified > + * @key: selector key value for new fw_cfg item > + * @value: 32-bit integer > + * > + * Replace the fw_cfg item available by selecting the given key. The new > + * data will consist of a dynamically allocated copy of the given 32-bit > + * value, converted to little-endian representation. The data being replaced, > + * assumed to have been dynamically allocated during an earlier call to > + * either fw_cfg_add_i32() or fw_cfg_modify_i32(), is freed before returning. > + */ > +void fw_cfg_modify_i32(FWCfgState *s, uint16_t key, uint32_t value); > + > /** > * fw_cfg_add_i64: > * @s: fw_cfg device being modified > @@ -148,6 +176,20 @@ void fw_cfg_add_i32(FWCfgState *s, uint16_t key, > uint32_t value); > */ > void fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value); > > +/** > + * fw_cfg_modify_i64: > + * @s: fw_cfg device being modified > + * @key: selector key value for new fw_cfg item > + * @value: 64-bit integer > + * > + * Replace the fw_cfg item available by selecting the given key. The new > + * data will consist of a dynamically allocated copy of the given 64-bit > + * value, converted to little-endian representation. The data being replaced, > + * assumed to have been dynamically allocated during an earlier call to > + * either fw_cfg_add_i64() or fw_cfg_modify_i64(), is freed before returning. > + */ > +void fw_cfg_modify_i64(FWCfgState *s, uint16_t key, uint64_t value); > + > /** > * fw_cfg_add_file: > * @s: fw_cfg device being modified > diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c > index 7dc3ac378e..aef1727250 100644 > --- a/hw/nvram/fw_cfg.c > +++ b/hw/nvram/fw_cfg.c > @@ -690,6 +690,15 @@ void fw_cfg_add_string(FWCfgState *s, uint16_t key, > const char *value) > fw_cfg_add_bytes(s, key, g_memdup(value, sz), sz); > } > > +void fw_cfg_modify_string(FWCfgState *s, uint16_t key, const char *value) > +{ > + size_t sz = strlen(value) + 1; > + char *old; > + > + old = fw_cfg_modify_bytes_read(s, key, g_memdup(value, sz), sz); > + g_free(old); > +} > + > void fw_cfg_add_i16(FWCfgState *s, uint16_t key, uint16_t value) > { > uint16_t *copy; > @@ -720,6 +729,16 @@ void fw_cfg_add_i32(FWCfgState *s, uint16_t key, > uint32_t value) > fw_cfg_add_bytes(s, key, copy, sizeof(value)); > } > > +void fw_cfg_modify_i32(FWCfgState *s, uint16_t key, uint32_t value) > +{ > + uint32_t *copy, *old; > + > + copy = g_malloc(sizeof(value)); > + *copy = cpu_to_le32(value); > + old = fw_cfg_modify_bytes_read(s, key, copy, sizeof(value)); > + g_free(old); > +} > + > void fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value) > { > uint64_t *copy; > @@ -730,6 +749,16 @@ void fw_cfg_add_i64(FWCfgState *s, uint16_t key, > uint64_t value) > fw_cfg_add_bytes(s, key, copy, sizeof(value)); > } > > +void fw_cfg_modify_i64(FWCfgState *s, uint16_t key, uint64_t value) > +{ > + uint64_t *copy, *old; > + > + copy = g_malloc(sizeof(value)); > + *copy = cpu_to_le64(value); > + old = fw_cfg_modify_bytes_read(s, key, copy, sizeof(value)); > + g_free(old); > +} > + > void fw_cfg_set_order_override(FWCfgState *s, int order) > { > assert(s->fw_cfg_order_override == 0); > -- > 2.21.0 > > -- Marc-André Lureau