On Thu, Sep 03, 2026 at 01:35:56PM -0600, Mathieu Poirier wrote:
> From: Jean-Philippe Brucker <[email protected]>
> 
> Add a function to register a notifier that is invoked when ROMs get
> loaded into guest memory.
> 
> It will be used by Arm confidential guest support, in order to register
> all blobs loaded into memory with KVM, so that their content is moved
> into Realm state and measured into the initial VM state.
> 
> Signed-off-by: Jean-Philippe Brucker <[email protected]>
> Signed-off-by: Lorenzo Pieralisi <[email protected]>
> Signed-off-by: Mathieu Poirier <[email protected]>
> ---
>  hw/core/loader.c         | 15 +++++++++++++++
>  include/hw/core/loader.h | 17 +++++++++++++++++
>  2 files changed, 32 insertions(+)
> 
> diff --git a/hw/core/loader.c b/hw/core/loader.c
> index 5cbfba0a86d2..388f10e828db 100644
> --- a/hw/core/loader.c
> +++ b/hw/core/loader.c
> @@ -74,6 +74,8 @@
>  #endif
>  
>  static int roms_loaded;
> +static NotifierList rom_loader_notifier =
> +    NOTIFIER_LIST_INITIALIZER(rom_loader_notifier);
>  
>  /* return the size or -1 if error */
>  int64_t get_image_size(const char *filename, Error **errp)
> @@ -1201,6 +1203,11 @@ MemoryRegion *rom_add_blob(const char *name, const 
> void *blob, size_t len,
>      return mr;
>  }
>  
> +void rom_add_load_notifier(Notifier *notifier)
> +{
> +    notifier_list_add(&rom_loader_notifier, notifier);
> +}
> +
>  /* This function is specific for elf program because we don't need to 
> allocate
>   * all the rom. We just allocate the first part and the rest is just zeros. 
> This
>   * is why romsize and datasize are different. Also, this function takes its 
> own
> @@ -1242,6 +1249,7 @@ ssize_t rom_add_option(const char *file, int32_t 
> bootindex)
>  static void rom_reset(void *unused)
>  {
>      Rom *rom;
> +    RomLoaderNotifyData notify;
>  
>      QTAILQ_FOREACH(rom, &roms, next) {
>          if (rom->fw_file) {
> @@ -1290,6 +1298,13 @@ static void rom_reset(void *unused)
>          address_space_flush_icache_range(rom->as, rom->addr, rom->datasize);
>  
>          trace_loader_write_rom(rom->name, rom->addr, rom->datasize, 
> rom->isrom);
> +
> +        notify = (RomLoaderNotifyData) {
> +            .addr = rom->addr,
> +            .len = rom->datasize,
> +            .data = rom->data,
> +        };
> +        notifier_list_notify(&rom_loader_notifier, &notify);

I think it will easier to review this if it's squashed into the next patch
where the fields are utilized.

-Mike

Reply via email to