qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/2] fw_cfg: add fw_cfg_modify_i16 (update) meth


From: Gabriel L. Somlo
Subject: Re: [Qemu-devel] [PATCH 1/2] fw_cfg: add fw_cfg_modify_i16 (update) method
Date: Mon, 8 Jun 2015 14:26:31 -0400
User-agent: Mutt/1.5.23 (2014-03-12)

On Mon, Jun 08, 2015 at 02:10:44PM -0400, Gabriel L. Somlo wrote:
> Allow the ability to modify the value of an existing 16-bit integer
> fw_cfg item.
> 
> Signed-off-by: Gabriel Somlo <address@hidden>
> ---
> 
> Couple of thoughts:
> 
>    1. I'm thinking about pre-emptively creating _i16, _i32, and _i64
>       versions, but right now (for fixing sparc and ppc) we only need
>       the _i16 version. What to do ?

Presumably, I'll update the documentation to mention these update
functions as well (one more reason to do all three versions rather
than just _i16) :)

> 
>    2. Part of me wants to find the memory location containing the previous
>       value and simply overwrite it, but I'll need to somehow ensure the
>       blob being replaced was of the same size, etc., which could get hairy.
>       So for now I'm going with the paranoid/safe version which allocates
>       a new blob and frees the old one.
> 
> Thanks,
>   Gabriel
> 
>  hw/nvram/fw_cfg.c         | 10 ++++++++++
>  include/hw/nvram/fw_cfg.h |  1 +
>  2 files changed, 11 insertions(+)
> 
> diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
> index 68eff77..08b5cc3 100644
> --- a/hw/nvram/fw_cfg.c
> +++ b/hw/nvram/fw_cfg.c
> @@ -484,6 +484,16 @@ void fw_cfg_add_i16(FWCfgState *s, uint16_t key, 
> uint16_t value)
>      fw_cfg_add_bytes(s, key, copy, sizeof(value));
>  }
>  
> +void fw_cfg_modify_i16(FWCfgState *s, uint16_t key, uint16_t value)
> +{
> +    uint16_t *copy, *old;
> +
> +    copy = g_malloc(sizeof(value));
> +    *copy = cpu_to_le16(value);
> +    old = fw_cfg_modify_bytes_read(s, key, copy, sizeof(value));
> +    g_free(old);
> +}
> +
>  void fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value)
>  {
>      uint32_t *copy;
> diff --git a/include/hw/nvram/fw_cfg.h b/include/hw/nvram/fw_cfg.h
> index 6d8a8ac..bc6c4a0 100644
> --- a/include/hw/nvram/fw_cfg.h
> +++ b/include/hw/nvram/fw_cfg.h
> @@ -67,6 +67,7 @@ typedef void (*FWCfgReadCallback)(void *opaque, uint32_t 
> offset);
>  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);
>  void fw_cfg_add_i16(FWCfgState *s, uint16_t key, uint16_t value);
> +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);
>  void fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value);
>  void fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
> -- 
> 2.1.0
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]