From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976533; cv=none; d=zohomail.com; s=zohoarc; b=Sb309paEvOvCibcFelmusUvqtNweOPsdeieqgwqL/4ibA0N0gV+7WVPiCNS9eOJ6aNHcMImBOti97mVkAPBQNq44qzJlXj0WO1l/xh4M/7vLrbkD/rBf2q0K/nK2kcgz3I0sXguTzt73gGG3MfcnXH4K+0AlBrTv1QO23yalXLo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976533; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0fI9JZRfoTYevOhwLW01o4u8d5VRWRzVxD6hY9gyUnU=; b=SZdWe9sQb3IWrYUFxiraH7uvPbz0u4SZMJqi6HT1Jyj15pjECPBUOjKVlvYvKlyITR+Z8KyluGYgl8ZdygwynENY6ylvFsOURP1SWcy4MO4ed4SuwflrJi68hPzs+suh1QXFLtRs+nayPf9FKz02AK6d8fbP/8zTtfeLogG7GSI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976533930546.6474271740109; Mon, 17 Aug 2026 07:22:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyCh-000058-N9; Mon, 17 Aug 2026 10:20:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCd-0008Vw-Qz for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:41 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCb-0002c4-QY for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:39 -0400 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-448-MGQWK9g1Pn2O2ji86V6QOw-1; Mon, 17 Aug 2026 10:20:35 -0400 Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2ce8a76df2dso79178065ad.2 for ; Mon, 17 Aug 2026 07:20:35 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.20.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:20:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976437; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0fI9JZRfoTYevOhwLW01o4u8d5VRWRzVxD6hY9gyUnU=; b=hLj43nu1Ryebz5IwRQeqzCLTyYXMOgJ3QI3P5GRgs6UdmH8mdnHSKmnw9ba9RdhpXtpUo8 DSf/XzGcg+zVnxltxR0cDrNgdbwCHbMZKlUixCiWSq6h3I4XdwpnPcznEXKvKUgSIjfTAn cNYyFFOx2QdarTiSjtRG1TMWb5zi684= X-MC-Unique: MGQWK9g1Pn2O2ji86V6QOw-1 X-Mimecast-MFC-AGG-ID: MGQWK9g1Pn2O2ji86V6QOw_1786976435 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976434; x=1787581234; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0fI9JZRfoTYevOhwLW01o4u8d5VRWRzVxD6hY9gyUnU=; b=oXp+jwxx3qBaenfh5iSZNvcpPQjdyEooMkKYp4BGb0wnrW//Z7XVXma1PXx7g60QD3 2QqjjHc122kn/N+ZP8ZiB7uTV+rxPvSlw3+OzWsstVNmHNDbfmzArkn6zA8J8RQ8Cox0 E4QLoO2hFspMZJJFEeG6PvPk/6/X1C8RFrMj3mhfBxe1JX1Q61vkpZ/vyoLssfMH+5wb L/nwrkKXG79Kxp6Jrd8O9sqngcYJlWqUKUUd0S+qrRA0jYdCQWK1oa2g+BtXqouCkvLv nNynZQEfxhhZBmzIta7zfWf44CVX7q7nn+hL9TuDlgFolBw0X2OhLMXhJUFQKmmCIyq1 A8yA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976434; x=1787581234; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=0fI9JZRfoTYevOhwLW01o4u8d5VRWRzVxD6hY9gyUnU=; b=Cwph9lfk4ZdX159cyUfkwdMKbqcmJbIFSVuid1ItCwBiKmeYUoWR1x9zfCp+FfBH7B aNtSD03FAmucb6zdqb+7R/AfW6jO/j5Ag29A1+tmOi6O6RSqwor5OctX0kRRCW3v38Yp 8rJ66GOGrElk/O2gWBVV8MkKgjjvcK+JFki/C3sfk5jAp+XglcyM6gC8X9TKq8m5r/4E fOWSY3jHLwwYz88uYfq3zbEYQ+VRmGFLg5duwLpltZH7tzLEyTJ+p4+1y2S5j5CziUA2 QcFXzCQpTgyHQdxu7wD0iBsFqma5QLCFF+A+elPFyHpdqNV882BTKXExKvD6r6ry987G F0Zg== X-Forwarded-Encrypted: i=1; AHgh+RpL5Eu315NeCHkI5deeeALGo5HN1iUuFnnmxcpCmmUijr4PMtiBELBYB4+/1keABnx1nj+w69z428Rp@nongnu.org X-Gm-Message-State: AOJu0Yx1LhknpJmseqdfiQ0hFKOQxR/1YmWMFHBC9KAD+iqp6DCnf61v zjQeBZZKwdWzU1WhkqjQUDfliQLAcDifCtioZW0WVdijj3u6e7Y3Tw8/QBG8De8f9P1va+slGYm hTWrs5UWNGPMt2DOP8nB2DGzhro++bmAAVonkM/h8ckj1hyWuRI9typMV X-Gm-Gg: AR+sD121TQDwebkA+zBX4az9Z1GDGvvzFBxG2r4QsJtHE9/eqs/la6zyMSlB1+4bp0l p1qTsBYx9hmMim+SHrFQfue8+UjW0K4/8FdI2kWcFy6Qvy2iN88MOi2Aw4u6cA/xhkUc+Rg0k9W 9jxSNI/Lv1MMFwS1DxstApndn37bx4S12qxzUAFr2ppywa7vLUI77c48Q6Upv7/UeSFAXIMxjcq YsARwxYIw83jvoySGFAlVpaEwR4NZY7GbqtJ59BreTdfhB199cGtRWHZZJtDvpINEezc/z9JoiG BWO41PFcliash9Y+TVujQMGZ7cwhNoCw5CsYlNxjCfgwysIu2IXiIrxTaZiNd0C9J99E1b1SdQy RCPQ3qVwxXj4zEolfLIyUnd9C/Xyu7Gr8Tw== X-Received: by 2002:a17:902:f691:b0:2ca:481:de45 with SMTP id d9443c01a7336-2d5c4f3b815mr6704595ad.6.1786976434425; Mon, 17 Aug 2026 07:20:34 -0700 (PDT) X-Received: by 2002:a17:902:f691:b0:2ca:481:de45 with SMTP id d9443c01a7336-2d5c4f3b815mr6704045ad.6.1786976433809; Mon, 17 Aug 2026 07:20:33 -0700 (PDT) From: Ani Sinha To: Gerd Hoffmann , Stefano Garzarella , Ani Sinha Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org Subject: [PATCH v6 01/11] igvm: store IgvmCfg pointer in QIgvm Date: Mon, 17 Aug 2026 19:49:56 +0530 Message-ID: <20260817142010.80693-2-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976535297158500 Content-Type: text/plain; charset="utf-8" From: Gerd Hoffmann Store a pointer to IgvmCfg instead of only IgvmFile in QIgvm. Allows to store additional state in the (persistent) IgvmCfg struct. Reviewed-by: Ani Sinha Reviewed-by: Alexander Graf Signed-off-by: Gerd Hoffmann --- backends/igvm.c | 57 ++++++++++++++++++++-------------- include/system/igvm-internal.h | 2 +- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/backends/igvm.c b/backends/igvm.c index 80e87fe602..534032fed8 100644 --- a/backends/igvm.c +++ b/backends/igvm.c @@ -178,7 +178,8 @@ static int qigvm_handler(QIgvm *ctx, IgvmVariableHeader= Type raw_type, if (handlers[handler].type !=3D type) { continue; } - header_handle =3D igvm_get_header(ctx->file, handlers[handler].sec= tion, + header_handle =3D igvm_get_header(ctx->cfg->file, + handlers[handler].section, ctx->current_header_index); if (header_handle < 0) { error_setg( @@ -187,7 +188,7 @@ static int qigvm_handler(QIgvm *ctx, IgvmVariableHeader= Type raw_type, (int)header_handle); return -1; } - header_data =3D igvm_get_buffer(ctx->file, header_handle); + header_data =3D igvm_get_buffer(ctx->cfg->file, header_handle); if (header_data !=3D NULL) { header_data +=3D sizeof(IGVM_VHS_VARIABLE_HEADER); result =3D handlers[handler].handler(ctx, header_data, errp); @@ -198,7 +199,7 @@ static int qigvm_handler(QIgvm *ctx, IgvmVariableHeader= Type raw_type, header_handle, type); result =3D -1; } - igvm_free_buffer(ctx->file, header_handle); + igvm_free_buffer(ctx->cfg->file, header_handle); return result; } =20 @@ -344,7 +345,8 @@ static int qigvm_process_mem_region(QIgvm *ctx, unsigne= d start_index, =20 for (page_index =3D 0; page_index < page_count; page_index++) { data_handle =3D igvm_get_header_data( - ctx->file, IGVM_HEADER_SECTION_DIRECTIVE, page_index + start_i= ndex); + ctx->cfg->file, IGVM_HEADER_SECTION_DIRECTIVE, + page_index + start_index); if (data_handle =3D=3D IGVMAPI_NO_DATA) { /* No data indicates a zero page */ memset(®ion[page_index * page_size], 0, page_size); @@ -357,7 +359,7 @@ static int qigvm_process_mem_region(QIgvm *ctx, unsigne= d start_index, return -1; } else { zero =3D false; - data_size =3D igvm_get_buffer_size(ctx->file, data_handle); + data_size =3D igvm_get_buffer_size(ctx->cfg->file, data_handle= ); if (data_size < page_size) { memset(®ion[page_index * page_size], 0, page_size); } else if (data_size > page_size) { @@ -367,14 +369,14 @@ static int qigvm_process_mem_region(QIgvm *ctx, unsig= ned start_index, page_index + start_index); return -1; } - data =3D igvm_get_buffer(ctx->file, data_handle); + data =3D igvm_get_buffer(ctx->cfg->file, data_handle); if (data =3D=3D NULL) { error_setg(errp, "IGVM: No buffer for handle %d", data_han= dle); - igvm_free_buffer(ctx->file, data_handle); + igvm_free_buffer(ctx->cfg->file, data_handle); return -1; } memcpy(®ion[page_index * page_size], data, data_size); - igvm_free_buffer(ctx->file, data_handle); + igvm_free_buffer(ctx->cfg->file, data_handle); } } =20 @@ -411,7 +413,8 @@ static int qigvm_process_mem_page(QIgvm *ctx, ctx->region_start =3D page_data->gpa; ctx->region_start_index =3D ctx->current_header_index; } else { - if (!qigvm_page_attrs_equal(ctx->file, ctx->current_header_ind= ex, + if (!qigvm_page_attrs_equal(ctx->cfg->file, + ctx->current_header_index, page_data, &ctx->region_prev_page_data) || ((ctx->region_prev_page_data.gpa + @@ -474,7 +477,8 @@ static int qigvm_directive_vp_context(QIgvm *ctx, const= uint8_t *header_data, return 0; } =20 - data_handle =3D igvm_get_header_data(ctx->file, IGVM_HEADER_SECTION_DI= RECTIVE, + data_handle =3D igvm_get_header_data(ctx->cfg->file, + IGVM_HEADER_SECTION_DIRECTIVE, ctx->current_header_index); if (data_handle < 0) { error_setg(errp, "Invalid VP context in IGVM file. Error code: %X", @@ -482,7 +486,7 @@ static int qigvm_directive_vp_context(QIgvm *ctx, const= uint8_t *header_data, return -1; } =20 - data =3D (uint8_t *)igvm_get_buffer(ctx->file, data_handle); + data =3D (uint8_t *)igvm_get_buffer(ctx->cfg->file, data_handle); if (data =3D=3D NULL) { error_setg(errp, "IGVM: No buffer for handle %d", data_handle); result =3D -1; @@ -491,7 +495,8 @@ static int qigvm_directive_vp_context(QIgvm *ctx, const= uint8_t *header_data, =20 if (ctx->machine_state->cgs) { result =3D ctx->cgsc->set_guest_state( - vp_context->gpa, data, igvm_get_buffer_size(ctx->file, data_ha= ndle), + vp_context->gpa, data, + igvm_get_buffer_size(ctx->cfg->file, data_handle), CGS_PAGE_TYPE_VMSA, vp_context->vp_index, errp); } else if (target_arch() =3D=3D SYS_EMU_TARGET_X86_64) { result =3D qigvm_x86_set_vp_context(data, vp_context->vp_index, er= rp); @@ -504,7 +509,7 @@ static int qigvm_directive_vp_context(QIgvm *ctx, const= uint8_t *header_data, } =20 exit: - igvm_free_buffer(ctx->file, data_handle); + igvm_free_buffer(ctx->cfg->file, data_handle); if (result < 0) { return result; } @@ -863,7 +868,8 @@ static int qigvm_supported_platform_compat_mask(QIgvm *= ctx, Error **errp) uint32_t compatibility_mask_sev_snp =3D 0; uint32_t compatibility_mask =3D 0; =20 - header_count =3D igvm_header_count(ctx->file, IGVM_HEADER_SECTION_PLAT= FORM); + header_count =3D igvm_header_count(ctx->cfg->file, + IGVM_HEADER_SECTION_PLATFORM); if (header_count < 0) { error_setg(errp, "Invalid platform header count in IGVM file. Error code= : %X", @@ -874,11 +880,11 @@ static int qigvm_supported_platform_compat_mask(QIgvm= *ctx, Error **errp) for (header_index =3D 0; header_index < (unsigned)header_count; header_index++) { IgvmVariableHeaderType typ =3D igvm_get_header_type( - ctx->file, IGVM_HEADER_SECTION_PLATFORM, header_index); + ctx->cfg->file, IGVM_HEADER_SECTION_PLATFORM, header_index); typ =3D igvm_vht_type(typ); if (typ =3D=3D IGVM_VHT_SUPPORTED_PLATFORM) { header_handle =3D igvm_get_header( - ctx->file, IGVM_HEADER_SECTION_PLATFORM, header_index); + ctx->cfg->file, IGVM_HEADER_SECTION_PLATFORM, header_index= ); if (header_handle < 0) { error_setg(errp, "Invalid platform header in IGVM file. " @@ -887,11 +893,11 @@ static int qigvm_supported_platform_compat_mask(QIgvm= *ctx, Error **errp) return -1; } platform =3D - (IGVM_VHS_SUPPORTED_PLATFORM *)(igvm_get_buffer(ctx->file, + (IGVM_VHS_SUPPORTED_PLATFORM *)(igvm_get_buffer(ctx->cfg->= file, header_han= dle)); if (platform =3D=3D NULL) { error_setg(errp, "IGVM: No buffer for handle %d", header_h= andle); - igvm_free_buffer(ctx->file, header_handle); + igvm_free_buffer(ctx->cfg->file, header_handle); return -1; } =20 @@ -922,7 +928,7 @@ static int qigvm_supported_platform_compat_mask(QIgvm *= ctx, Error **errp) } else if (platform->platform_type =3D=3D IGVM_PLATFORM_TYPE_N= ATIVE) { compatibility_mask =3D platform->compatibility_mask; } - igvm_free_buffer(ctx->file, header_handle); + igvm_free_buffer(ctx->cfg->file, header_handle); } } /* Choose the strongest supported isolation technology */ @@ -999,7 +1005,7 @@ int qigvm_process_file(IgvmCfg *cfg, MachineState *mac= hine_state, error_setg(errp, "No IGVM file loaded."); return -1; } - ctx.file =3D cfg->file; + ctx.cfg =3D cfg; trace_igvm_process_file(cfg->file, onlyVpContext); =20 ctx.machine_state =3D machine_state; @@ -1021,7 +1027,8 @@ int qigvm_process_file(IgvmCfg *cfg, MachineState *ma= chine_state, goto cleanup; } =20 - header_count =3D igvm_header_count(ctx.file, IGVM_HEADER_SECTION_DIREC= TIVE); + header_count =3D igvm_header_count(ctx.cfg->file, + IGVM_HEADER_SECTION_DIRECTIVE); if (header_count <=3D 0) { error_setg( errp, "Invalid directive header count in IGVM file. Error code= : %X", @@ -1035,7 +1042,8 @@ int qigvm_process_file(IgvmCfg *cfg, MachineState *ma= chine_state, ctx.current_header_index < (unsigned)header_count; ctx.current_header_index++) { IgvmVariableHeaderType raw_type =3D igvm_get_header_type( - ctx.file, IGVM_HEADER_SECTION_DIRECTIVE, ctx.current_header_in= dex); + ctx.cfg->file, IGVM_HEADER_SECTION_DIRECTIVE, + ctx.current_header_index); if (!onlyVpContext || igvm_vht_type(raw_type) =3D=3D IGVM_VHT_VP_C= ONTEXT) { if (qigvm_handler(&ctx, raw_type, errp) < 0) { goto cleanup_parameters; @@ -1053,7 +1061,7 @@ int qigvm_process_file(IgvmCfg *cfg, MachineState *ma= chine_state, } =20 header_count =3D - igvm_header_count(ctx.file, IGVM_HEADER_SECTION_INITIALIZATION); + igvm_header_count(ctx.cfg->file, IGVM_HEADER_SECTION_INITIALIZATIO= N); if (header_count < 0) { error_setg( errp, @@ -1066,7 +1074,8 @@ int qigvm_process_file(IgvmCfg *cfg, MachineState *ma= chine_state, ctx.current_header_index < (unsigned)header_count; ctx.current_header_index++) { IgvmVariableHeaderType type =3D - igvm_get_header_type(ctx.file, IGVM_HEADER_SECTION_INITIALIZAT= ION, + igvm_get_header_type(ctx.cfg->file, + IGVM_HEADER_SECTION_INITIALIZATION, ctx.current_header_index); if (qigvm_handler(&ctx, type, errp) < 0) { goto cleanup_parameters; diff --git a/include/system/igvm-internal.h b/include/system/igvm-internal.h index 7eb3792ed8..b5720fae0c 100644 --- a/include/system/igvm-internal.h +++ b/include/system/igvm-internal.h @@ -43,7 +43,7 @@ typedef struct QIgvmParameterData { * file. */ struct QIgvm { - IgvmHandle file; + IgvmCfg *cfg; MachineState *machine_state; ConfidentialGuestSupportClass *cgsc; uint32_t compatibility_mask; --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976469; cv=none; d=zohomail.com; s=zohoarc; b=OTdoToIMSCe6MSE+5SVw1JnouTAnLWDyvWDhQuBJx+E/8atbWzKjgHAlkDUJDEySuaJMJlVYi9Rk7n9OoHLC1YqgMvhOqGKRQykP9HHuxI1mOuBg8EBpUknYlupEP4pt8erxSSbad2YmNRIpWybZ5bx17fKXG/VcGh/6hkb4EbA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976469; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=HNWWes4hozHIIm8ixM4SKBd90yNYXauRvQz5BFyDsnY=; b=NXBu5XoV3TI5FHKy5kWbPSXW/gfJgN28vFFX3L6uxPMKxpdyqug96Ex8ognD78R6XJ45bNEFfTEaTibekK32pf+o4Y0MsnpWL7I1EWdgrZRSdGEJXQd4//DMZuB22xxXptaEz08RXtRKqaEoOD8HWJoLUFvjRdhekKn7DJpMJm8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976469887482.437354536779; Mon, 17 Aug 2026 07:21:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyCj-00005L-Gv; Mon, 17 Aug 2026 10:20:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCh-0008WR-DY for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:43 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCf-0002dU-Kz for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:43 -0400 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-358-970voelaOuy0_jbh-UhczQ-1; Mon, 17 Aug 2026 10:20:39 -0400 Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2cea6a46766so60276155ad.0 for ; Mon, 17 Aug 2026 07:20:39 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.20.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:20:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976441; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HNWWes4hozHIIm8ixM4SKBd90yNYXauRvQz5BFyDsnY=; b=g784Gck2up/YoKLM4yvr8IAySMN2E1uXYsDHBj2tKvjArvVXOlovtWAklHvno0x9A4iHAm Wi+pfN2TQqFlnt7rdleDtXbzeJLy1A/P06nRxanldXNz+QfbWdafl/RiaArbIO6x0buSuW keT7G5g39WeL4QMn22oYUjhVqoLk6Og= X-MC-Unique: 970voelaOuy0_jbh-UhczQ-1 X-Mimecast-MFC-AGG-ID: 970voelaOuy0_jbh-UhczQ_1786976438 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976438; x=1787581238; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HNWWes4hozHIIm8ixM4SKBd90yNYXauRvQz5BFyDsnY=; b=mDLCV8i7YCZNiZk/BR6AsIoiL8hhb2fyNYsr3sBH3xm0nONq8uIyGCxRSyer6n3CbX ZJ0XqaukWd2Xgeo9SgZpSl3S9UjoRLL+Vw3PcD6eRgwFO/xf0vWseLdzZjKtC8IXhX/B GFjgv+M2SvumOGZF+NMUj9AXgLsDfsLlfq3a8+Q47spL9HttMvB1mDBjtdVWXZ6tBUuW l2FumQFUxnwIqSc+mc3NSXx0e74bK9nD7DyKENwT9nDEsSpgaHBSoLYXNDGybqt65oii CVP9uh9mxy2FlKuG4EmQoNvhcuiqMmLRcjAHz81adci40+hMIdpls0qF8AdIgLBQG7+C Cu9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976438; x=1787581238; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=HNWWes4hozHIIm8ixM4SKBd90yNYXauRvQz5BFyDsnY=; b=bvBHycV6QU0n4bSNB9kIzLEAAIUmHsE/PsFQ+KY5UUN3T2SM5S47qG44C95AF78pV2 xJade0DHm6xM9QVh0LMm166LX4pNtvSqdAuhaY/7YZXhxkmRzEK9N/im9Ad1jVQ0nF0Q hv0sKfCsbDzD3L8L3uL463uJDFsG9arVSRTryUnhYWLNtVmSfjYwXZitMAhvLiLKE8Zg FAp1JDerGTbRFrLChC449mJsmLMmiqtbcVmm62nDTmNqjy4ASZki6G+UVnesBQQ3YJkA dnqLcqz+U1fXG11PmDq5fp4rgiQSarLdBGNtAVnaK2d7yfNN6sby7HD4b/URdc55nFNx 69KQ== X-Forwarded-Encrypted: i=1; AHgh+RpPk3y56H1zodYZVoc2NkDF2B20zCkH0VLDrPWWmzyQ0xFiQrJ9BXJdmyFEsz+tPYxsnxRW7Ep/COII@nongnu.org X-Gm-Message-State: AOJu0YyY67EQI0KbriiUjtr2Bd32uuI7JrWK8wkO5RMNnAKyjDXJfa6Z ogbjOiM2/dahcm/xr4XDzOOvh2t77qlPcldtRX/LueKOtqKjz+1NiTaaYtM8XvzA6RYo6dyGvRQ LtoD7kLaqBmzFWjAfGdqEuTEkFVo1CtV1JMm5RcZ1JacntdtkYjEmUqAm X-Gm-Gg: AR+sD13tmjq8OAtiGQhClVdtg8ys62FKuTYWA8AFwNA7vqjv6dEFr3BYGlesHEuEmSG ytYo+WAiT2IM1LnzmKqo6wQOuSCnS0fRKLtGZbuJ782KfR9UHPBhDFpdKtVDk3uKMZov9nsGHzV CpoD44hWJsFCkasYdfGeP4YQSktSKXrIQGADs2Qs6TYgpg4E1xBbJB5QP3dlN5yjI72SJR/rZ5j ZGnntcfgUSsjD7CT1p0sTwUd8Wag1mFIzoHML9CJ4KVQh1Ik/EbFodNV58AwVu5LVKdaOSonHrB AvqamY77BlvDeU11SyDLkc8ufKFGW0ZcSv6QN8/3trgwYEGHBwfCR8V+Qw/BirxawKcjG/CIJDm v5NUSJM8f/ZYijt63+DW+EbPCpCIVC3To9g== X-Received: by 2002:a17:902:f788:b0:2cf:a1c0:d4ca with SMTP id d9443c01a7336-2d5c5479555mr6150765ad.22.1786976437949; Mon, 17 Aug 2026 07:20:37 -0700 (PDT) X-Received: by 2002:a17:902:f788:b0:2cf:a1c0:d4ca with SMTP id d9443c01a7336-2d5c5479555mr6150255ad.22.1786976437525; Mon, 17 Aug 2026 07:20:37 -0700 (PDT) From: Ani Sinha To: Gerd Hoffmann , Stefano Garzarella , Ani Sinha Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org Subject: [PATCH v6 02/11] igvm: track memory regions Date: Mon, 17 Aug 2026 19:49:57 +0530 Message-ID: <20260817142010.80693-3-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976471369158500 Content-Type: text/plain; charset="utf-8" From: Gerd Hoffmann Memory regions added by the current IGVM needs to be tracked so that they c= an be freed when a new IGVM is loaded. Reviewed-by: Ani Sinha Reviewed-by: Alexander Graf Signed-off-by: Gerd Hoffmann --- backends/igvm-cfg.c | 1 + backends/igvm.c | 20 ++++++++++++-------- include/system/igvm-internal.h | 6 ++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/backends/igvm-cfg.c b/backends/igvm-cfg.c index e1f09855f6..38438a7b1e 100644 --- a/backends/igvm-cfg.c +++ b/backends/igvm-cfg.c @@ -65,6 +65,7 @@ static void igvm_complete(UserCreatable *uc, Error **errp) IgvmCfg *igvm =3D IGVM_CFG(uc); =20 igvm->file =3D qigvm_file_init(igvm->filename, errp); + QTAILQ_INIT(&igvm->memory_regions); } =20 OBJECT_DEFINE_TYPE_WITH_INTERFACES(IgvmCfg, igvm_cfg, IGVM_CFG, OBJECT, diff --git a/backends/igvm.c b/backends/igvm.c index 534032fed8..9e7c90d386 100644 --- a/backends/igvm.c +++ b/backends/igvm.c @@ -220,7 +220,7 @@ static void *qigvm_prepare_memory(QIgvm *ctx, uint64_t = addr, uint64_t size, int region_identifier, Error **errp) { ERRP_GUARD(); - MemoryRegion *igvm_pages =3D NULL; + IgvmMemoryRegion *imr =3D NULL; Int128 gpa_region_size; MemoryRegionSection mrs =3D memory_region_find(get_system_memory(), addr, size); @@ -254,23 +254,27 @@ static void *qigvm_prepare_memory(QIgvm *ctx, uint64_= t addr, uint64_t size, */ g_autofree char *region_name =3D g_strdup_printf("igvm.%X", region_identifier); - igvm_pages =3D g_new0(MemoryRegion, 1); + imr =3D g_new0(IgvmMemoryRegion, 1); + imr->mr =3D g_new0(MemoryRegion, 1); if (ctx->machine_state->cgs && ctx->machine_state->cgs->require_guest_memfd) { - if (!memory_region_init_ram_guest_memfd(igvm_pages, NULL, + if (!memory_region_init_ram_guest_memfd(imr->mr, NULL, region_name, size, err= p)) { - g_free(igvm_pages); + g_free(imr->mr); + g_free(imr); return NULL; } } else { - if (!memory_region_init_ram(igvm_pages, NULL, region_name, siz= e, + if (!memory_region_init_ram(imr->mr, NULL, region_name, size, errp)) { - g_free(igvm_pages); + g_free(imr->mr); + g_free(imr); return NULL; } } - memory_region_add_subregion(get_system_memory(), addr, igvm_pages); - return memory_region_get_ram_ptr(igvm_pages); + memory_region_add_subregion(get_system_memory(), addr, imr->mr); + QTAILQ_INSERT_TAIL(&ctx->cfg->memory_regions, imr, next); + return memory_region_get_ram_ptr(imr->mr); } } =20 diff --git a/include/system/igvm-internal.h b/include/system/igvm-internal.h index b5720fae0c..9e9fa1d9af 100644 --- a/include/system/igvm-internal.h +++ b/include/system/igvm-internal.h @@ -18,6 +18,11 @@ #include "system/confidential-guest-support.h" #include =20 +typedef struct IgvmMemoryRegion { + QTAILQ_ENTRY(IgvmMemoryRegion) next; + MemoryRegion *mr; +} IgvmMemoryRegion; + struct IgvmCfg { Object parent_obj; =20 @@ -29,6 +34,7 @@ struct IgvmCfg { char *filename; IgvmHandle file; ResettableState reset_state; + QTAILQ_HEAD(, IgvmMemoryRegion) memory_regions; }; =20 typedef struct QIgvmParameterData { --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976481; cv=none; d=zohomail.com; s=zohoarc; b=iGnZeyPjFR6TeTZKDooDKcXOyLb9EMN/P/fRr5CB5nciOFzM9z+WXCQJwEV5YjnxjkJTBB+fRvAtDNFUeBcboHCbGQdouTDqeUqs9ls9oZA324kY2DULP1sNlzAszTmwF7wSDuInNjHuy5/hMVlD4eILUio+54fm4e8tdAY2CrA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976481; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=oyr4GIu9nnuR3+KUBEFmE8MavH0ehn7PwDYD/eNOVzQ=; b=PofiEVYmI6nCDxYItqWio93W07yuBh4P1b3tfqeYzxqr3Q6lXBGTzHrSZpHImi+ym2A96aRCbOJl8ciepq6ztcJt5PC2W0tjtgnSuf5LRL3ZFeNMUe2DGTUdEczwK/511dt6PbuoozbYo5jTkh3hJnUh1AwVpCbgIKh1iTLv/l4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976481767766.005779237851; Mon, 17 Aug 2026 07:21:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyCo-00005u-PL; Mon, 17 Aug 2026 10:20:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCk-00005c-MZ for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:46 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCj-0002eA-63 for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:46 -0400 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-561-567MciMqPBmysyzewZTSyw-1; Mon, 17 Aug 2026 10:20:42 -0400 Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2cceabd70f5so82359495ad.1 for ; Mon, 17 Aug 2026 07:20:42 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.20.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:20:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976444; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oyr4GIu9nnuR3+KUBEFmE8MavH0ehn7PwDYD/eNOVzQ=; b=LNXXYmJ1F5I582SjwuT9Bph3wd1nFt95rArVEOb6ZBlhDNenmf7kNEHAAxb6oAqATA+MbX psIxkvxKmFW6b+lgkRhG6dy0gd6xtiZBu0EcC6Xy4x8pPtvrQJBD/7Lm3/tsmD8v0wJbLH 7rmrUL21r9Bsk9fTrMJ60z2LALIn730= X-MC-Unique: 567MciMqPBmysyzewZTSyw-1 X-Mimecast-MFC-AGG-ID: 567MciMqPBmysyzewZTSyw_1786976442 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976442; x=1787581242; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=oyr4GIu9nnuR3+KUBEFmE8MavH0ehn7PwDYD/eNOVzQ=; b=V721GmB3hiUYBf39TXH8MD6Lf5RvBcYo2rABbgnvz6lLZJbEyyP/SHnxcNgxH1zC8O V5bwSOMmlFOvtRIEKLiTysJjbmBIuyO62SRxO6roBeuqK6YCuHXF3nsBwOHf64Xajtat jVk5Z08qSfLDWZ/Wj8MONdbCGpGBai0oQ7QCSerCGqju8qCDtb/cI9BNy/OsE9ji++5u jsKoQuwVqfFtGd2w5N/LFM1a0lNn3UhEQ3vKHP4uogY9RcaT84XDc4Yh8KtoIJ51xeR9 THQsD7qxGnXezdDd3MLAUZl9WHQFWHcOAWQ5QapZNOuNj7CMKNuqkoG31Pm/gbAbGJKJ /+DA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976442; x=1787581242; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=oyr4GIu9nnuR3+KUBEFmE8MavH0ehn7PwDYD/eNOVzQ=; b=bckpHefaiwc9R0Ept/sQ35wxZtTckxB87917mhvezomVJQr77etWgE2IG1bWX7yJ/0 UlvNk4gViqavAQu1g6/nXGhQSAALyYS9g5Wkhgm46AuVKIjnbaJbbGbcy/LfmqEci37A PSbsiXnSddW9ppWmgjKCw0SnV1VIwIsqVlS6xLyankpAlHbJaOb6nfZE+f+fkEvwTSrf 0tVD5QgnhlrJQLTDGhnSy9vxCS4iMcatHUXQsDah/s8c0VOi9d7frARSGSzsxomPTG7A 5pGamLrK38+hJpBcfxrNc5LePvqjz470+7KcENzB8ptKr58cASzqevkXJf2GDl7ZcYS0 C6pg== X-Forwarded-Encrypted: i=1; AHgh+Ro1WxTqOn0HUVXfXa3By9S/fVcsDYz5QPWhkKSCG80UNNmgaWwrhn/xMAK6mZwOc4VPN0/4PJieLp3e@nongnu.org X-Gm-Message-State: AOJu0Ywk/jsQQlMZxgcU/CDb1qoIZwdq2jIRc7WYQJjgw8MQJ50Lx/Qu qAdbBd9OWCznloQfOXhQGHCP2BZHEZ9ywR+tkBsdR127JsKA5Dw6GE+6gI1dE4LxKaaAHTAsVUH Gs2u981omHE2mnfuL8zTgoiyrI96ykLnXlcIsSsZExImtvALKoD8hc6gE X-Gm-Gg: AR+sD121DeWC6L/x8S+x5pmyqK/OhOTlmrbz+K054kW8Q1ZMvTrqMD2eXuhaxZz7O9u kh4MAjezkIV+pR/nFRNM/1B/7sd0nmrUvFlAv0YsZyIGERZOddw2Y/9Mi9REYZupEg3lzbreS1t cMcBSKqGDkQR5NmfzWpczdceqp7JWRckoi10CiYLyHQerC2Pes8QfGy4ugX9EDOGW/N2f/8fMoT NoqrMH0EGspOochOtuwJXkohiXn0U/UzDY/NgKUwrH5OZFgdG6UUVuBDF+BKdSV0cDOB6lAgO4I KqOGiGXUCRRrFmyBd29F1H5XLvwRo8SDAgog6xSSegCvx3kI4MBA+mwrgkPZv5/5UfPDeFREIpU xpxCHcAs8QnXW4WSL8x/fV5m8xR/D01M3RA== X-Received: by 2002:a17:902:ffd0:b0:2c7:1200:bd7e with SMTP id d9443c01a7336-2d3b0c9fa6dmr273330305ad.18.1786976441575; Mon, 17 Aug 2026 07:20:41 -0700 (PDT) X-Received: by 2002:a17:902:ffd0:b0:2c7:1200:bd7e with SMTP id d9443c01a7336-2d3b0c9fa6dmr273329575ad.18.1786976441013; Mon, 17 Aug 2026 07:20:41 -0700 (PDT) From: Ani Sinha To: Gerd Hoffmann , Stefano Garzarella , Ani Sinha Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org Subject: [PATCH v6 03/11] igvm: cleanup memory regions Date: Mon, 17 Aug 2026 19:49:58 +0530 Message-ID: <20260817142010.80693-4-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976483488158500 Content-Type: text/plain; charset="utf-8" From: Gerd Hoffmann This change cleans up existing memory regions that were created by the curr= ent IGVM. The cleanup would be necessary when a new IGVM is loaded. This cleanup function is called in a subsequent patch. Reviewed-by: Alexander Graf Tested-by: Ani Sinha Signed-off-by: Gerd Hoffmann --- backends/igvm-cfg.c | 2 ++ backends/igvm.c | 19 +++++++++++++++++++ include/system/igvm.h | 1 + 3 files changed, 22 insertions(+) diff --git a/backends/igvm-cfg.c b/backends/igvm-cfg.c index 38438a7b1e..935ba54f54 100644 --- a/backends/igvm-cfg.c +++ b/backends/igvm-cfg.c @@ -52,6 +52,8 @@ static void igvm_reset_hold(Object *obj, ResetType type) =20 trace_igvm_reset_hold(type); =20 + /* cleanup existing memory regions first */ + qigvm_cleanup_memory(igvm); qigvm_process_file(igvm, ms, false, &error_fatal); } =20 diff --git a/backends/igvm.c b/backends/igvm.c index 9e7c90d386..9b101c8182 100644 --- a/backends/igvm.c +++ b/backends/igvm.c @@ -14,6 +14,7 @@ #include "qapi/error.h" #include "qemu/error-report.h" #include "qemu/target-info-qapi.h" +#include "migration/vmstate.h" #include "system/igvm.h" #include "system/igvm-cfg.h" #include "system/igvm-internal.h" @@ -1109,3 +1110,21 @@ cleanup_parameters: cleanup: return retval; } + +/* + * cleanup any memory regions created by qigvm_prepare_memory() + */ +void qigvm_cleanup_memory(IgvmCfg *cfg) +{ + IgvmMemoryRegion *imr, *tmp; + + QTAILQ_FOREACH_SAFE(imr, &cfg->memory_regions, next, tmp) + { + memory_region_del_subregion(get_system_memory(), imr->mr); + vmstate_unregister_ram(imr->mr, NULL); + QTAILQ_REMOVE(&cfg->memory_regions, imr, next); + /* this triggers MemoryRegion cleanup */ + object_unparent(OBJECT(imr->mr)); + g_free(imr); + } +} diff --git a/include/system/igvm.h b/include/system/igvm.h index 64d3542311..e219f1a4ed 100644 --- a/include/system/igvm.h +++ b/include/system/igvm.h @@ -20,6 +20,7 @@ typedef struct QIgvm QIgvm; =20 int qigvm_process_file(IgvmCfg *igvm, MachineState *machine_state, bool onlyVpContext, Error **errp); +void qigvm_cleanup_memory(IgvmCfg *igvm); =20 /* x86 native */ int qigvm_x86_get_mem_map_entry(int index, --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976491; cv=none; d=zohomail.com; s=zohoarc; b=fsftSjcFn9zJr1Qt0UjsfxhZIACY6SN91QA+mfDogXaI6+3zxz0chHz+J037FB7OoSfexGKXhvvpgUmxCPgS5neI31NcKJJwZwLlKuWvzSSEJPUT3uv2xbYSiPsv6J+vivJWHqqvksbUXODHsAcPRUcwR3mgokBnoWnJ6CH7qJU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976491; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rpjpCejkLojUCVc87ev/0WjmuneloovioFsqiimDyY4=; b=EIjLkAozlX7ft0YOKH0mGhbzvIiLW0LrCJAtutiEQosLnXdxEFthr5P1oO9P0g97mfFa7sj9lNu3K8QJPCpVVbqyFgfbT0lXEcswa6DAV0KQkuuXjao81ozvm4lHiynC3UGruNSi2DH7wsftTx4/VIo4Uxv7Jo7zzy0HM13sEag= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976491804450.6239027458913; Mon, 17 Aug 2026 07:21:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyCs-00007U-EO; Mon, 17 Aug 2026 10:20:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCp-000060-PR for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:52 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCo-0002fe-At for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:51 -0400 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-582-N4vwCYuUM3mECkS2xE750g-1; Mon, 17 Aug 2026 10:20:47 -0400 Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2cacd6d37edso53548375ad.0 for ; Mon, 17 Aug 2026 07:20:47 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.20.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:20:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976449; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rpjpCejkLojUCVc87ev/0WjmuneloovioFsqiimDyY4=; b=ZCrAlsUMSoX8pO2KWkOu/Ix8/eJ68rKcfJPlyoNxgDTK5sk3wqYE3qCbX4mtcTgLg/lofm cZTwXbZkvASa6TreJlTE/iR6vTyAbGWooYwfA2azWNFet757Q8Wzinbr9MlxtzNvs3wFKJ a0CRCxZLLfDLBOIOWUPxbm58shQ35AE= X-MC-Unique: N4vwCYuUM3mECkS2xE750g-1 X-Mimecast-MFC-AGG-ID: N4vwCYuUM3mECkS2xE750g_1786976446 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976446; x=1787581246; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=rpjpCejkLojUCVc87ev/0WjmuneloovioFsqiimDyY4=; b=s3XB9jzgUez0mMvKrUXwo0eBasYS7TlKtU/Y8qlA8WP6Qu1NTkHy79sYmGSAK+FqFR ChQVjmG4ihETV3Gmfa9PFSGWfddmyjXn7f88//hcyzmrvRvqWgS/DgjGrosr1wce9nOY qh7NqLw8ifJGKQPpjtB/ex1jMXTU3wXkw+3w/26cZuAY1tR1ViN+hTqdeCiF2TLxPs/x lNrE/k3lrHK4GEbZSgWESpZD588gUY4Bj/Y9h0rf5+EtHYjzkeVdSWI7/4EUM0kv8oXX 684N5J+jwVhUZ8ixTVolvbYr7N0WYY+YOPmDoALsKacOh48+6Cs1cLR7esJkbNe8Ib9F 34hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976446; x=1787581246; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=rpjpCejkLojUCVc87ev/0WjmuneloovioFsqiimDyY4=; b=A+3f9NHieOxSkYah74IHsMW3gHssPmjW1KVe7i4sJarM4ysE3luhE/ePiukNTkQZ87 ymbxikQlMvrPyWfkm4b0R2rk5dq/J6pHBHZaMUjOazzJ2xXyiGpZG9vNwuZbpDz7LPLF 67AJfcvkGAIeDi2lDloCSqovfU6WBkzruWSNAuZ1BHJHWDLYkiJCb2orxPbQVYnIfB+9 3+cFdxwSsnFbvpn3hlyjuqJ9Byb7Qi9wVqJ2xAUgtOeyvid157tXekrzhvyCOxDho1ry OalS3Xh0CT71PqywswtJhLNDN91aTJEQ3fuiE6FyYGvgu1tCRnhnMwynRbxhL05cLinI rIvA== X-Forwarded-Encrypted: i=1; AHgh+RrhFTCV+SIfeoegT96kOB0ZMNR5wpxsL46nVkotQGgq+6ckrFbeoRDNoPg0tS3WINR4REFLWeSN0ylp@nongnu.org X-Gm-Message-State: AOJu0YzsK8hxuK0ASVnUM58avs5fZB6NVpI8lCzpSNPmpYZxlQTrFT3G vuf90Ff/xbsJiYv+fkxh5jxK38qX1YbvN1z8QHmT6u75UT2F2yAlMjvGyRpME1xGUV+MRoebAwh Oqn3QXgFQ43hI3iwMeULmEVW1rEiRl+/NDFMoal+nvdkTRFYXG+8lG22+ X-Gm-Gg: AR+sD10cqaM8qbeEKKRmceggjKpgtRPeaNIZ7gJQQJDE5uAVNcDsjY/heWdxtu0p7nH ckbhdPivwCnLS/Iuo2z3PCop1wMx5lMQQwStwcQi80C0o/Gl/JKhpgfXPaalq3kpiOUJmpEjycR O74v0iIhkZpOb0NNh2X3U7nrELecoh3Sg4zvzuqWl8puvs1g3Pg5Pw63IG6M2Kiz76j9e2l5GsH y0PuhB5083vMI5dsc3jQQ8m8QykLgieRDKAgCTeV2iMZo6wSPiP5wvgjf0pnKCO7yTQFkwaozqY 18cs0EhefzYAYj3dENLF7llGqOe52lF3nMatbJvDXmdgqwgbxxu9kkrXufWAxVpHpOEJTZRCyNO rp7cMqbutxw4p/2SLXl4ucQszFee1UPOcxA== X-Received: by 2002:a17:903:384c:b0:2ce:7563:70a5 with SMTP id d9443c01a7336-2d3b0d1254emr287477545ad.6.1786976446198; Mon, 17 Aug 2026 07:20:46 -0700 (PDT) X-Received: by 2002:a17:903:384c:b0:2ce:7563:70a5 with SMTP id d9443c01a7336-2d3b0d1254emr287476955ad.6.1786976445742; Mon, 17 Aug 2026 07:20:45 -0700 (PDT) From: Ani Sinha To: Paolo Bonzini , Peter Xu , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Cc: Ani Sinha , ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org, kraxel@redhat.com Subject: [PATCH v6 04/11] system/memory: add a tracepoint for memory_region_finalize Date: Mon, 17 Aug 2026 19:49:59 +0530 Message-ID: <20260817142010.80693-5-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976493446158500 Content-Type: text/plain; charset="utf-8" cosmetic: add a tracepoint to track when memory regions are getting freed. Useful for debugging and tracking all freed memory regions. Reviewed-by: Peter Xu Signed-off-by: Ani Sinha --- system/memory.c | 1 + system/trace-events | 1 + 2 files changed, 2 insertions(+) diff --git a/system/memory.c b/system/memory.c index 5fc36708ec..9485ba316f 100644 --- a/system/memory.c +++ b/system/memory.c @@ -1730,6 +1730,7 @@ static void memory_region_finalize(Object *obj) { MemoryRegion *mr =3D MEMORY_REGION(obj); =20 + trace_memory_region_finalize(mr->name); /* * Each memory region (that can be freed) must have an owner, and it * always has the same lifecycle of its owner. It means when reaching diff --git a/system/trace-events b/system/trace-events index 51b4a4679a..0e1a4c5865 100644 --- a/system/trace-events +++ b/system/trace-events @@ -27,6 +27,7 @@ flatview_new(void *view, void *root) "%p (root %p)" flatview_destroy(void *view, void *root) "%p (root %p)" flatview_destroy_rcu(void *view, void *root) "%p (root %p)" global_dirty_changed(unsigned int bitmask) "bitmask 0x%"PRIx32 +memory_region_finalize(const char* name) "mr %s" =20 # physmem.c address_space_map(void *as, uint64_t addr, uint64_t len, bool is_write, ui= nt32_t attrs) "as:%p addr 0x%"PRIx64":%"PRIx64" write:%d attrs:0x%x" --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976535; cv=none; d=zohomail.com; s=zohoarc; b=fF4DJTnTJ82nfo32aEP18x1y04qhEwog2tHt7rKbFXWzFMkYXawJSgt6Crv9xhEWoqE0Dky+Zh1K4W+ip0s72RVGHvKyAH4dkBQhZM826MV0/FIhSzwio7vWE0YScNOCdQyD3cDsBfSxAN94tecNt6wKWx337Z+ZYHc8JlVA4nk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976535; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ds3ELgiFjPHuwUmXMHjb6LoAFKBT/u0B05y4PCqDrU0=; b=Wb9uVIYwNTr45TFK6JsV0/8AssBbLW09msFaRerc/pC5APkG5tfG1oOoLWwVmEV9UavwGgHtMrsoQX6+kOZ99dP0Vj+KgoCoceaWd/kcQPJGpnldcf3Oadskg6Ww3s5TaELh0sUXgCiZZ73h6powkTrdeDthyzfn6YoFvLudUYo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976535755795.475912952279; Mon, 17 Aug 2026 07:22:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyCv-00007n-RE; Mon, 17 Aug 2026 10:20:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCu-00007c-9z for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:56 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCr-0002gm-Pq for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:56 -0400 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-245-U7I0btxlOjWt_-dgvjkuJw-1; Mon, 17 Aug 2026 10:20:51 -0400 Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2cacf17c7e0so52025025ad.0 for ; Mon, 17 Aug 2026 07:20:51 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.20.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:20:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976453; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ds3ELgiFjPHuwUmXMHjb6LoAFKBT/u0B05y4PCqDrU0=; b=hyji7tdtqNHgzy2yH1HYLTcV03KiscyhTAfR+2Tc3ReLNjbHbaVITOEZB6r9xwx7Upz8Pq ZVzKSPDrZMypGTr0l10RpgN3SJaSGV14ieXAyJGHF9Jf8jdNn77Xz6xNV3oIAcIA0WRIIj +3UH2T6R4B5VanBnI9rS2eV7tMgMG9U= X-MC-Unique: U7I0btxlOjWt_-dgvjkuJw-1 X-Mimecast-MFC-AGG-ID: U7I0btxlOjWt_-dgvjkuJw_1786976450 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976450; x=1787581250; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ds3ELgiFjPHuwUmXMHjb6LoAFKBT/u0B05y4PCqDrU0=; b=BUpPnpXR6B8CxRslZ5kznp2ekfRbpviH/yBUI4bPqVKRed/80l+GFkdjoZRgT0b3ii /mpo2QG3pnyiBkgLf7m/wDfXBojfWACiFER63Z8x1mEDDcsO2hpUfHMF6oh0rhFawySU SGjaNKuWpnEaKd+wbKtGeXH9hPYQIjCF/vvPz5WlehmzJcZnydDfHKuG5vyCnqKg+8CU +6VWJ/a9Az35y4nHy83FieSdsRJOZDyREiYQWn/jgCr8OAzFbZh1lwdvhIclx1Dwpgp5 Y3YNJRVUbF/gQB0srBzUZ5r25tIgw8YAN6h2viF3UYhWfJO33IwODbKFmNsA+lcQcD7z NXVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976450; x=1787581250; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=ds3ELgiFjPHuwUmXMHjb6LoAFKBT/u0B05y4PCqDrU0=; b=g3oExxUzMNfwTLwEWN4EF2BZptPG2EMoZF+Nxs8i0x2RXsvQxlbjXEikLKcBraBAeK bsVCaY2ci9B1earUJrmSeZJCI4egQxiTLPr70fk+AOR1edqZ4k31RBcv9mkgPz1UcKX7 k/wcjnIsez3AsMZ5Kqq07Y3T5jqyKXsS9FLG7Ozq2nQsMNKlURPdeDmLXkcHiU20zt5N YsUe+MD/47KO1b4mEuiZWUiUfb1h/0P6ZvOgmXfdCJJodu0b5yqJBygXJRRLUEZBesXU YSIBMvgRl+23hTeHgSCiSDor205itFIdRWzgbAG2DHOfVGIci52dca+VUB/MtmzWDA0w uE3A== X-Forwarded-Encrypted: i=1; AHgh+Rq4+6qaZ48ptW3+gPjQ0onHb3B7Hl5IFqCz4sIepKSBDXseo6mDya7XHsVot69kvkKQ7nsjnch7TWK6@nongnu.org X-Gm-Message-State: AOJu0YxGpzSeD0jlx89NNsB0tX4EbGNwmzYTjAliEU4N3iMDOsol/S3q vTdSGsxfERVXQ99pLeVYaDgQI7ElzSrYXT2z2OK1kI4fFBt6yCPFwGgIaNpIVEADfzIqwnMzkH/ 5/bvmX+VCzzZZXFiQOiymn73N44D/RvXaVuDAYqjFV6OkWo4X1Cpdu3hc X-Gm-Gg: AR+sD10AInYJjN7HrBouaA6/9Pdfy6XeV7F3H4hQoI0Kp4hx1AZ0C/YPnWc8QgKzh2o NyCNErXsYOk2KeeZFdrxuDpZsfCGQKWu3Qt4+msImjcWOUvDve1kIhQJNPHCAvl8H0751r0vFck HHb5/1QNCLV3124PzBDHf94IBP57/dtBJR9ijFF8f48McoSbsoQA2H5Yno7+Qf5UxVA1iSrbXXi OVgXmW4ul6sDcFKN14w5TTJpYfGPr2Mpm5x6N6M/FEuGDTz3WnON+1lS/oPSAEXYICxLkVRl77+ 76Zcyq6oQhEWVoIcFrDNfwn8oDPSzOqhvCAmyRjgF5MqR6Jatj0POrAWCqGAbxUPQvo3+JzryDw WPZl85qQ7mN5KAnfrHIpPNs2WtUTeIFsUTg== X-Received: by 2002:a17:902:da82:b0:2cc:777f:d67c with SMTP id d9443c01a7336-2d3b0d5ed01mr255791035ad.13.1786976450322; Mon, 17 Aug 2026 07:20:50 -0700 (PDT) X-Received: by 2002:a17:902:da82:b0:2cc:777f:d67c with SMTP id d9443c01a7336-2d3b0d5ed01mr255790535ad.13.1786976449830; Mon, 17 Aug 2026 07:20:49 -0700 (PDT) From: Ani Sinha To: Gerd Hoffmann , Stefano Garzarella , Ani Sinha Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org Subject: [PATCH v6 05/11] backends/igvm: add a tracepoint for qigvm_cleanup_memory Date: Mon, 17 Aug 2026 19:50:00 +0530 Message-ID: <20260817142010.80693-6-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976537189158500 Content-Type: text/plain; charset="utf-8" Useful for debugging memory region cleanups. Signed-off-by: Ani Sinha --- backends/igvm.c | 1 + backends/trace-events | 1 + 2 files changed, 2 insertions(+) diff --git a/backends/igvm.c b/backends/igvm.c index 9b101c8182..7b7bdc72b7 100644 --- a/backends/igvm.c +++ b/backends/igvm.c @@ -1120,6 +1120,7 @@ void qigvm_cleanup_memory(IgvmCfg *cfg) =20 QTAILQ_FOREACH_SAFE(imr, &cfg->memory_regions, next, tmp) { + trace_qigvm_cleanup_memory(imr->mr->name); memory_region_del_subregion(get_system_memory(), imr->mr); vmstate_unregister_ram(imr->mr, NULL); QTAILQ_REMOVE(&cfg->memory_regions, imr, next); diff --git a/backends/trace-events b/backends/trace-events index 009a25b0be..9b7b9b7d68 100644 --- a/backends/trace-events +++ b/backends/trace-events @@ -33,3 +33,4 @@ igvm_reset_hold(int type) "type=3D%u" igvm_reset_exit(int type) "type=3D%u" igvm_file_loaded(const char *fn, int32_t handle) "fn=3D%s, handle=3D0x%x" igvm_process_file(int32_t handle, bool context_only) "handle=3D0x%x contex= t-only=3D%d" +qigvm_cleanup_memory(const char* name) "freeing mr %s" --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976477; cv=none; d=zohomail.com; s=zohoarc; b=Gc8nTIz3uZ5GSRKOJ+TmvKU49TlPPGocdv4zWVAsPoskkL4eNOQbkO7sG+A426CyMYzT17Jlov2ZPqWL89+yOLixBRafl9G0nhNReLJqz4uq54+HisFSlaia5qPWGVPweN59sN3kC/t9JNx7DhKAjwU5kf7WG7HKBee4jkR1RN0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976477; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0G9kJaM7xTotO+IG4PqVpRqk49NAmKccnDH91l20TNU=; b=nnXzGpSIrT53nCzme8Qt3XAdwK5aGf3NU6D1jbejmlGVRtclbC9UiXLF17HauUzG6iz9OOCY4GFedLhOzj2yfObTfA8ZsTQtLHwBA9hZuibuUU1JuPwTOi0+zoneSvUfHiV1ne6Ouv7UT7cYw002Cynnb2GBqkjms/WJP8Kv/8E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976477966126.57002795526637; Mon, 17 Aug 2026 07:21:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyCz-0000Bk-Sw; Mon, 17 Aug 2026 10:21:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCy-0000AR-5R for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:00 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyCw-0002iH-JR for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:20:59 -0400 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-385-WC0IbeRoO12sL-iCV-RTQA-1; Mon, 17 Aug 2026 10:20:56 -0400 Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cee894b3d8so69495475ad.2 for ; Mon, 17 Aug 2026 07:20:56 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.20.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:20:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976457; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0G9kJaM7xTotO+IG4PqVpRqk49NAmKccnDH91l20TNU=; b=MkpfVQN67iX2X+qOAnYjT5jeaUP280oiTtAgSqvavfKTYqM0HYaZKDFGMfjwS4hkqfV7eG Zb7xDulp0IbN1vgcni/GluVDQzTaowOt7FlGxcOkZy9AWITs7a1AZYOXzVl8oNAYbw+l76 Nynwcbv+a91kPynKDQ61ZkNY6D6nnco= X-MC-Unique: WC0IbeRoO12sL-iCV-RTQA-1 X-Mimecast-MFC-AGG-ID: WC0IbeRoO12sL-iCV-RTQA_1786976455 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976455; x=1787581255; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0G9kJaM7xTotO+IG4PqVpRqk49NAmKccnDH91l20TNU=; b=UyuLMBaMi/tnyjzN99qSUpISbQruIrFPjgZrKTLmgpGOB2OWjN0ayUnpCPPo3KUdKT AYmDEW0NposBU9WZ6YCnEUNLHOhIctsJD+a1JzKR2uBLDzDdiICVRjF4g8OuGiRMY6y7 In8RAiEPl7wRj1NW9FpoyKY8MDVy+u92aBpfT0B6sAcR3uakkcYWwpoOCQWzm0DUCoB0 wiooT38jRMY+APQauLOLtI2hAl7tuNqsHiXCyq7/65dsicapkEqFgSknsGbCaei+lyrO yIS1wQwt5neYI/VuLUVPexM9bPFh/zxEXvFQk5fnqLrQ06kvx1ArKc108XgHH80Blhpl FkMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976455; x=1787581255; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=0G9kJaM7xTotO+IG4PqVpRqk49NAmKccnDH91l20TNU=; b=lx6054eonv+QH3wh78k3qqS/GSXa8ECZHRqIx7FOVRvHlLtPMtap3QACQgWuNVhHch Pe3+wcLIc4vyMyMrlGj6Zyj5Zkoh3uXWtcUpoggOmbZ8qM+r3qM0OQYY1SgvUHo+dZZi bXjfQYHM8TNvxRsI+QuWiOi8ww81KXuywFIj225IPtb81tDeBuCgLGK/zvnpoR3D0HVg cqVyIjprdGw8iaZiaqDYOWAUygAFtI4fbHBXnB0YSsOxtadbTFKDiQxh6g7DGikMPu/A EBf5OROi+Wd8KeJeJ6BVKByaheMjlOUJuPXTAuOhFVX+JblhzlcDXI4xt8EEe4+oAjzB XjaA== X-Forwarded-Encrypted: i=1; AHgh+RouXIiktxCIZZb23WRQNA1+aFJhCqxojtoKu+LQGMoHP+bOJSIgSVV3/kHVdp4SgxxFZNoXDlePfhWk@nongnu.org X-Gm-Message-State: AOJu0YzK4Mv4qmESpiptWvbufarnCra/SlPOVX2Wg5dUFpZQwKPx1l+s FJ1a11pr3CiMGhvBD/7Xz7q/RGc5bgzzTmLKLuzvhlSx2dNnMZmPaYJPs/kVVMn5A5wu8uxPgDq AVVM/lDccf8SYgknMNkMenASp0VnbUwkSW6eslPIf7kkj7Cj0g9g7OBTgHKvDkqhP2Ds= X-Gm-Gg: AR+sD124CevQEgnKSdQuqTwTa3hYPuCfQL+DOCaBwNje+o/Os/DtFDOnbY1dhwF56aV OwHri2UFxWeGjXfk1PPtj0yYUQ88r6j0j/FmhQ+q9IXYk783o7hNI0cOqypFybCQyFvfjQuHEK5 WLsICGDI9E983FJxUora6AQ49jroqvOJYD3FVK66EgjbDAxozZ1iHm/zLFlRtJXNod82gGWdU6E BaOxUeM4A7zUXBJ49NxJODWC8JTW3uIW2mDO3Od648ytmyBFEmAysYJnJwid7Uq2fEaNxoqgJ1r YtHo6IuCr69o1AKnNKNyVSZAr8LRyizRGLEOL5R7l5MGJqJNMrIeEG0c/DmhUHYeTsGPQjHG8fq RFvA2kO9h0MlnouNjEajvufkye5xZ8g/M4Q== X-Received: by 2002:a17:902:f647:b0:2c2:be43:39bc with SMTP id d9443c01a7336-2d3b0d0379dmr293577195ad.22.1786976454878; Mon, 17 Aug 2026 07:20:54 -0700 (PDT) X-Received: by 2002:a17:902:f647:b0:2c2:be43:39bc with SMTP id d9443c01a7336-2d3b0d0379dmr293576675ad.22.1786976454206; Mon, 17 Aug 2026 07:20:54 -0700 (PDT) From: Ani Sinha To: Ani Sinha , Gerd Hoffman , "Michael S. Tsirkin" , Cornelia Huck , Paolo Bonzini Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org Subject: [PATCH v6 06/11] hw/misc/vmlaunchupdate: add api header Date: Mon, 17 Aug 2026 19:50:01 +0530 Message-ID: <20260817142010.80693-7-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976478890158500 Content-Type: text/plain; charset="utf-8" Add a separate header file for guest usable api definitions. CC: Alex Graf CC: Gerd Hoffman Reviewed-by: Alexander Graf Signed-off-by: Ani Sinha --- .../standard-headers/misc/vmlaunchupdate.h | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 include/standard-headers/misc/vmlaunchupdate.h diff --git a/include/standard-headers/misc/vmlaunchupdate.h b/include/stand= ard-headers/misc/vmlaunchupdate.h new file mode 100644 index 0000000000..66daed701e --- /dev/null +++ b/include/standard-headers/misc/vmlaunchupdate.h @@ -0,0 +1,102 @@ +/* + * Guest driven VM launch state update device via IGVM. + * The definitions in this header defines the API for the hypervisor inter= face. + * For details and specification, please look at docs/specs/vmlaunchupdate= .rst. + * + * Copyright (C) 2026 Red Hat, Inc. + * + * Authors: Ani Sinha + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + */ +#ifndef VMLAUNCHUPDATE_API_H +#define VMLAUNCHUPDATE_API_H + +/* fw-cfg file definition */ +#define FILE_VMLAUNCHUPDATE "etc/vmlaunchupdate" + +/* version */ +#define VM_LAUNCHUPDATE_VERSION 0x01 + +/* format bits, used by both 'capabilities' and 'control' */ + +/* igvm */ +#define VM_LAUNCHUPDATE_FORMAT_IGVM (1ULL << 32) + +/* 'control' field bits */ + +/* disable vmlaunchupdate interface */ +#define VM_LAUNCHUPDATE_CTL_DISABLE (1 << 0) +/* revert to the original host provided igvm */ +#define VM_LAUNCHUPDATE_CTL_HOST_IGVM (1 << 1) + +/* The combination of the above two ctl interfaces work as + * follows: + * + * A) CTL_HOST_IGVM=3Doff CTL_DISABLE=3Doff + * + * Supplied IGVM file replaces the firmware permanently. Updating the + * firmware again is possible. + * + * B) CTL_HOST_IGVM=3Doff CTL_DISABLE=3Don + * + * Supplied IGVM file replaces the firmware permanently. Updating the + * firmware again is not possible. + * + * C) CTL_HOST_IGVM=3Don CTL_DISABLE=3Doff + * + * Supplied IGVM file replaces the firmware for one reset. Resetting + * again will switch back to the original firmware. Updating the + * firmware again is possible. + * + * D) CTL_HOST_IGVM=3Don CTL_DISABLE=3Don + * + * Supplied IGVM file replaces the firmware for one reset. Resetting + * again will switch back to the original firmware. Updating the + * firmware again is NOT possible. + * + */ + +/* status code */ +enum VMLaunchUpdateStatus { + VM_LAUNCHUPDATE_SUCCESS, + VM_LAUNCHUPDATE_LOAD_FAIL, + VM_LAUNCHUPDATE_NOT_IGVM_INIT, +}; + +typedef struct QEMU_PACKED { + /* api version */ + uint16_t version; + + /* + * The guest can read this in order to determine if loading new IGVM + * succeeded. + */ + uint16_t status; + + uint32_t _padding; + + /* VMM capabilities, read-only. */ + uint64_t capabilities; + /* control bits, see VMFWUPDATE_CTL_* */ + uint64_t control; + + /* + * address and size of the IGVM image. Will be cleared when + * the write completes successfully and IGVM file is correctly parsed. + */ + uint64_t fw_image_addr; + uint64_t fw_image_size; + + /* + * address + size of opaque blob. The guest can use this to pass on + * information, for example which memory region the linux kernel has b= een + * loaded to. writable, will be kept intact on firmware update. + */ + uint64_t opaque_addr; + uint64_t opaque_size; + +} VMLaunchUpdate; + +#endif --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976565; cv=none; d=zohomail.com; s=zohoarc; b=nSASNl5VzKLV1Fwy4rto8BYqIdDJTHQxu2URkWHlAwiE7x/HwjsUZWJtd8laaLBFqppNkwjU+fKc3K5xbAwXLdOemNCvWveUaGuZNxej1RA9M+ryJabXA/zaYau0FNlxPfx4kvSCCsdQQodjna0Ld+44NnAOI8RUfw0LpJ0IpBM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976565; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=VmwdFZQfIlNc7FJ8WapT4cJBgdbwAVRb/TGVA52OOFU=; b=Q7qIWy0KRbpSkW+sGoHhB+YRFC0OgwZVVd/EYl1si8xuqSQ/Uh0tmzonF2TcPWww9l/TGh4AZ1ImPw3+LviR+2DNRkA4u/E+6ThC4xFjFOfCbCsAIR2NoGbd1h9b0zuw9qIVIKIrgnluzGbcTLToEvD7jwAq9DsLpd0MA691OQQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976565271474.109444074322; Mon, 17 Aug 2026 07:22:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyD4-0000Cr-9e; Mon, 17 Aug 2026 10:21:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyD2-0000Cb-US for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:04 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyD0-0002j6-Gq for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:04 -0400 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-166-MfqO1GkOP_evsB8XtR8Lkg-1; Mon, 17 Aug 2026 10:21:00 -0400 Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2cce14a21faso53223105ad.0 for ; Mon, 17 Aug 2026 07:20:59 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.20.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:20:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976461; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VmwdFZQfIlNc7FJ8WapT4cJBgdbwAVRb/TGVA52OOFU=; b=DIK0N7eYRJ7C4d4RSPpThYp/J/cb1MYYLGbya7H0vDRpCLJzEXKotyVbL3Khg+AsKWkaT7 wjPaJpCqzzvNEA83rJcnzO17YbNd/xD12cOPoHYX4L78C3UiYKt6jTswl8pxVsUM8THz8G JvGmqRTirGo+uaIm0CLgsXq6dSUBJtc= X-MC-Unique: MfqO1GkOP_evsB8XtR8Lkg-1 X-Mimecast-MFC-AGG-ID: MfqO1GkOP_evsB8XtR8Lkg_1786976459 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976459; x=1787581259; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=VmwdFZQfIlNc7FJ8WapT4cJBgdbwAVRb/TGVA52OOFU=; b=JjtKXUD/wfldgYTuT+8SVzAd6f4qa7ZH5tE/JjodYFMSXBj+kLXU+9jxKfTBky0t+6 TzgkeuIoIpHHM2Dttl4mCLhS6jEkjbvFW2xNn690IAET8OIiIA37psHwrRoDECUEJMV1 oYCjkRzGWJhLX19BlfGMlUl5APefYv59ROFbrvnE665AqzEWOx4aYVMBoH3ePAbYK62s sc8kFZz2Bhd8hIUSgDViqsJTQiDRvFphAEnE7o3lqJ0Gf7fDiar2Nif91zBXa+YGLs0W vJ05c/IHP7DnDModaFwECGrgnUVeb87555MeNFaFMXkKWqHRT/loc8b5wgu5NcQSp7hG npdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976459; x=1787581259; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=VmwdFZQfIlNc7FJ8WapT4cJBgdbwAVRb/TGVA52OOFU=; b=EDE+QN/OFvRDatdbKixaU9k0p1UxWGuBThQmNxZYjqqPI/av5tLRn0hMETpHtqDVNe pZXLq7god6mThkRy/9fv9syEJD5UYTRgybhOS//7iLDXd/X5nExY60aloLN8BXjU5akp 9aUh6spiLVlIm23mJG5lj352um76Hx5oiRVfdcuDresHsaUkC+GzuqliEFtLBWY8oYR0 Vu7Q+GmMX57OzsWrQHz155U/zgpLEMud9t0P8F5ijVqUXnc8fNnR0T69RRWnEUWfJQ+w ij7PsKkxQxc+58tQZ5dKlv2CXZOFhEuVEqyCDtVP5nZSX3Y4BNKxndcXxPJTNkmO14sG o48g== X-Forwarded-Encrypted: i=1; AHgh+RqjXCm97BkGPEvLB0cXgvo+TsIPt4DDqmqLw6cAxnoeqxgCPEvDFNk93b4ahqvoeBgBtkUX/szaJ/w1@nongnu.org X-Gm-Message-State: AOJu0YzpATYeSu6V3p3HuHG02bRa1ilPtV9NOsjLDNbmJuxGxdxsUnYZ Qry5B3472NSum07NUQLtgBQWyr74TnYF1qz3FFMvelqE866DAPJHmA0Xa2um37R3m02FFlg1yPZ I7uQ89kZKq2xqGsPlwQK/JjQP1XIFsGVYgRXZXcvc5ek7+OnOcCrtjcRC X-Gm-Gg: AR+sD117beFbUl6vxu/zWHOYk8RGHFtMRjD356shJmZiYGIUh6rOZG2HPPWdK0XkeoC 8MkHBNK5t/QAQA6RRhCZ9Z8dFyP97KWtkhz1ObrKqKZJGHea76Lu9fm9DFC+esqlqCla6wd+dJw IhIdg0WERhlCt7Ox4aJWg78QMq2t8SVzOlC0UF0upLP+Y3S+e2zs2ZlnAaXb52pzar5MPOHwUth exxEyld25SXNegzcWhMot6+2vaRpFGbv81SP7lPsWXz6qj1s/ZY4lU5EzpBXZKVstESfOVIAVfr PGDLCDKP8Qn2VLLMQ+kHebVo5VB+OahzDR85Ju17DLpX8BO2kzHgMfN0+erd2y1vmk/wjhYAmKy w9r3A1ImJE/mqzXLNGbj6/rbzPuF4BG+Zmg== X-Received: by 2002:a17:903:1a0d:b0:2d2:72b6:556b with SMTP id d9443c01a7336-2d37f7b7ca7mr345582675ad.13.1786976458646; Mon, 17 Aug 2026 07:20:58 -0700 (PDT) X-Received: by 2002:a17:903:1a0d:b0:2d2:72b6:556b with SMTP id d9443c01a7336-2d37f7b7ca7mr345582095ad.13.1786976457992; Mon, 17 Aug 2026 07:20:57 -0700 (PDT) From: Ani Sinha To: Ani Sinha , Gerd Hoffman Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org Subject: [PATCH v6 07/11] hw/misc/vmlaunchupdate: Introduce hypervisor fw-cfg interface support Date: Mon, 17 Aug 2026 19:50:02 +0530 Message-ID: <20260817142010.80693-8-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976567474158501 Content-Type: text/plain; charset="utf-8" VM launch update is a mechanism where the virtual machines can use IGVM file bundle to boot into a trusted execution environment without having to depend on a untrusted party to provide the IGVM bundle or firmware image. This is particularly useful for confidential virtual machines that are deployed in the cloud where the tenant and the cloud provider are two different entities. In this scenario, virtual machines can bring their own trusted IGVM file containing a trusted firmware image bundled as a part of their filesystem and then use this hypervisor interface to update to a trusted and deterministic boot state. This also allows the guests to have a consistent measurements on the firmwa= re image. Currently, this mechanism only works if the VM was started with IGVM in the first place. This change introduces support for the fw-cfg based hypervisor interface and the corresponding device. The interface is made generic enough so that guests are free to use their own ABI to pass required information between initial and trusted execution contexts (where they are running their own trusted boot state) without the hypervisor getting involved in between. Currently, this device is only supported for x86_64 machines. Presence of IGVM host libraries is also required for parsing IGVM files. Hence, the dev= ice cannot be initialized for other machine types or hosts where IGVM support is not present. Trying to initialize it for arm for example will lead to fa= ilure: $ ./qemu-system-arm -device vm-launch-update -machine virt qemu-system-arm: -device vm-launch-update: This machine does not support vm= -launch-update device A document detailing the specification is added in a subsequent patch. Plea= se see docs/specs/vmlaunchupdate.rst. Functional and qtests are added in a subsequent patch. CC: Alex Graf CC: Gerd Hoffman Reviewed-by: Gerd Hoffmann Reviewed-by: Alexander Graf Signed-off-by: Ani Sinha --- hw/misc/meson.build | 3 + hw/misc/trace-events | 6 + hw/misc/vmlaunchupdate.c | 333 +++++++++++++++++++++++++++++++ include/hw/misc/vmlaunchupdate.h | 38 ++++ 4 files changed, 380 insertions(+) create mode 100644 hw/misc/vmlaunchupdate.c create mode 100644 include/hw/misc/vmlaunchupdate.h diff --git a/hw/misc/meson.build b/hw/misc/meson.build index e86d9ad6b3..858ca845a2 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -164,6 +164,9 @@ specific_ss.add(when: 'CONFIG_MIPS_ITU', if_true: files= ('mips_itu.c')) =20 specific_ss.add(when: 'CONFIG_RISCV_MIPS_CMGCR', if_true: files('riscv_cmg= cr.c')) specific_ss.add(when: 'CONFIG_RISCV_MIPS_CPC', if_true: files('riscv_cpc.c= ')) +if igvm.found() + specific_ss.add(when: 'CONFIG_FW_CFG_DMA', if_true: files('vmlaunchupda= te.c')) +endif =20 system_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('sbsa_ec.c')) =20 diff --git a/hw/misc/trace-events b/hw/misc/trace-events index c9a868b3ef..2d6d2238c5 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -442,3 +442,9 @@ iommu_testdev_dma_read(uint64_t gva, uint32_t len) "gva= =3D0x%" PRIx64 " len=3D%u" iommu_testdev_dma_verify(uint32_t expected, uint32_t actual) "expected=3D0= x%x actual=3D0x%x" iommu_testdev_dma_result(uint32_t result) "DMA completed result=3D0x%x" iommu_testdev_dma_armed(bool armed) "armed=3D%d" + +# vmlaunchupdate.c +launch_update_write(void) "" +vmlaunch_reset_enter(void) "" +vm_launchupdate_finalize(void) "" +restore_host_x86_igvm(void) "" diff --git a/hw/misc/vmlaunchupdate.c b/hw/misc/vmlaunchupdate.c new file mode 100644 index 0000000000..afa2d278ae --- /dev/null +++ b/hw/misc/vmlaunchupdate.c @@ -0,0 +1,333 @@ +/* + * Guest driven VM launch component update (using IGVM) device + * For details and specification, please look at docs/specs/vmlaunchupdate= .rst. + * + * Copyright (C) 2026 Red Hat, Inc. + * + * Authors: Ani Sinha + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qemu/module.h" +#include "system/physmem.h" +#include "system/reset.h" +#include "qemu/target-info-qapi.h" +#include "hw/nvram/fw_cfg.h" +#include "hw/core/qdev-properties.h" +#include "hw/i386/pc.h" +#include "exec/cpu-common.h" +#include "hw/misc/vmlaunchupdate.h" +#include "system/igvm.h" +#include "system/igvm-internal.h" +#include "qemu/error-report.h" +#include "trace.h" + +/* returns NULL unless there is exactly one device */ +static VMLaunchUpdateState *vm_launchupdate_find(void) +{ + Object *o =3D object_resolve_path_type("", TYPE_VMLAUNCHUPDATE, NULL); + + return o ? VMLAUNCHUPDATE(o) : NULL; +} + +static bool vmlaunchupdate_supported(void) +{ + return target_arch() =3D=3D SYS_EMU_TARGET_X86_64; +} + +static void init_vm_launch_update(VMLaunchUpdateState *s) +{ + s->launch_update.capabilities =3D VM_LAUNCHUPDATE_FORMAT_IGVM; + s->launch_update.control =3D 0; + + if (s->disabled) { + s->launch_update.control |=3D VM_LAUNCHUPDATE_CTL_DISABLE; + } + + s->launch_update.version =3D VM_LAUNCHUPDATE_VERSION; + return; +} + +static void clear_init_vm_launch_update(VMLaunchUpdateState *s) +{ + memset(&s->launch_update, 0, sizeof(s->launch_update)); + init_vm_launch_update(s); +} + +static bool no_igvmcfg(X86MachineState *x86m) +{ + IgvmCfg *igvmc; + + if (!x86m) { + return true; + } + + igvmc =3D x86m->igvm; + + if (!igvmc) { + /* The VM was not started with an IGVM, bail */ + info_report("guest was not initially started with IGVM, " + "not changing launch state."); + return true; + } + return false; +} + +static int process_x86_igvm(VMLaunchUpdateState *s, + uint64_t fw_image_addr, uint64_t fw_image_size) +{ + X86MachineState *x86machine =3D X86_MACHINE(qdev_get_machine()); + IgvmCfg *igvmc =3D x86machine->igvm; + IgvmHandle igvm; + void *image_addr_ptr; + hwaddr len; + + if (no_igvmcfg(x86machine)) { + return -2; + } + + if (!fw_image_addr || !fw_image_size) { + return -1; + } + + len =3D (hwaddr) fw_image_size; + image_addr_ptr =3D physical_memory_map((hwaddr) fw_image_addr, + (hwaddr *) &len, 0); + + if (!image_addr_ptr || (len < fw_image_size)) { + warn_report("vmlaunchupdate: Invalid guest addresses."); + goto err; + } + + igvm =3D igvm_new_from_binary(image_addr_ptr, fw_image_size); + if (igvm < 0) { + warn_report("vmlaunchupdate: Unable to parse IGVM file %" + PRIx64 ": %" PRIx64, fw_image_addr, fw_image_size); + goto err; + } + + /* free previous file context */ + if (igvmc->file >=3D 0) { + igvm_free(igvmc->file); + } + /* set new context */ + igvmc->file =3D igvm; + + physical_memory_unmap(image_addr_ptr, len, 0, 0); + info_report("vmlaunchupdate: new IGVM context set."); + + return 0; + err: + if (image_addr_ptr) { + physical_memory_unmap(image_addr_ptr, len, 0, 0); + } + return -1; +} + +static void restore_host_x86_igvm(void) +{ + X86MachineState *x86machine =3D X86_MACHINE(qdev_get_machine()); + IgvmCfg *igvmc =3D x86machine->igvm; + Error *errp =3D NULL; + + if (no_igvmcfg(x86machine)) { + return; + } + + /* free previous file context */ + if (igvmc->file >=3D 0) { + igvm_free(igvmc->file); + } + + info_report("restoring original host IGVM: %s", igvmc->filename); + igvmc->file =3D qigvm_file_init(igvmc->filename, &errp); + assert(!errp); + + info_report("vmlaunchupdate: host IGVM context set."); + + trace_restore_host_x86_igvm(); + + return; +} + +static bool fw_address_cleared(VMLaunchUpdateState *s) +{ + return !s->launch_update.fw_image_addr && + !s->launch_update.fw_image_size; +} + +static void launch_update_write(void *dev, off_t offset, size_t len) +{ + VMLaunchUpdateState *s =3D VMLAUNCHUPDATE(dev); + uint64_t addr; + uint64_t size; + int rc; + + s->launch_update.status =3D VM_LAUNCHUPDATE_SUCCESS; + + if (s->disabled) { + goto end; + } + + if (s->launch_update.control & VM_LAUNCHUPDATE_CTL_DISABLE) { + s->disabled =3D true; + goto end; + } + + if (fw_address_cleared(s) && + (s->launch_update.control & VM_LAUNCHUPDATE_CTL_HOST_IGVM)) { + /* restore host IGVM on immediate next reset */ + s->host_igvm_on_reset =3D true; + goto end; + } + + if (!(s->launch_update.control & VM_LAUNCHUPDATE_FORMAT_IGVM) && + !fw_address_cleared(s)) { + /* at least one address provided but the format is not IGVM */ + s->launch_update.status =3D VM_LAUNCHUPDATE_LOAD_FAIL; + goto end; + } + + /* process guest provided IGVM image */ + if (s->launch_update.control & VM_LAUNCHUPDATE_FORMAT_IGVM) { + if (target_arch() =3D=3D SYS_EMU_TARGET_X86_64) { + addr =3D le64_to_cpu(s->launch_update.fw_image_addr); + size =3D le64_to_cpu(s->launch_update.fw_image_size); + rc =3D process_x86_igvm(s, addr, size); + if (rc < 0) { + switch (rc) { + case -2: + s->launch_update.status =3D VM_LAUNCHUPDATE_NOT_IGVM_I= NIT; + break; + default: + s->launch_update.status =3D VM_LAUNCHUPDATE_LOAD_FAIL; + } + goto end; + } + } + /* process other machines here when support is added */ + } + + /* clear the addresses */ + s->launch_update.fw_image_addr =3D 0x0; + s->launch_update.fw_image_size =3D 0x0; + + end: + trace_launch_update_write(); + return; +} + +static void launch_update_select(void *dev) +{ + VMLaunchUpdateState *s =3D VMLAUNCHUPDATE(dev); + init_vm_launch_update(s); +} + +static void vmlaunch_reset_enter(Object *obj, ResetType type) +{ + VMLaunchUpdateState *s =3D VMLAUNCHUPDATE(obj); + + if (target_arch() !=3D SYS_EMU_TARGET_X86_64) { + return; + } + + if (s->host_igvm_on_reset) { + restore_host_x86_igvm(); + s->host_igvm_on_reset =3D false; + /* restoring host igvm enables the interface again */ + s->disabled =3D false; + /* clear the host IGVM ctrl bit */ + s->launch_update.control &=3D ~VM_LAUNCHUPDATE_CTL_HOST_IGVM; + } + + if ((s->launch_update.control & VM_LAUNCHUPDATE_CTL_HOST_IGVM) && + (s->launch_update.status =3D=3D VM_LAUNCHUPDATE_SUCCESS)) { + info_report("vmlaunchupdate: next reset will use host igvm"); + s->host_igvm_on_reset =3D true; + } + + trace_vmlaunch_reset_enter(); +} + +static ResettableState *vmlaunch_reset_state(Object *obj) +{ + VMLaunchUpdateState *s =3D VMLAUNCHUPDATE(obj); + + return &s->reset_state; +} + +static void vm_launchupdate_realize(DeviceState *dev, Error **errp) +{ + VMLaunchUpdateState *s =3D VMLAUNCHUPDATE(dev); + FWCfgState *fw_cfg =3D fw_cfg_find(); + + /* multiple devices are not supported */ + if (!vm_launchupdate_find()) { + error_setg(errp, "at most one %s device is permitted", + TYPE_VMLAUNCHUPDATE); + return; + } + + /* if current machine is not supported, do not initialize */ + if (!vmlaunchupdate_supported()) { + error_setg(errp, + "This machine does not support vm-launch-update device"= ); + return; + } + + /* fw_cfg with DMA support is necessary to support this device */ + if (!fw_cfg || !fw_cfg_dma_enabled(fw_cfg)) { + error_setg(errp, "%s device requires fw_cfg", + TYPE_VMLAUNCHUPDATE); + return; + } + + fw_cfg_add_file_callback(fw_cfg, FILE_VMLAUNCHUPDATE, + launch_update_select, launch_update_write, s, + &s->launch_update, + sizeof(s->launch_update), + false); + + clear_init_vm_launch_update(s); + /* + * This device requires to register a global reset because it is + * not plugged to a bus (which, as its QOM parent, would reset it). + */ + qemu_register_resettable(OBJECT(s)); +} + +static void vm_launchupdate_finalize(Object *obj) +{ + qemu_unregister_resettable(obj); + trace_vm_launchupdate_finalize(); +} + +static void vmlaunchupdate_device_class_init(ObjectClass *klass, + const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + + /* we are not interested in migration - so no need to populate dc->vms= d */ + dc->desc =3D "VM launch state update device"; + dc->realize =3D vm_launchupdate_realize; + dc->hotpluggable =3D false; + set_bit(DEVICE_CATEGORY_MISC, dc->categories); + rc->phases.enter =3D vmlaunch_reset_enter; + rc->get_state =3D vmlaunch_reset_state; +} + +static const TypeInfo vmlaunchupdate_device_types[] =3D { + { + .name =3D TYPE_VMLAUNCHUPDATE, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(VMLaunchUpdateState), + .class_init =3D vmlaunchupdate_device_class_init, + .instance_finalize =3D vm_launchupdate_finalize, + }, +}; + +DEFINE_TYPES(vmlaunchupdate_device_types) diff --git a/include/hw/misc/vmlaunchupdate.h b/include/hw/misc/vmlaunchupd= ate.h new file mode 100644 index 0000000000..02f96cebdc --- /dev/null +++ b/include/hw/misc/vmlaunchupdate.h @@ -0,0 +1,38 @@ +/* + * Guest driven VM launch state update device via IGVM. + * For details and specification, please look at docs/specs/vmlaunchupdate= .rst. + * + * Copyright (C) 2026 Red Hat, Inc. + * + * Authors: Ani Sinha + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + */ +#ifndef VMLAUNCHUPDATE_H +#define VMLAUNCHUPDATE_H + +#include "hw/core/qdev.h" +#include "qom/object.h" +#include "qemu/units.h" +#include "system/igvm-cfg.h" +#include "standard-headers/misc/vmlaunchupdate.h" + +#define TYPE_VMLAUNCHUPDATE "vm-launch-update" + +typedef struct VMLaunchUpdateState { + DeviceState parent_obj; + VMLaunchUpdate launch_update; + bool disabled; + bool host_igvm_on_reset; + ResettableState reset_state; +} VMLaunchUpdateState; + + +typedef struct VMLaunchUpdateStateClass { + ObjectClass parent_class; +} VMLaunchUpdateStateClass; + +OBJECT_DECLARE_SIMPLE_TYPE(VMLaunchUpdateState, VMLAUNCHUPDATE); + +#endif --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976561; cv=none; d=zohomail.com; s=zohoarc; b=EfxXL6MaOPH1wdFmVCKj5EhrK6wnHCIGgzJMwHBU+MYlEhmSFEdG+6sxhB/N7xHs3jkVq9JpqAmL1Q14wxzS8H0+kyMMEYYOvRSI6EurhKZ/S5md+cBpdULc5ieB+cfnAVwIbHMKJi/1RdbI44wDJtQQw8mcPhOi56Hagm1BubM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976561; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=z0qCthAFr/DIKpD7/dlo12emnrFf2YBkiSotfvY0uUc=; b=jAQjoS/WgfBPe9KS9JLrZJFV1ZkIzcJg50/GSBWqLyDkDieB0dS5ct3UCEcKEJn9/4VxO1SEcbEFj0tgMe4Tgzg04OZmMCYrLhh0dtMTdHaI2PYqX18JLRwc2ovXB2X1effx1R4yp9a8zaXPn5gw68ShBhiQc57mhUugn4Ls5A4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976561093444.9601566648106; Mon, 17 Aug 2026 07:22:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyD8-0000NR-RR; Mon, 17 Aug 2026 10:21:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyD6-0000IJ-SO for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:08 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyD4-0002k1-ME for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:08 -0400 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-687-HGvLwZ2mOMiI5AT0Smi8Nw-1; Mon, 17 Aug 2026 10:21:04 -0400 Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2cea6a46766so60284245ad.0 for ; Mon, 17 Aug 2026 07:21:04 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.20.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:21:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976466; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z0qCthAFr/DIKpD7/dlo12emnrFf2YBkiSotfvY0uUc=; b=SC/5OItfqS7mtroTEcGPZnC4Fx/SJPQm5VzZ84OT1DGdttSiYxD1kujSDdYSERdNlUaye1 IkloQ9HkMlRu50fkr546gi2aaFqOl9j3w1/PquLc+F/PgwDTuxDPZowSueDTJlc4+zHMUe ouOEBxgQNmrbXo2UOoetvPM7t7cmJYM= X-MC-Unique: HGvLwZ2mOMiI5AT0Smi8Nw-1 X-Mimecast-MFC-AGG-ID: HGvLwZ2mOMiI5AT0Smi8Nw_1786976463 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976463; x=1787581263; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=z0qCthAFr/DIKpD7/dlo12emnrFf2YBkiSotfvY0uUc=; b=MMlieuSGcpKkTcTHSl9nXp8Tk6POfFXYfnHhrACKCumWYQJwvYvhMuKyeM2KFI2jXM iiPjxkQdw49rYbGm2XKgWJ5ydHTFWIYMGaIiZgNQ+zxerOK9vHEVDSpIHsWzpeHGQpjp ka+IrbkWw/PiIf/tPVcdlOOkaIlJUVAcXnoFn1RMRsXeaGOtjOzhVzlId9uunk7DiAKk zePXxqHm/lG8feHDC9MleioRH5bRElnKZkMFep6cEsu86N9W/tSSvRMnn2B2xy2C0bQ0 dt4z58n4YkKINuxszddMNsiOfo/UqdooRLmC/ExfH00Rv6pYGg6//BHvIRi5EY3++QI5 XVWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976463; x=1787581263; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=z0qCthAFr/DIKpD7/dlo12emnrFf2YBkiSotfvY0uUc=; b=ksc3w+y45Nf7aUmdzPLCxavV8+hFbhTx6eTKd1Kk+6CIGxUeQtv9qOLDXKVjOw8syA CNTeEvYyWBXU1IoT4fSttTWPbn380VTwoX0wVbQl732JzqdHqQWYbjE76L5R3SlVBcit rUI5KnqaG2RwCGAjJVuKDYdldAUiSHzW2gxFe+ltc+GTAXj/XYXKS11Uxpmj2sMgOYdb Xh8x/UtQykdEy94SHZnZug4hrTh/nKtCuV5fLZiKRaM1kV69UgWF52IIyfa4SHnuy+c4 Jd4FL6/MXCd+qR3IwO1wmRNoAK6nbiM1zbhZBkoqUS6GqlpQCr782lfVTCiSZ+oSjpLH isSw== X-Forwarded-Encrypted: i=1; AHgh+RpBjVB69dasx4LzU9gZzXtgP1J1Sp7wdvVQWqtYm+jGp+/7o1cyS6PVlJGLd9NXj4CjB2TyaFYmfpHV@nongnu.org X-Gm-Message-State: AOJu0YwO2A8yrUqlmlUlVg9o+bbMtoqGv5WxvUVN9IkJ/G7vvA9o72k3 rzAIuInq87FYe6q0rEIf+fY7frGC9G6Hf+LU7mD8WD840xNM+aGFSLLACiy9SHYORXlZMrV1T57 8015xG0R/rqnE6JKRHb44UUGUA67KV0sl0l9lFGeScbcy6ROSFAIurvyn X-Gm-Gg: AR+sD118u5B/a5H5MolbT6u0hUIKdHrF+U6gjW/luLOWyBayHWw99fRUNOaHacNrKic vqNlp4DTQmZGTq+MqU+yKoD/eBcXc/PmQ961FZJ43vhHt49mLWkQMZqHEuJtaLEi2IpnhZ/EvDt jZhoUJHDSr9acJSUnXMUknzRcAHccdqWo5OuQb7U/nxbL30h7KWHu8XYqs6TVFgmyFJPL1eq4Df xfiISDGFYzDYVTrgJa62OXYN2HIp9W8n6K/wtdUU4HjBseKmI3Dv5o4NDkSDgXBbXGhzmSCMClU /PzI4CTZh4flc2wzckKOvtytRzx+5pdvEDMkteYXIfN/jbz25OqBrHgcRJcn9GO8lgJkfOFulOn 64u7dFekbcBYI9TkAFb1UZw5QuK3zfZFmTQ== X-Received: by 2002:a17:903:1b45:b0:2cc:f5b8:4c2e with SMTP id d9443c01a7336-2d5c4f5655emr8091695ad.9.1786976462732; Mon, 17 Aug 2026 07:21:02 -0700 (PDT) X-Received: by 2002:a17:903:1b45:b0:2cc:f5b8:4c2e with SMTP id d9443c01a7336-2d5c4f5655emr8090715ad.9.1786976461998; Mon, 17 Aug 2026 07:21:01 -0700 (PDT) From: Ani Sinha To: Pierrick Bouvier , Ani Sinha , Gerd Hoffman Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org Subject: [PATCH v6 08/11] docs/spec: Add a specification document for vm-launch-update device Date: Mon, 17 Aug 2026 19:50:03 +0530 Message-ID: <20260817142010.80693-9-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976563424158500 Content-Type: text/plain; charset="utf-8" This change adds a specification document and expanation for the vm-launch-update device. CC: Alex Graf CC: Gerd Hoffman Reviewed-by: Alexander Graf Signed-off-by: Ani Sinha --- docs/specs/index.rst | 1 + docs/specs/vmlaunchupdate.rst | 199 ++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 docs/specs/vmlaunchupdate.rst diff --git a/docs/specs/index.rst b/docs/specs/index.rst index b7909a108a..3cdf242661 100644 --- a/docs/specs/index.rst +++ b/docs/specs/index.rst @@ -34,6 +34,7 @@ guest hardware that is specific to QEMU. virt-ctlr vmcoreinfo vmgenid + vmlaunchupdate rapl-msr rocker riscv-iommu diff --git a/docs/specs/vmlaunchupdate.rst b/docs/specs/vmlaunchupdate.rst new file mode 100644 index 0000000000..d9d36fde94 --- /dev/null +++ b/docs/specs/vmlaunchupdate.rst @@ -0,0 +1,199 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +VMLAUNCHUPDATE Interface Specification +###################################### + +Introduction +************ + +``VmLaunchUpdate`` is an extension to ``fw-cfg`` that allows guests to rep= lace +boot state in their virtual machine using IGVM file container. Through a c= ombination +of this ``fw-cfg`` hypervisor interface, an IGVM file containing specific = directives +and with hypervisor stack knowledge, guests can deterministically replace = the launch +state for guests. This is useful for environments like SEV-SNP where the +launch payload becomes the launch digest. Guests can use vm-launch-update = device to +provide a measured, full guest payload (BIOS image, kernel, initramfs, ker= nel +command line) to the virtual machine which enables them to easily reason a= bout +integrity of the resulting system. +It is also to be noted that this mechanism currently works only when the g= uest was +already started with an IGVM file defining its initial launch state. Subse= quent +guest resets will use the launch state as defined in the guest provided IG= VM file, +not the file with which the guest was initially started. If the guest was = not started +with IGVM, writing a new bundle through the ``fw-cfg`` interface has no ef= fect. + +For more information, please see the `KVM Forum 2024 presentation `__ +about this work. + + +.. _KVMFORUM: https://www.youtube.com/watch?v=3DVCMBxU6tAto + +Base Requirements +***************** + +#. **fw-cfg**: + The target system must provide a ``fw-cfg`` interface. For x86 based + environments, this ``fw-cfg`` interface must be accessible through PI= O ports + 0x510 and 0x511. The ``fw-cfg`` interface does not need to be announc= ed as part + of system device tables such as DSDT. The ``fw-cfg`` interface must s= upport the + DMA interface. It may only support the DMA interface for write operat= ions. + +#. **IGVM support**: + The hypervisor must provide support for parsing and executing the IGV= M file bundle. + +#. **Confidential guests**: + For confidential guests, the hypervisor must support guest reset. Oth= erwise, the new + boot state provided through IGVM will not be applied. + +The Fw-cfg File +*************** + +Guests drive vmlaunchupdate through special ``fw-cfg`` files that control = its flow +followed by a standard system reset operation. When the ``vm-launch-update= `` device +is available, it provides the following ``fw-cfg`` file: + +* ``etc/vmlaunchupdate`` - It exposes a structure of the following type, a= ll in + little-endian format: + +.. code-block:: c + :linenos: + + typedef struct { + uint16_t version; + uint16_t status; + + uint32_t _padding; + + uint64_t capabilities; + uint64_t control; + + uint64_t fw_image_addr; + uint64_t fw_image_size; + + uint64_t opaque_addr; + uint64_t opaque_size; + + } VMLaunchUpdate; + + +Currently, the ``version`` number (line 2 above) is initialized to the val= ue ``1``. +Only IGVM files are supported at present. The ``capabilities`` (line 7) an= d ``control`` (line 8) both support +the following single value: + +* ``VM_LAUNCHUPDATE_FORMAT_IGVM`` + + This value is used by the hypervisor to indicate that only IGVM containe= r files are supported. + This is set as a part of ``capabilities`` parameter (line 7) in the abo= ve structure. This same value + is passed by the guest to the hypervisor in the ``control`` parameter (l= ine 8) in the above structure + to indicate that the guest passed IGVM file in memory to the hypervisor.= The starting guest physical + address of the IGVM file in memory is specified in ``fw_image_addr`` and= it's length is specified in + ``fw_image_size`` by the guest. If any other value is passed by the gues= t in the ``control`` parameter, + the write is ignored by the hypervisor. + +Following ``control`` parameters are supported: + +* ``VM_LAUNCHUPDATE_CTL_DISABLE`` + + This value is set in the ``control`` parameter by the guest in order to = disable this ``fw-cfg`` + hypervisor interface from further updating the guest launch state with a= new IGVM file. + +* ``VM_LAUNCHUPDATE_CTL_HOST_IGVM`` + + This value is set in the ``control`` parameter by the guest in order to = send request to the + hypervisor to initialize the guest using the original host provided IGVM= file. + It is useful if the guest wanted to update the UKIs present in the ESP a= nd upon + reset, use one of the updated UKIs present there. If the guest passed ad= dresses in memory + where its own IGVM file is loaded (see below) while also setting this co= ntrol value, the next + reset will load the guest provided IGVM file and a subsequent second res= et will restore the original + host IGVM. If the guest did not provide any addresses of its own IGVM (t= he address values are + cleared) while setting this control parameter, the immediate next guest = reset will load the + original host provided IGVM file. + + The combination of the above two ctl interfaces work as + follows: + + A) ``CTL_HOST_IGVM`` =3D off ``CTL_DISABLE`` =3D off + + Supplied IGVM file replaces the firmware permanently. Updating the + firmware again is possible. + + B) ``CTL_HOST_IGVM`` =3D off ``CTL_DISABLE`` =3D on + + Supplied IGVM file replaces the firmware permanently. Updating the + firmware again is not possible. + + C) ``CTL_HOST_IGVM`` =3D on ``CTL_DISABLE`` =3D off + + Supplied IGVM file replaces the firmware for one reset. Resetting + again will switch back to the original firmware. Updating the + firmware again is possible. + + D) ``CTL_HOST_IGVM`` =3D on ``CTL_DISABLE`` =3D on + + Supplied IGVM file replaces the firmware for one reset. Resetting + again will switch back to the original firmware. Updating the + firmware again is NOT possible. + +``fw_image_addr`` (line 10) is the base guest physical address of the gues= t memory where the IGVM file of size +``fw_image_size`` (line 11) is loaded. ``opaque_addr`` (line 13) and ``opa= que_size`` (line 14) are used by +the guest for passing data across resets. The contents of this guest memor= y are preserved across the +reset. For confidential guests, this memory region must come from guest sh= ared unencrypted memory. + +``status`` (line 3) is written by the hypervisor and it indicates the resu= lt of the IGVM loading operation. +A success indicates status code 0. Otherwise a non-zero status code indica= tes failure. The nature of the +failure is indicated by the value of the code. + +Triggering the Launch State Update using IGVM +********************************************* + +To initiate the launch update process, the guest issues a standard system = reset +operation through any of the means implemented by the machine model. + +On a write to the ``etc/vmlaunchupdate`` interface, the hypervisor evaluat= es whether this +hypervisor interface is disabled. If it is, it ignores any writes to this = ``fw-cfg`` file +by the guest. No updates to initial launch state is performed. + +If the hypervisor interface is enabled, upon write to the ``etc/vmlaunchup= date`` interface, +the hypervisor parses the IGVM file bundle passed to it in memory, with st= arting guest physical +address at ``fw_image_addr`` and length ``fw_image_size``. If parsing is s= uccessful, it creates +a context handle to the IGVM file. If parsing and context loading is succe= ssful and there are no +errors, ``fw_image_addr`` and ``fw_image_size`` are cleared. The guest can= check this in order +to determine if the IGVM was successfully parsed and the new context was l= oaded. If not, the +guest can throw error and abort rebooting to new IGVM boot state. Alternat= ively, the guest can +also check the ``status`` code from the ``fw-cfg`` file. A status code of = 0 indicates success +of the operation. Non-zero status code indicates failure. Exact nature of = the failure is +indicated by the value of the code. Currently, only two error values are s= upported: + +* ``VM_LAUNCHUPDATE_LOAD_FAIL`` - defined as value 1 and is set when loadi= ng of the IGVM file failed. +* ``VM_LAUNCHUPDATE_NOT_IGVM_INIT`` - defined as value 2 and is set when t= he guest was not started with + IGVM file. + +Upon guest reset, the hypervisor executes the IGVM bundle using +the context handle, setting the initial launch state of the guest accordin= gly. +If an invalid IGVM file is passed, parsing the file fails and the hypervis= or ignores it +when ``fw-cfg`` files are written. In this case, the initial launch state +is not modified. If invalid addresses are passed, the hypervisor ignores t= hem as well and no +new launch state is set. + +The launch state update mechanism works both for confidential and non-conf= idential +guests. In confidential guests, as a part of the reset operation, all exis= ting +guest shared memory (shared with the hypervisor) as well as the guest memo= ry region +starting with ``opaque_addr`` and length ``opaque_size`` are preserved. +The reset causes recreation of the VM context which triggers a fresh +measurement of the replaced BIOS region and reset CPU state. + +For non-confidential guests, there is no concept of guest private memory a= nd all the existing +guest memory is preserved (this is the default behaviour today - QEMU does= not reset/clear +guest memory upon reset). + +In both confidential and non-confidential cases, CPU and device state are = reset to +the reset states specified in IGVM. In confidential environments, the guest +always resumes operation in the highest privileged mode available to it (V= MPL0 in SEV-SNP). + +Closing Remarks +*************** +The exact content of the memory region specified by starting address ``opa= que_addr`` +and length ``opaque_size`` is guest specific and is hypervisor agnostic. T= he hypervisor does +not care about the contents of this memory region. Therefore, it is not in= cluded in this +specification. As of writing this document, TDX guests on QEMU does not su= pport IGVM. +Therefore, this mechanism cannot be used to change launch state of TDX gue= sts. + --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976546; cv=none; d=zohomail.com; s=zohoarc; b=kKYO4AiJlBBBhScWfFi6EDY25SQfVLY+mOhRtmGjqzSWEUWoCEtkfXQiSFM3t8R7yliERWg5h+8AGtsayULfSNBr0RDagZkkzVtnRK4ehDlIdh+SU9YCioDG2jVfb4qQa8QoHH7wp2sPCqO51iEpCaAvcI21SWWXTTEWASbhrgU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976546; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rn6ZxlseNb5KY+Qe+znIP6u3wMWUatEgwp6fksH9KUE=; b=GZUZcUpZQmVNy02lyb7IQWdKEmyb+KyA4XYpDjag+8rN5gVSyCGgqKqYCG5jEjL/AcJ++kQc2g+He9FkN/yG8x+AFGnyNla03keSUMiVp69RESS1fyeZg+XfQPWaWRzMHos+KwwIGug3vROR9nNb//SoSUX3o/9tANS5tUDqczE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976546798825.5878717338265; Mon, 17 Aug 2026 07:22:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyDK-0000wc-M8; Mon, 17 Aug 2026 10:21:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyDI-0000qM-UK for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:20 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyDC-0002m4-FP for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:20 -0400 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-582-53XawVAWMfSFiBMtTILr6w-1; Mon, 17 Aug 2026 10:21:11 -0400 Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2caf4173b1cso66073285ad.3 for ; Mon, 17 Aug 2026 07:21:11 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.21.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:21:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976473; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rn6ZxlseNb5KY+Qe+znIP6u3wMWUatEgwp6fksH9KUE=; b=ZQr9K7OGtiZNYXk4Vn43/8EVZO44mziG+9oasBbUx2n4/1pHHW1ta9CZU+6nNeiqL8dALt Vq+f/CsTGRdXoq5xD3Y+w7e2BZcXELq62XCmTErOToruIAV2j81TGOvw730NVWo/LWBR+P c0ohtOLU+1Vs68Z+ZcmIznCgjF7Oz4w= X-MC-Unique: 53XawVAWMfSFiBMtTILr6w-1 X-Mimecast-MFC-AGG-ID: 53XawVAWMfSFiBMtTILr6w_1786976470 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976470; x=1787581270; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=rn6ZxlseNb5KY+Qe+znIP6u3wMWUatEgwp6fksH9KUE=; b=VArub4+aKHrwLT10O28RgJWnlgyPiGnqU6qx/Xq3jpifWpN6Hdz/spe1F7EIp9zlEg ArCtdfVVynwADGw+Q1ZtHql+SwhT2iG5vXUr9HCifMsPYpJSO8IxNvdNqqNLWqc/n4b/ 1Zs2pqX3daJz36H4qOuOY80+qGTRlrnxKe5/Fgw31D+Yln9q7yik2/1EqSbHRznBnk+P 4safQ3x8kQtG22/X6uJt5V+uDXI9zOa5IVrYTwyUgjWe7i8k7s/Priw01wYym1yVNNHs WX7yg8QwweakeLxvdVhawqs/pceil+6SbsX8Pe9eQcddrQoU1xNJIJL1l6IvUDJcTXNh KQ5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976470; x=1787581270; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=rn6ZxlseNb5KY+Qe+znIP6u3wMWUatEgwp6fksH9KUE=; b=L+Ros+IWAvDilk63T7xUH8cxVObG4eVh4foHckEb1yMoCF4T+czujFaYTRTiuaEjkR 9rit9xXjcMcSGgP3B1y4BS+Ctqw/tj4vBm2O1gYMC/fi9YO4iTMtD/95rkGIC0Rea+2c EcxYLTpRN9KBokAQTozz/HrliTu0rFSIuOgDzL8D1ctMg4Lse0xNC4Jv97Hk/qEVfpo3 DN8rszi3etdOKjokm314Ou5TeFXBOxR8AeTxzaJuTpgWDsULrKuR6y3o+YSUNwOWx7Pd Q+UHlLgTnU9AwjPDygaiJxvdhhZDiMicml6iaqO6YLAU1awqiDTh2Yh6DW2csnhXKvJM oU6w== X-Forwarded-Encrypted: i=1; AHgh+RrPc5mgugoisJy61YlR+wbcjt9rP1OLrE1Eas1oFXBBCYfW4F5yUWZDvoske4NSF/tAnulUPtnPjXu0@nongnu.org X-Gm-Message-State: AOJu0YyHAf5TB4ASiRL1AjevwWvsJjLaSzpvWJxPh+fePO5D8NJQo2VD X8Hqz0E8r/CLU+h6IEEE2OCnZah4S0BTW2SwI69vIBGseD0LJXjBOXQDtNXqzmEFWONcELYyPLH sNXAibpOFz5zmqaBnC24TCFSTJjRM/59dSJ3f69uMwDaiNsuUAQuIpDG0 X-Gm-Gg: AR+sD10Xj22IudELC5E+6BrqRwcEliC8/4xZd3ogwB0+ahQ6CgKgTH1RQQexJfTpFqo wuF+NS1zn9yu1bBryLXBzIqcbOkJo+AkSJKfD6BdoceM7rSIy8gFf+q1vIY0FGEiuOavYSWYPpZ z4R3qWFnpvQCDXzsNNhaaq5SfrlrMb5gMshI7RwCMuydhPWUxvisls142rbBz4mF1MyT2Xor+cy zgg+TuTCd/bJsc6rJEbJlJt1s8I/jUyns8ylzYVKyrXRJ6YtgHxpGeTdHuTN3Z7/KdOPwW9EqoS Cl0b8y+1F22lirCYwuZnDURQzbfND+O8eEAYJSlA55eVnn8ghkaBN6i938vAQZk8LV94+Bsd+91 Z5oiwywgmik4NhbxdtxmFDfj6vdJjIOvXGA== X-Received: by 2002:a17:903:1ac3:b0:2ca:d9b3:715e with SMTP id d9443c01a7336-2d3b088ac7fmr336738355ad.9.1786976467859; Mon, 17 Aug 2026 07:21:07 -0700 (PDT) X-Received: by 2002:a17:903:1ac3:b0:2ca:d9b3:715e with SMTP id d9443c01a7336-2d3b088ac7fmr336736055ad.9.1786976466295; Mon, 17 Aug 2026 07:21:06 -0700 (PDT) From: Ani Sinha To: Ani Sinha , Gerd Hoffman Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org Subject: [PATCH v6 09/11] tests/qtest: Add small igvm files for testing purpose Date: Mon, 17 Aug 2026 19:50:04 +0530 Message-ID: <20260817142010.80693-10-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, LOTS_OF_MONEY=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976547662158500 Content-Type: text/plain; charset="utf-8" Needed by launchupdate-test.c. README file is added with explanation on how to build these IGVM files. CC: Alex Graf CC: Gerd Hoffman Reviewed-by: Alexander Graf Signed-off-by: Ani Sinha --- tests/data/igvm/README | 45 ++++++++++++++++++++++++++++++++++ tests/data/igvm/hello.igvm | Bin 0 -> 137112 bytes tests/data/igvm/qemuinit.igvm | Bin 0 -> 137112 bytes 3 files changed, 45 insertions(+) create mode 100644 tests/data/igvm/README create mode 100644 tests/data/igvm/hello.igvm create mode 100644 tests/data/igvm/qemuinit.igvm diff --git a/tests/data/igvm/README b/tests/data/igvm/README new file mode 100644 index 0000000000..d4d26478ee --- /dev/null +++ b/tests/data/igvm/README @@ -0,0 +1,45 @@ + +=3D=3D=3D This is the readme file for all IGVM file bundles provided =3D= =3D=3D +=3D=3D=3D All IGVM files are covered by GPL v2 or later =3D=3D=3D +SPDX-License-Identifier: GPL-2.0-or-later + +Small IGVM file bundles required for tesing vm-launch-update device +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +This directory contains IGVM files required for launchupdate-test.c. +These IGVM bundles can be built from the following repository: + +https://gitlab.com/anisinha/virt-firmware-rs + +Just type "make" in the top of the repository. The built IGVM files +can be found in the target/x86_64-unknown-none/debug directory. + +$ ls -l ./target/x86_64-unknown-none/debug/*.igvm +-rw-r--r--. 1 anisinha anisinha 153624 Jun 8 10:05 ./target/x86_64-unknow= n-none/debug/hello.igvm +-rw-r--r--. 1 anisinha anisinha 157848 Jun 8 10:05 ./target/x86_64-unknow= n-none/debug/igvmtest.igvm +-rw-r--r--. 1 anisinha anisinha 987384 Jun 8 10:05 ./target/x86_64-unknow= n-none/debug/mefisto.igvm +-rw-r--r--. 1 anisinha anisinha 368312 Jun 8 10:05 ./target/x86_64-unknow= n-none/debug/qemuinit.igvm +-rw-r--r--. 1 anisinha anisinha 223944 Jun 8 10:05 ./target/x86_64-unknow= n-none/debug/snptest.igvm + +The IGVM bundles for sev-snp testing are also kept in a seperate directory= /snp_igvm_bundles in the +above repository for use without requiring to build from source: + +$ virtfirmware-rs/snp_igvm_bundles$ ls -l +total 388 +-rw-r--r-- 1 anisinha anisinha 199176 Aug 7 00:58 snptest.igvm +-rw-r--r-- 1 anisinha anisinha 195048 Aug 6 06:10 snptest-nohello.igvm + +Following files are used by the tests/qtest/launchupdate-test.c for non-co= co case: + +hello.igvm +qemuinit.igvm + +For confidential case (that is when COCO=3D1 is passed in the environment)= , the following +IGVM bundles are used: + +snptest-nohello.igvm +snptest.igvm + +The IGVM bundles used by the confidential case are not checked into the QE= MU +repository. Users who wish to test the confidential case can use the IGVM +bundles from https://gitlab.com/anisinha/virt-firmware-rs as mentioned abo= ve. diff --git a/tests/data/igvm/hello.igvm b/tests/data/igvm/hello.igvm new file mode 100644 index 0000000000000000000000000000000000000000..2d3ffda5b157c13d109ef965d1c= 0f41e9a34caf5 GIT binary patch literal 137112 zcmeEv3w&Hvwf9V#X+uky01XX@bkI>!9x_oXDKs#Fl%8M$1GZ9BFp88SSB#L*UICe! zRC74YH7W{TMdG_Y(5QtL#4@4S7bpRgw=3DkfRuKw?V)$?QIib+iGb=3D(Lp7z8RJcdHmp-|Xdd{?8q|F4KwD|k%76AGSG@RWkLD|m;3rxm z|LLOsOK1SER`8gDCloxX;3)-fSMUx6Pb+wzg7+)yMlKp zcv`{x6ue)-2NXQ3;6nK631@BPsw1W33c)x-V zD0o)EhZH=3Dg;3Eni`ktbH1&=3D9sLcx;?o>K631@BPsw1W33c)x-VD0o)EhZH=3Dg;3Eni z`o5xn1&=3D9sLcx;?o>K631@BPsw1W33c)x-VD0o)EhZH=3Dg;3Eni`hlW<1&=3D9sLcx;? zo>K631@BPsw1W33c)x-VD0o)EhZH=3Dg;3Eni`k|tK1&=3D9sLcx;?o>K631@BPsw1W33 zc)x-VD0o)EhZH=3Dg;3Eni`jMi41&=3D9sLcx;?o>K631@BPsw1W33c)x-VD0o)EhZH=3Dg z;3Eni`mv&a1&=3D9sLcx;?o>K631@BPsw1W33c)x-VD0o)EhZH=3Dg;3EniTBYb;!D9-Z zQ1GOJrxd(h!8;T@t>AqM-ml;T3Z7N)AqCGV_=3Dtjsexm4K!D9-ZQ1GOJrxd(h!8;T@ zt>AqM-ml;T3Z7N)AqCGV_=3DtjseyZqS!D9-ZQ1GOJrxd(h!8;T@t>AqM-ml;T3Z7N) zAqCGV_=3Dtjsex~SO!D9-ZQ1GOJrxd(h!8;T@t>AqM-ml;T3Z7N)AqCGV_=3Dtjsey-?W z!D9-ZQ1GOJrxd(h!8;T@t>AqM-ml;T3Z7N)AqCGV_=3Dtjsu2b}{;4uYHD0ouAQwrX$ z;2jE{R`5Or?^o~v1tFd_=3D)RzfknA;4uYHD0ouAQwrX$;2jE{R`5Or?^o~v z1tFd_=3D)Rzf|tFd_=3D)R z1B(6?Jf`3Y1y3q?O2OL|yhFj$3f`yS{R%#y;8_J9Qt+IDk0^NPSBm}>Jf`3Y1y3q? zO2OL|yhFj$3f`yS{R%#y;8_J9Qt+IDk0^NP*NXlXJf`3Y1y3q?O2OL|yhFj$3f`yS z{R%#y;8_J9Qt+IDk0^NPH;VohJf`3Y1y3q?O2OL|yhFj$3f`yS{R%#y;8_J9Qt+ID zk0^L(wW5Cok12RU!IKJ}Qt);K?@;ixg7+zSzk&}acviuO6g;QkBMKh6UeUjT#}quF z;7J8fDR{ercPMyT!TS`vU%>|yJgeYC3Z7H&5d{z3py*%0V+x*7@T7vL6ue!*I}|*v z;C%|-uiyg;o>lN61Clx%U;Oz?Dq2Or+?^E!81s_oGtbz|Icuv7b6g+g3qJIUCDR@G`lM0?v@OB07 zQ1G;Z_bGV4f)6NoR>6l9Jg49z3Lg5cqJIUCDR@G`lM0?v@OB07Q1G;Z_bGV4f)6No zR>6l9Jg49z3Ld&y(Z7Pn6g;8eNd-?Sc)NmkD0o`I`xLxi!3PvPtKdTlo>TA<1rPmB z(Z7Pn6g;8eNd-?Sc)NmkD0o`I`xLxi!3PvPtKdTlo>TA<1rM!L^snGC1y3k=3DQo&OS z-mc&s3Z7Q*J_YYr@BszSD)^9s=3DM;QI!9%ww`d9Fnf+rL_so*IEZ&&aR1y3t@pMv)* z_<(|E6?{m+a|%A9;GvN*8bBETUHv671^H8Y|383VH31$A;O13>^74rQZk8g-@nits zI05}s0Kabnygh(FH38lcz_(3+rvvyDO2Paqw!bfc&zu1758ww)fDZ)lBPYPK0ery( z_)q{pZ2~+Oz|WZg9|_>gCcs0_2lPJyULC-%ngEXl@E=3DcrCj$7I3Gie9-#7uD3gGum zfVT(mrzXHV0{FHG@N@t_$Jc(~`xku*-ml;T0enhDv4Wy~Wdry`^$#g{PQgbMJoG|I z{}a_;t>7^QPbhd&!BYy}uHYRCo>uTa1@Bkz0R_)0_>h9<6nsR%LoX`&SMZpECloxX z;3)-fSMUx6Pb+wzg7+)D|k%76AGSG@RWkLD|m;3rxmlN61cIZg10Mphk~aSyidXV6?{O!vkE?>;5h{!3E<0$+mE|$c1d8D1a?Va zmjrf6V3!1TNnn=3D*c1d8D1a?Vamjrf6V3!1TNnn=3D*c1d8D1a?Vamjrf6V3!1TNnn=3D* zc1d8D1a?Vamjrf6;QuQL$nN;J?hMKGYxepr^UeH!XG3R&P=3D%bdFjU{OBpTkQV{FM< zzLFe$M|R2Ys&TXA>HYA&aMi!FVoNI;%dQG{Muw+>{_u*ikhAf&P$(O6>c`yY@=3D;`Z zsqoJ`0{@&9&(u|hLXH=3DC@X=3D7{mPyDlHiV}?;mOHd60aH?s?XME-3_;}0r@ukb=3D(ce z@Y_-bJY64nBHZ|MCU}wSa1nYvlHulfH3%Rf(|Fc%q0qYBN%Lj=3DF*MI9&*VkUEKd;1 zr!vipd=3DM9*e6Y<^ime)+Uo&Jl^2lG9!_?zN?hiakd+ua{7a783Y^bn3U`}_SJxd*TAsXV2I3641Hpiuf z-X**?$7}hg!ErB%C)r|$cZ+$~4w5xSM92{%l{zF%wQY`}QAkfX-oki7x>NmTr~8$V z6Kx)Jeu5^2IuCGANv-1{*X5z!=3DJ;vR8^DCm=3DWig^rB*w<;e6g=3DQh2@jIBSHck z&omsLZ>pZ4Jo#%nUJmZ8H62 zIQ@7y8NFd^^oF~mH*9W>-jD^myIFQoWODDq_>{|WjfaUDsqTk_DF6?e7m9v88xP|) z0;-kaLajyKJq`&Wz4G#f@kmfoMSC~xofik4C>g6ZZNB_r%GOdUijMN>9ZL2-@3<(j z1^k1>J&HxskAczWqc;qp9j6F^V##s!K}9HK<@=3DtAvPuC{A1jmYXo`^fq=3D}2be_k!l zfQIMZ98dGXYrO73=3D^;-(B=3D+JpUc=3D|iobx{w1{%3fk|D{S_&1RMa&uV~?y4vpf{vLQ zVdm-IMdsE_D9+saPO?wx6T=3DhKq$AyPo$2Gf1f&laMeWEy{Vu85)&HJg^8ld%V7 zrq5;rKxr{s)xHnw!_!heb(p8-_;PxI82FecoFntt&~PnAUg)pdabGC9RC=3DP4H@$=3DY z>Hl|px%77aX>hy+5V$zgW@x562cI+=3D?mC1jgY;VIEO(=3DHk*k%im`c1W&mxdgb9`}O zKgXM1{j6wmPhOCtj!2>~kL9byJ;F+7EDeWlq7!!9d-FVh$SQzZ((Np>v{V}YV_9e` z{)D?&!!Q0WHT;s7QVkUap#lSi$A=3Db|!*v?{jXLh@jhEfeEN?|!RiuM9EM&JFp=3DseN zg1CeYpltA%v?CCj4URsB$}f>&=3D*;_RmC_;iVnga6wovrS>=3D9#
b%X`Syga=3D^G9 z*;lw{Gij+a%^+K8T2=3D#s>kdbRQhztB9e4t^I#$@10*X0n`G9|y)!*%GgQt^Gj^aBS zcNbL@uCa}WheG@R4ek5do;H z#-|&5;{C8Hv9QdXXN_-}buW<2&4P%!>X|QvOg7&JlW*IfO+F&b7hU-r?uKu~ANa#z zpzw!xzf6DF6X)+J!?CQlWmv0|SuM%dB>tPhl;Q4Hr~B3p#~pOK2bVhC*>=3DahGR_}j za@;H8YvtM#&+_W6HtAmE9b_8yq?runM{%VGv?<6a1%XrvyFnyt%P@j7Wmwwru86b6 ztaOOapuS1cdxQpY#@)no7Qf%(5(@%1vEmhR3_Vgl&ugZ!?-^XY$N_)i(`uoLdO=3D@? z0W`MH;>~}AeB|q9J4~#$`1Hd`2h~dm3LPfc~{2! zna7KKNa{Dm;pq3_(1j8q7#uQ!wK)%iVPu>x8E+QEX!=3D2982*8fYaF{rG@ajOG`(0- zBM%^zilB9{kxZUg(~FI!;YhO%HQmkr;@j8i2|1isfrTa+=3D>d4{hD>ZM^Mv7@Y z@lmEhsVTWeR!E(uIFx#bRq8-VsZ;QwHz>71GTs~~vZGQD28!;x_g16SDr7>LN?V2| z!iF(rShw7eotKl6iPkjC8N}}hWO#O%m5$JFeXo| zR1ER-$uTGu#82>f%!=3DgN@?@ca zY+-?ow?>Yp!uvjVJ%gERoL&6-W$-(f9y0{(bzxD0~)BXuS0W zqw%G}L8Q@^p_Q=3DJOcsqthChdZi4|W>vvN5QR~w}x^t&?N!2%HSa=3DBt`2UKVv|5}?2!xO4k z#QS-L`a9$b=3DPl{*j20iTc-rF2Elx^Qf7arC7VqUX)427ogd^YI!Y5chQjPjy=3DA6}J z8WSH8_1E8STEO)ys2|Am?Bgf|mNtaUY)l5 zP`_DC!Te*zGZJ}VqJ+`X1WoyK_GEEM5vO@e8htYV-RWea$3{t4nviFkd8TLR!eqa( z=3Dfl#5ciA>TdUOXU)gf0-(J)(bm>*-uR;~qlk%NT4OX663z3WSXZ5A8;%in3kGJHqwLK0U@;4nMmDQmjlr&~Zv2b~pz67zQF)0|pj zB*o%{lVN*thnTJtX9NNSxq_CRh zq}4$;$8tp03W5Pvu5fI;0?*17I^z|pH*OK*H=3Di?&i@9FoMY;g9c^$@-Vl<^Xz%{3f z8lD79=3DC~3BhJj4)${BhXA;pyL$JI9_K$4a(roq!N4HI?;wOuQ&>W z&jN)T`S3HwjZl3k^8qPi)aGPX%f!ZaBjh~EMX1Fl?>3va7LQ~bqmTfl=3D}a}BVNF%M zW*U!vKf+#Js_clT3MobItu7nTQTCT8s+J|?RVvxWzS zpmg+_>rNAPH-PvpRY)h#EP^KIC0kM~D8|%S^oCI|vPGIEi;piMOYfEOf8cU?Pn=3DJ( zyfGIKOvCczR$L&rt7Nxi`YhCjwVsrzbYBoEu1GTD*ifn9HkNOWAC8sa!?}oh=3DpLQP z0@sCS9{Tpq;|lEh&wogGKXrq!%{38754FvyHn!RXfc-Hc>R(iN2ko*p|G8JOaI%lw zqcxS%8VpX9BCLuz);(Y1O1=3D?8)yo(KXfbKa^YNE0Fi#W&QvJESFq0V{gQTwdu(Xp{gOa_jBok3vkEw4m~)kL z;3lk#joV>Cf0Diqb}3K(BkPn3|51iULe|%Ik50YtOs4h|&Fl`XM%FHbKr-_-L1ce0 zLUA|d*H3262>O_Bnw2-6SquHLp$d+&VP>O>ow=3DJXSWtL7G(z$w)saaquTMl|fGhjEKfXDU#kJYAFOOeNR%j1+1kNX#S+{^MPy;9RY-Ajo_ z(5?ACY2qBfU>T2#C*m;`;PF39u^*xsHBOgkewA;&L-jT}dJj>p;nkDyz#x2deToJWi$JMvf^ z;PGLyf^!8$9;+>n_ncJZF~82&HD(Utek2yv`%D#ioNM|u=3D+=3DD3RK}l*3FsQJWr@dC ztN~ML2xC3e+-OQ%Bph&#m2zATz*A1Q#{@9`K@Uh`fS7-F6hR6{XpH(XXYOd{G|rBy zKr>XpMis|&ZW}QT6`RV%$bWLD<*eO%o$#iyTyz=3D+ z;8}N34P*r^iLrUZb+qtIq(wGQd<26NqqYZ;?-^ua z8L~T(UW1%ahLD58XHiMAESaPVA4c+#WyzBJcqG@CB{PCA9E#-s#JXll^5nEogXFvI zQeMeeILykl4YO`@O5i&;v4=3D~9S!SKGpDI=3Df`^4l(;!^1XoB>N;%FMYQvcs(Brymec zat}z|MCCdeY%p7*#p6KSpVjCsGxR=3DZ=3Dyj9c{;x|fg#&$#i;nG8#@S=3D>Y=3DU?D?Dt>r z&yzH<`;CNd31M+=3DY%Cgb-bugl#RiHF6Chb4jLZ~q*yc(wUCqUY1b3s+$+;zsyIN<( zW1s*pLLs^{m$)Za!H<*+5d7qV{2~6P+h9$GrTQ#qQnmG4Z?Y5opWbMO3ueG%q}EUW z??5^{4!qcxSc3oHFiDhtB_+<#yGn>$i>#oxUFOSkB7f#YzXv79t9P z=3DUGb6)?wTm9z{=3D!`PlAwUlxMyCMP^Z2`1>-qjYNtr;*UICYiJTvqkFLu-3Fetc&*I z^_ucL?%?11w5mz#(}k%xVQ_4C_-eKXh9N(xnEdu6rr_IvC#{4E_y^ zOO;Z&t=3DH5AGeK3eh12s)iT#5mcE|W21;|QBvRz@a{bLOqgz5RQ(n*#VT{z?kQI1l4 z)sA}v>~Ok!1NAE{B|%6@4ta=3Di)D{cc1;Yu-KY+U4O8L##zm@Wt>HE%kYvng%0pefh zKQn!pgZP`1pL8Z_K+YGgf&$)XzT5&ccJGo?P}@akGSNqkC?B~Ph3m%?u`P!qFGdqm3sjWdcsysDzEcsBw{8uuss8*Jm+)b0~(h#0|kZ4(SOF zKNMZ_xHeTeHrEKF3ko<|uDCGxd z2zt@v{GAV)kO!TO%b@ggYw2=3D!I9NK{@hF{6I!5LU^7z7P!y{I?W)+Z$8M&}xqMJF# zpCBHiGLQ@1Y?gF0w8`){!?XvS&A@;1fJ(5*vtld_elC~};m>FcAriV^zki+L6#4CO%u4LnvLO9?oK{u@(T0uZdUq>;DP zGizu(2)3Bkog$S!Qt{?|RSK*&D>R;;>>oF}grfv^!ckK{3xJnZQqV3Dfn*0)G9(cX z%h_tsXN-(HR7WGn9Y}EWz#S-3>bUFRU6OapdFQZO#8?G_Fto67Id`VK$dSM16ReHh z^ci8Os@yi%iD&`TbAx}A^luy*0il$CvzP|3qcPP{*U&pOYD|U{daH)7#Rcgwxt%jD z=3D5+_VA3HX^IgQiDmH6+I?%?3?xtSr2C8p;oek5uQLgjx->Xu8UHfsxa=3Dzd7t{GG_HxHVa(8ge5%G?(1a^62 z)i(G@@Uelt7z&Rxqr6c$^xlqy_ep|X#Pb^Cc$Cg`BULuPKHKbW$VcxU8?usVMaT||oFU(9O7{$ctO z)kyD%EFvlRU|Ki=3D9WT;~1j;vZbO3?-sW$K&AKpI*)6<|P2%aSN1+)&*OADR70~rOL z>XZ1&b)~vj+(zvM3;_Cv&LsM0gy=3D=3DOk(*44cQnJza!Ua3#xNZ`fRPEs#y1j>L0(2U z(j0R?{+HOQ;TAmJocImszt4a6R}8w#B5c^#Vzh}YIouzr;)8cfujuV&b0{fOa}2sZ zXdMn(>*)2#m;}9|fgXF7=3D}I}vgn)eR(1rV#R3zLj5dIlHzP)fR{eFspd(A(O6~cc+ zi|aSLcS?x3fJGNy-V#RtJ>k%2I+w}5&Vob#9_`_r(mp*K?b!$3#6CS2?O9xUS`zKa zFsBSbDOB?dQ_VT3M&2_L4W9Bdqo;O0!Jf$Yrsx+QfCPr05HZk$ddbC0u)6d&OcNz! z#sLIi`Il<>EOQ&k&FMf?Ze(Ux=3D;@G2?Oot%csl-IP(Fc8IMiqJghRpf*@Qc|G6Fpo zEBkS&vLq|}l3E$(6VWf+N^1P^%ra`{))>~M2B?_c+wnR&^40qlbB<@8D|pc_TupkH zj;Gf$jvfaAp_j!*jjee+JuD`H-ua}5MP@%&EB%*bmAOI;OB1lN&Cm-}vf?%xCbrxH zf?0=3D&vDHF?f;oRCpI=3D7{6{hpRE6F{AWpl7>VY{1$AdpiPB=3D76>7kWgSy^ zw}mBGkUYbuQhk}m&ov77(+u~92t#7iz~MtpuKzH(p7^P>(a)9eb4@n6&NR7hDbH2s z=3Dfby|S!2rN`eu2qn4jw=3Dlj}H>>q46gh92mON0qwbdriLMkvcq zS4HY@?jxvr5`(LyEXH$Ja>cnTxnh73au)X@Uk4W)x;7!1)Nmk6GDI%1!2Lx)DBzr+ z1@c9}kc^yYfl&+e2vLr3y+RT}6|Z>iv(Kb0!=3DZi7+2?-y%qoblvd<&-dB8riCgN-D zbBJb%=3DPaKyjTP&0@gk4^h)+1Lg;X?A-lzL7NyEDZY;&YH@FcVR{1gS;d+a(Vb9|TkEQWJSj^OX$PkHwdSHA&=3DVmmD7Rab# z&%Or6hX!`0q>K-Tv(aKAZ!aJjk&TQGHHPpnejGGPTP(>p#oiMz$;DC*cD3y&Y149) zvL=3Da0?>(0<#CEz=3Dn5^hs7;nSyauO(<4A0z#>tToXc79Zblfw>mJ3nIYmUJF#hLHx) zU1R9RNY}U5$kZQFAD9DBrtoNX7~wMOFjkL3=3D}Y1#d7ZU|Kk=3Drbb9v!*xrz4N${}hU z9!{?4T0_PXj<pKt7L&-QvB3RB zpu+&)u|VDe)`y_yEtd?|hu}GFpGliNv)4Wk+2=3Dm{%qoaqZJ%@Yx!*psCgQ8?^N4*O z;1!37vEc-U&-@;rO2_{B?(gH@Wt#0Tk%t3M##cRvGuh&+?)pK{S5XI#9w~;`|9$9y z6V9iqHwWl98v5%XkDaHVo`C++BK=3Dc?^#AgHkqqU%^Yr^CpkGy_ z|H7sK|Cbv2+o7$Ur=3DOjG{wi$#82NuSNdN7I{&(IK{oDlfog)4B2I>E9j>zYjH$^`* zWk>tT|JLXK?u`NYoMGrc(*GvpW7Y_#O=3DC~t>`$!j4eZV2Kl%;woA;0Nn(P4NG-H<|yTH<^FhKi?cbN59GZ=3De^1N-+F`m_I+_U z!>auI7_FD&7?3~0DC~=3D1f?mZx7>T(|Y+vbw?I0GY3p~!oCINAMOr(!5MtK+Sv^&__7^Wh25H&p#tBzpBY9lG&8u53H>J>cV66nL!h?T`q+bv zV@2iQ%3pR5!>{6OM0nZ3j#uf&@i6Sio^!e%52MyfTPvD0ajnU~Qi+J*-&6l~TYu<( zsD7+w1=3D_#jvCANN%fgg5$HKqX{_*vX(YTBXs{WtU&rV?K-|c^*{_*zrsI5Hm<|>B; z{%i6dU;iz({>lH3>fdJTpY;Ez{#R}N6>q(Md?$pT4k>p$7^vxZrYzgR@c$}?HwC_D z>Q2?2TH=3Dl_0rAOP^kbmU5HVBp^~1uUb#!m}L$JH*AD)7Jl;!_&G5@8-{1;>D{d)O7 zR?L5PG5_1j^TYmd@T4-1su3p4!4=3D?7wzL@_ZusT70+urNwh=3DrqX6-&6Bu1ngr#k9x-4gMz3{Qj`B z0C|~z+1Lb|Dfu>VJATSF%zcwO_MK~QHZ{q65(ghFq36%OUKTRb-izNW8aJQon1J|V z5|{bhaY5pLm@ULlDkpCI`Rmf}n}Gf(w>*UY6Nh%l zE#nK8plxi2{h$RM?gj*SSdm%K?%s+`mLo7_e)Oy8{D=3D~3G57M27t3R{-2B5r>Hf$v z56ez5#BxcPXB@t(+1=3D{6%R1b<9rv`Q?qr69`lx7-!%f3g%ML{pJ2{0WpqB?m+C9*~mu-G6@t8o<`Wx*-9_xQEzW$&>$ z{&}p$T?Q)u%|dA8=3DSy3TOHn?=3D_j0D6EffP=3Dj;0;Oy+822lu>U7W7;J7aJY<|TuZk& z{@z%8;t`$yci>7k8{dzvmH*{xf3q=3D3;!sra#XQ`_SPfJb$$!mo9)o(& zkDxCkP*ssX1`sF?u{-1C%$(2HiFtm><`ebbDvKVgkyO8V-NoQaC|nVsAb!e=3D3`!RF zj}zdivfI*(To5SfrAHwM)?SS)BWN=3DvO@7g=3DYOD})2UkLGtoQQX?oIQRPZ(z%AF1g_ zXo#Rv)bt-Dp{VI~c-%qLKl#l#O%GUeo>0>l3&nq@re|9ot)}v0>cF%(?E}qUi6~Y&g5)8a>~El%Sq}5G*g} z0%%D0+H#Q}24Jc9+dlHnFPB&f=3DutYW@h|Xq&tp|=3DnvHCB$9 zMX$ge*-5XEBO9QZ!_T9`9N=3D{oq(L)p<1{L=3DvY<`{-; zf-7k5UZesPy^xy~roWDdb&CKP!$r}gf5c2=3D^9NY2-T8nyVPN8E3@@_I8Z^I}hxElv zZ|AEPiy@y-=3DYi~!?L=3Da-cF&5tM;ArEFbVK*J^pY9Eh#meS60JPQtChrAGI|sH8m{f zK1Z5#P|0$s1n(nSdqzF*oc4GS>bc0XL&L;FTwXfJdyJH zsz9-Bu2UIZ`7s*<3I|oM!@=3D-&P03`$j;ZW;k52;WM?b-aFLx;3_BGQu~WYPRHT0cgvN8lrH`C)@98Ac z=3Dc^d`Zv^Q-e}FXidvFIkH1~Dr9|QUmHurV%AMi%`;aTRztxTc2=3DJ>lY#bxh;&G{?4 z@}5Q`|1N_C(_zXP4X!TpO%P|rpM|Y-u-wK z&SCeRTHo2Z`mjtMavJ$}hvs4lU7E`rrDgPnon6qD{>=3D3nl!wD$$HsaNX4UB0?XZA# zAvjT(fry_loN=3Db+k0!%8$iUZ7#-RfSJ*5m?3unmX{tz?6aY(1&(hzS-U4;BV_Bj7A zJ=3Dyy*LPLg!=3DKHr^WC|#B+j zEUGSqT}oqlI;;D!DZdWi{dh0FINW;|8npm9s`09OJ$m9JZxew(w^Dc#X~0ugUyi&} zudL$7jC#$*OoX8aw4^3$N*#z&>#8AHY(KNVfnV~uVk6JbBipY`w#U)nbx08jvehoi zvD40!Q;stcJXI9xz|05xnLhmm6vL@^&y?Q32c-|8`Z5dS3n(WUOz{E@?~Y}YG4u$6nBli%_l?J}P+lc#))VT2m&zy;jIuU9OGkqIQI2$25d_t zmf6=3DbbJkrW@xrP5iX!*^0^)@|A?JzX1+-sE!!}GjbG%d}TaLAms*hLuTbg*q@Ib@` zbd+A>kB}L2kAuDswfJA@=3Dze}I@TCrv2fr}&{Bh&~ETSe#8u4kB#Hahis`dxV=3D&85V z3d`9Q=3DxfI#yXj`o3Ju+88T6nG)=3DmZG{SXt65`D7A;WgWf)A4P z;%f5QZ>VCvAqzWmU$|f{xy6vc-?9gme(!O{DQLx$kM?%3?+81Xa1N+LsitQ|V5hgG^*o8hN z6QQG4FpPHZyNMtzgklo`j%%9qC}S^>sJN8vw#!ghXaTC?-aWXlGfc9vULm;MD0HJ$Qos$shGc$w z1$bb8_n&*ppBGfw1t5zTpV3|@2cOR8H}tu(B<;k_yAe|OJ9V%%j@OyU)8B*|0~XDA-rYeEq=3D)DP`N|jn2Fis^5iz75G$E7y5N&+)GMA zCBMDeEa}3KLBjN9iH@o$$_D>y?bUpOP0)@+F>^O{ny)+H2~(#*d|{}{zV3%c zhwxgIG7ZUmCd;^Yq(Nr}~oJ4UelHrfJY(t{fJE5XFzS!8_iaM5ZOra%l^{GLwSDJNMj1967?Cr_2aAQr@ z$gm)kl8imF>g0H*pao>vYeEeezDh@9d(5$ZuL%v6mmGWiR4GVuIxw4sV6!h=3Dx1@!_dsycDp4jBv=3D+n|jq~ofvOmqD~!}#n4awLEo=3DK?{U}!nJ%X% z48txA!z4!!StQ4JGEW^ECyOQre_iV{v{YCJ%0t4m;(p}KFQ&=3DkfiWYER}v>lKM?24 z0-l6=3DjEfObtwlz$6x z$oZS%bkLuVj{9DfbbUCz{25>daaPoJf4oc+4fg*U#&`@w@v~3gF+VM}ha7a>gE7_~ zHpVJROXO8&`ZtXOug^oe413%hujs=3D}Il3}_!8GI2AjCj;ga#l1f-5c%?4bYgzrQB& z5k%mesi@!=3DTx} zmYeE_di00H?))H97GS6^?-Vq(1sRV7F%%MWhWt=3DDgpF1sPNmVG zL=3D0I^Le`TJRRf3YFmTy;8}df|e#A<^NO3Z+n9`6VxS8twi~K2pfa0xDp?rhmKJU2f zWWv7Ku8ahm_)|zXEwcZd1Baa1gU(Iwv;VjZhor&b3g^JP@a;0Q^jXQf8>99g7d~zb z+kZ~6XbjZOUUcaFk9G=3D%>zqhucc9;i^TYA1*jQo%X1b@h7QpOHZG`|O2@Eq zf${n7Y2fRO*TeOF{IJ8O2ht43;{&n1JR-YKl+blmiS{q#*u+ zenHdmhZ}2M(6TsV?)k&cmQ!|1?bHD&Ciq-#go!md1Xwf@S~*INI&LK#&WIdCg}qn% zN#ZgN9D&jKzdl-uPkfg-d|Px%rGI<3#Hq2~7B+Ow80gjH4Bh^Y1?e|8oiu3LDb#i#MY9 zbX(l4T-BT6qpUMibG<44MHWA6hvKvyMjL?zEMNZqybRCq8Kv)in&<9gjo-H8U48>h z-;@x1hv$38;iYHe&oI7GROkrR`~&ln*%hOD^wIxYqudb~<&Fq=3Dw-y0if-jbirJRoqHd`L_f~P$0SAb6x4Z}Yh^^2PH1$PFk=3DMhEw=3DHF6=3Dsr;PX2gw zeRz(yv9F@T6Z9e%okvDxsc}}}4A@d57JO)mDfs?+-g}X~&=3D|%k37Q@q6W|!{8hD36 zqVad|yvTSXjEu2Nj2Wdh8}h%yeA$pkylg%ywzxEyK|14 za!Yf0%9?`68m(nk+fu$SQQp!b|FCFdZL6ePh?XF$Dv_1@6eU%aKf*6xQnjxSoG%!~ z9E_je!kgKf#8n)6z%q0P<6h5Q38sDb3NvHIeeg13O?Vh@1&46A5C7DJh7Yoj{Lx`N z*4oDk^SGORoMawf0e`sLr_wwY>?2=3DuMA?V!<7D&r2m3h1Jg&2kd`S_Re`z22iA_BA z+sA3<@hkRmck}oK`#4=3D53m4(C&mQLfQ@pP>_h<5cPji1N@AoqIC-8o6bAJ@?XPEo< z@SZ=3DpT!Rzwyx-s4Q&Ri9-Q1JEeGZU&$g$?~h4FpH_mJ`Z@7VlQ@GF`Z%^AEbK82l& znasHnJK3O9MfD=3DoReU;?|}(M^7%BQA~vMN1{=3D$1QEcO z+g`=3DZE^h(2wIMZ@PyV&vqfIZ9cCO$B0~z`++~&C7qy6M-5CRMiIquC*d66zk`j`xZ z_7^plmP$h>!QZ1jz|=3D6SyoT5RJ=3D(YQd&5piz8ICn2PMQwX>28PXCGxGIdr5wjQ zkzg1w%MxH*xLQgUI`VHv^ns|3e*FOcUiD?5w>Rl=3Dr(WoHy&s|6@t29<)>!J*H*qa@ zYzRNN)cq7&euLB!IB(j8&!x`gg}DtSopJk;Q(h{JCu8S;eFui zFI%O)Gc8O}43E%jW*Q$f(D4DN@YmsQz$FYHk49Msg8ou55EiSJ9aqzT{@1Pt{>9E8 z%GLunF)>pUHVuB|BbZz*3Q#67=3Dvb6|Cu6B_SeDzvTy8f~s4Vqu ziU{T5zwO+~s1pO~KCm-~bCCM1?7HF@J6};4A8eTNa4*Pd4zbRZSO98zw-jH8=3D}RbI zhd)RU>H7ursrMbM%HGoF@ATU{E$o_C`NNdi(hF4vMbvH#6s;FkYD?&)pj_ zZeePLM#GV1YWDaCsylrT(35qdBhRFiP&Lkh1PkHSODq|o5D&-WTh2}oeaxX7+iL&NO_9?EAuu7QSF+AuqE2v1*38F4zi|c`E*ups zH;&okS@7M$>>vv+aql!`KOtquvCH+tUdq=3D@$wrOX;EtEF5gl}^)p>rcvFu?qXacOp_Mg!}};M=3D>LvP)5P7sXp=3DQ`VIuJSna` zW*X1Hyaq&X6bjffq`&5{G+;?`oLX@kn<4uL^Wuw3HVl1KJN|fRJ9=3Dq#3-;}|pCL6( z27l0Y`2LbXokwn9Oj)2jn1jY91C6Z@wk&B{CIb?NG}{UcXpN_F+U!Ms_92SK4sRT% zH{^K&RKl~Fg(ZGf^7b#r@&6egKqopnBVmq3;r%I&>NJ! z_45PTs}XO&-O?M1OPwwe{+7e z{)5HPt89K|{1?xHRdHVrM$f(ie$ap5E2)+Q|0MZ{rts_$vMiP(WGy@|$vEKHFn>Ra zt^_GE!N=3D%@eh)`O&!2$9I2I{W#7%t${@^9JF?&L9D!?fSl527L7zZus#|;trz0%6U z(>#-G2?;+PD8Je-KN+Qxh20Rq9&1QEPZD(#kdS#Q+XZ3}Hn_^;%`E<8DQczOGm-p- zG#L&^IQf!>!Q$ly_{_#3rhAbupNi1vNEmYc-GL#)cYSh&JvaO>-Vc5U_WO;ahaXKG zj25DG)0vp5`N}iW$XBq95s3f%@omVuMB7z;bC97|{45UhG0ReC+hg2if{nzYec9ey z(~pOH7si({VL4@!Mug-U1y z!VyfUaEzP1iOp)D6^gH?CEGOG1Ab`@X!L6weEgx_*H^9kGI*;b^Ht7G2<`b+6{IwR z?Rn`DgU`m?7r@huC@gcF%cuW(>-*tPO6P=3DhDoi&jGvA8B^kUcQe4kmTqOtxCo9JwG z*?#ycCVG)4PKJ;U_brvWX1n-n4ICKFyJKTxm(}0xY{OiIT@FI3<_~)$E~+S8gJv!_ zL*l=3DueUtx{_PtcrKHC!?HSLSAeZ`*m*4igS5A03mwTxBrry5tegR)^UkjD=3DBQ>izX zKk>%-t7WNd)N!%SBR!$Jd_VQA;^6-k60W|y0xmfU?;9<()U@vv*)BydM24BY6(!h@ zcXu#(1d1Fb#6Kq~OQ$qc@UflfQfKb=3D3nVs&6PB(kBh0PNY^)73;G-gaH_+g?GeiI# zZ~+(5%^y}c#PN`ZqVV7B_3-472K}{NG~%wC?cdCXkc}fQvY|q9hu;T><=3DDMHIskm1 z>6Im@d-5}AY6P-~_>qaYhdWY`gw0aP0qohp+<-YCFSHqwTEg{BI7bqTFY)jN4ougU zxSN)Qhs=3DA@@MBZ?fhjK8*Wqi;oGf^en{j41z>cNIhBI`A;Lu3Cb0Og@exz%Jt%WlK zElL2B3ZaGg0_z^*NJ#_0-_kc!R)Up4)?DmGHBcK*aLxT=3DmwYt{5|ePi|1M4e?9e%j z;L!w#H8S@kHi2iz@MMQp{Jzih)1NG!N8FOXk_(eSQC{@GahPut<9op$U~x2LDLsyn zr%a?ow+m51TJJ?ZE}D}TOVi{}%8xhAl5~D|xbC0^K@Vbl!}WDEnevABhs^(1{(jQ2 zPhd{|UJgpeYM>IlS-B@ti(3>6xeX{50sRCHG-G~xzl>&_x?sSZ;P;b$EaxfgPmE&1 z2zi+!z?>(lzn^sRi5!LO=3D^pRqcpA06;qND%Dh2*`{(jQ8KP{u@HU}5G%z*wgfo&8W z6>b{DW8o(0-|!bWWTv|7_misp-(WI7u(UJ3pM)-bg!sQIaj2AjjDPC*nBX1Ul^oiF zO^eCHCpy9N7VuAW``x#txc`Ly&G{Fd6_jMc%%cAM1D_z#;LkqM0k}eAdJ~7KxAy)N z>W6QkpOW4S+EM{pA~W8|SI{Bg0I@d6-)oGVI^R5Ue1lhpPmO$xT?Q*Ravl&(VDsuG z-q*m9P+4<9F7vxQX7O&i5XBD$bq5a<8GlRmD#0EK;=3D(}%f8NyZ@2wH%BTl>g_xH|k zVOwN%+@4{AKG3YP`LGwcs+7%N7xF!PNq-_ks#UB2(x}Sc@*JEVn1y*jAe74M>~Fr& z@9%9vXD^@9&81w35`w?KhxYj6Ri5(_X|CT6ZTv~)kJ>Fb zVwv_zTO|PS-|)m7`$+DF9T~<+%nVC0b_5dOXlV1Bd9>g=3D1;@iz;Pp+*i^S>GcTFOy-!eaqp6<#dG&j`xwQS0u}$rr+E8LSOH zR*8A&Hy@$ID{(M%;hqd|@R9;p#f+!sQ9&Z<;}QH%M%xfLi9KZ+&jttPmo?h&NIHl6u-_Czk$Wi5)B1w zr+g{ezQLNk#MFB#V|QJN^Ws_=3DP3UMvak zw|)lsf5-eFU|2mE48dAgF)>rKpJ8k%J~vctiTS?p1S5l|CN6?_a1(gPsZH>eC=3DI5~y@Oy9Z)RK)m`q^_rWcue zd*a{V<%;-KxLBQ}s1xi|P+ih#ADzn^SRfz|b7qdjy&T)?Bbb>}OhJv{SON~nzX zv?5{nub><#8e`Ef7IR`*kww2eC>z&To zyVE((-07T0>~zklJDoEpuUyeIxcvx6xELl7;>u(&4N20i7t?UtvFbv|!8XH<9s|jM+&){bykQV8+)4#us`Vb~lcl3U5+e#ihS4jX!jMD9#B7)+$Vh1b$CO z#reI+3v36e9CfhJMCWbFbNyhH;;LfdYR2;6ZO+_{7eq`Z4>Ofa!a!7BJ>V;FX$nPyOjJRB`P8DNvk z;}e;y%*0nhGLf5zqMEYkQOq362$|5iw!L3VxW=3D3_47}SaBQ@{1MSFDud}~iaG6Inl4K~(XX(m z9TEMaGMHXd%xMSHUzH`G=3DDaVeok#tsB z0?NHl5=3D=3DQeB7T+w&NcW$Q8ru-u>)Q(5*^sH*Nlb`_lF?%(+bC_IbvE4kR~m@KfDC@ zr};m9a}I~TEojv64fvx`DXdjAKy-|~gTX!ZCe?(cWu3~30{l#|wH{@yU z&Sd)9&SW}&XEL?yOr|(8L7&v?BFtD9h6~e!kBoE{!n76@HwrS5Yk33*Zo_P)*}>{^ zIhRxO-*?dnB7a3{X|Vd9EwJ3*D7GV&E%SL(=3D9etvk5tB~i$A{{``~mM{$6=3Dt!FrM7 zKGAeq(}$WCH7)!gooSoFXU6xuU%(;*>5_sHdVUD;Om zX*$f0G<~$`jHWZ2K6b`f&gp(Rc44iva&zZFP41Sa?#Cw~rSif9>hG@47S3;Vw>j<~ zTix5oYVJD{wA=3D>@%aDGd`^WAl_h**qEX;}O$C}df_Q@ur*I)?6?{+k$FWD!Yjb4+* zdI#?-vQ2ns3FH5xCS?-Q)-a@bYo#;y-mc%Zt-QPQ?XBS#>bFK`fnIvvdo8(9XKX{u z+!wkEE#bkE47y)~y@-fH;a2z4t6JT*{;oRr!RFapAnL*V+q-j<@cG8)cnasN$`u&+ z-9@X%a_-RZHz96{1Ow#!P0&g1+UW^srU`~r-R2z%p<)u)>OR-%ZVw3ca-6O6h01e~ zhn&$rwth);Ru8D*h~U`moqM6oI#3EVjhzPH-B~Dn1}PM}<1Jc+L^$RF_^A7l#qs8E zYGH--*v(jKM)Rd{5wWND=3Dth~;#^{Dl4g-Olsi%Xj4z8L)~v>CK5vlq=3DCv_t=3D3 z=3DV0qv-1}PG?XBKHj`y*uR_{F6=3D~GQ(fBsb%L+;A!So78s_DXl*>!5Q^INffXm@Le2 zIWkZPt@vpTZ+;fxU_HXfyK~-3}nv-Th*iZ-s+0w3!CG4yK<_;FFGyZ41{OVfVKexDB=3D~zr3sEzh? zgQ9t;?mDcc`=3D7CBH;uDxC4S!gC%9>L^XL-*Dx=3D-s#dH1U`SpJrewIjd%{lwDt^8Z( zXWPR6sK1+j#LX3AOP0LHx3|_z6Xb>+-z`q~g;tys8Qau(0v5ho=3DMHxs7rkN6p1c3^ z;q)uH3#!wvjNrR?E#3EzwcsbB3%8?SMdA03`zriMtNZL&%~#(?(LUPZ-ZuPgGC?PU z568aHGW#~PX}A|@WGhX!+^4%A-(T2-_e;;)gAQRsYxqgyRQ3pqQ<-1C86IX2@i2pJ z;lY;h^B};aNyKk!3uAQ$-#41OrRzp#Wwvv6Yxw#4yO+qnV*Bd1rswS`e5UdU>CgLsa*1fu*ar0I#|x91+((u) z&3(l5=3Dm6_}k1lWI*kj}E6SI=3Dr#YDGnT@RPHl%^TIVSWgmw&!9zIBpkMJ_!B(02m9a&ufUi89c=3D)x#?E!n8 zm+m~UX~kF;WV?=3DqR~u@@lxi?niMlq$LZSBIYk#C~G-B8^;ldHO`WmT+mT6E0@uoPX>ISIp!um^{@1ctQ4?ZSxLg%GuE020FZ zF%M%|*V?g#ldx>n)zmTuySj8}_+AWw(KUDD2OOho7VcfOD%SP$!u8Hw1;;x9ew6*q zaUX<7Y6#dKZ4|FQl&7wz{&>D5)A$6=3D{KyxM$7+r}G!!!KNBlR!nxx}iIs)B|I_{zz zILpIl;u)?y6Zz&;@tK>D1ZY0j1}-v5_k-+@=3DK{?z{EhbyjZe{IL6c_hX3YwpU(w zDxK{x*MuE30N?BGe54q&y7zWJIi+RpXjc`S>+n0EhbDKh2_;+HSK4OZ+S2{XYf*l- z5YG8-=3DC~KP^;xW=3DJoy@_A}Kv@CjBjgJUm=3D7(}sVWacg`t!Z)~Q!EEq{(b5EeSw^2R zCww0qvxz6+k7tTM=3DHVIoF>zmy5P2GR3G%V0Vmi+fa$FV^4n)R*W^3RE+eoOfN zma+A1b06p`Aku||qdi}yMAzbn@c8dC=3DRo|FkYOg@mJ;x~xa z;q&G#`CsAKfczk(*6^LJv+tVk-UAWCBfjVy_+rc8vsEnzZiUENqrZFsPl?v> zNZZPXqARawlUHtz_TUE+F(-K0S@CifNliELZ)^0pyN=3D7u!@3Qv=3D+&kbf6Yz7j^?-8 z!nd;?_x2@yt=3D`eC-dR;`2y?gnxn=3DP0Q(6X}o7}eBb8QE1YzuE|bDwP4b}#Bf@-s+& zsqMhq5F1vvxz85U|Bm#3v>o{Sw(t{e;eWPz7uL49+gi5W2SO+rUq+6K&i$FA8clE6c2~>bu;ggn?M{<}bPwDHnpMt$&!Yss z0ks8B3Cu!@uGk++rNbBd``r63IvP$ET^No5@dbh(IT8LU@#6)bS&obETKK_McYTZd#};?nidQ(b z?wo-Mw|g(=3DUQVC}ATc7psC)S6E0%KlD6?=3DjUqY4g0 zZN4fl!=3DeF2F;>$NFAiGx@vi7v>=3DcFEE$Nr1UT|pihQZ8?bY{lT;M2RGck3tJJCk)A zlhGUStCo$sw_y=3DrP33|m?)>d?Mx^KNWc137n8Sa4Fxm5R7hVP1f~C|aa9S{WL+gp* z-qy%#h{Bt0B>9%vgRPm$I)vQ+lzD~YZZj|FZ62%H7efR_`|2}-4W#^i`FZ^8+pJda zvZ|)^F`>>wFmT_F0raLy5Jsfl*BZsrDZZ?qH0>RElQ`F#nRbNH{IT(4OHCI)4@X#r%5y^q0G+zi?8? z-=3D{B`H8vF+ZLPCkZ3$yxqivuUFWg?b7ISunJZ3J~=3D04ZMxp#l7``1#f-uyeFD+l4W zxL$ZYuB~%lxG>u0{sZNQhChS^tUvI+uurKzc%Ig|Pe;FSBw!4lt+Ss$F;jUY)=3D8qv zjzIZn56?N*Z!N9|q~|53Mte9&V)4S6`+V24!!P5Zh__}IW4!+BXv^&NEx!v{H{Er* zllklj1|QBbTf^G|{`n-YdDdu~JJ?qLSeyHF+w3iEyWM({S2?S#KG)_Bx6K}G+ikGr zzz5q7+|n}lK?I21>#JMlzIf55!u$R4R0g!-cuD>`kCKIz7rS0ywaosd5`XR^t#cos z6gr!uvyvgnKh?J7g+ih&bLjh9#(v)t-r6$v-e@-$9n_hnu3(40 z#|j+}!Qw@jB+fMRKJfIwtN>5!pIk?*^`bXTCCN;r;J}UCx#HzKI{XD^HLX2;=3D9;^j z+|5S5&F-Bo(O+T?@!Vm}=3DiXO+5aKlV_W85#nSbs*7tg>bJoxn9P3JxM$)?#4oq)+n zYDu%Zu;yt@NbV^;K7(NFwWbv>U-pfwF>1fO?C0HMyIph`mIgL94dyH6pPMy=3D@_Wud zZ__86XWtoJgSp4Ne(G!)J5+UG1Y#g=3D%b4M$zM-x;qv7Ht&mxpcRr%(Ig?x9qIhhWE^6%0O{-r=3DaY%O>iA>C-}ZxcXkGbPd;A_Z9Od?iCEN+EUO%E`Uhg9#OW3s5vN?4 zn)l-z31%BtqXLW?V>Jy2gfM^YIvkaM9lDT}B~v+4_idrY!G7=3D&Hk-c+`I|8J#y3jK z7lokzqJCSwDQlr1RMa>Xqadb7Eh|Pv#h-4u@dKxSvEkm|fBFb4xQvTOTd)>`Wfr`% zGx+qhb8n@>o7~%*X0LBLcRlqqnBV)n`>AdjQjT+*YjT*Ct}i}4-jX@)wg1!JoxsU) z)dwE`%lHuHkT3?!W!g9d$+o1P`v{OXx{!iw2}!nWjG5Q!>5*ERnQnS|B+HoO880j{ z3n(}^fDL|Roj?+jh=3Dc{3^BIE!gbgx;4eSwKIMyb!0f7SqvSjjqRlm{Enzk_upL`a& zK7RA<`d9ty_*d1dsY=3DB*-Y>cS{-W!o>rel1OnBgQy#`Ob{QB!+aC~K-Sa(XfzO6kF zy;XWa)R)ND_uY7>KDj;T`ANzqmqzp#J#8BLxIXfKT+h-6@7T0l zPt5G)QvZeL8^5YI_WK^Zo>XgZn*nfk4lSu@Q?IwcJpFm@>^Xa$H2Zk{^o-fXd!9La`kwP=3DWy`h~Z@qlS z6(d_lUOcjOWZTGg{bMgzjO@^VSoVPnH|lq+qx$9AHTo6X)gvz%xoYIfmyKTYlB=3D%1 zGCf*u_}s$V+lh86(5XPD0-XwUD$uDwrvjY{bSluPK&Jwo3Un&aslX$zKv?9mBzs0~ zeOd02OOWw@{$4&_cvNn&}0 zeEcX1>#LuZ$Lnv)brpO~u4Q`*2N~ay`}_~&)~9mAhjSPEeEaR&^YJaan7%Lf=3D(}@^ zC}a8fq1$t<&yD5WqiEQk!u)dIpHDZ`@yL7g@%sC63op-I%63}fS1@ka9(O}NpHQdb z{BjvDT%S)r`r_O`zGJ#${aX&?(<96KE0*J^%b~;hbkFo7qxtxudvh(CQa*l^^Tx9O z^;^ilC%1TaZumHHwrlC{QD=3Dt5Np8buu_;5~b(pWmVd^ed zGCzi^^6@(39?eVgxG?=3DN7Lv=3D8ut5WBaatfoh#G15$$g=3Do$;glnT|(@8%O*Vxkor3>x>_|E{_)& zcl+}3rN5ag2ax&ftMc(8<44i4J^E+SBn^jg{yIF$dgV3w^aA@;d}BU-A>}~npBYGt|9*i~EAsO-|s(#=3Dm> zUY#1NT)VQ|C^ak7E335?T|>P?&%Om%VX=3DMU6sOkX=3Db9C&Ww}KjmovY+ zk1On)X%;F|WBKR;=3DZhZa^4{vyuC$b&MZG3!yR=3DxnD|@=3DLVvUa08`XV!o{X02)wGU6 zzKu2AtlD^CXKhBeZMe|fT}fpsRHqB!oNSv@B%d|K*=3DgL zt59xqrw@zu%pR*`C-P&Cl}M}isKT-f!(*1Gs*rNhHI*)qa($+nT{)**RnrHi%BxDv z+GI7mhR&Lttk$wkIq|Ygi`cchyff|P(ne`Y51kgCoe0k^u*>t|ly3pPG^D{TQ^nXrAT8oyJd`j)o#keZl_Mg>?PrW2dV`F*8vS>Ky ze{$BAk;^u&N!QFNo0B@o)b}+<^;6oSeAreg&orvd1Dp3%8sihS{b#h?eb!d@X@6Lo z+E;Bf$M=3DtN+=3Dqwr9y-mOerwzDp&014$ zD$~{LD(SLLk-SGrU7hBqD>0QrYj|B{c=3D*zhEA825Z{Mw#wqE0D7j=3D~-z3zAEc)spN zZC9f-xw4SWbh+Md#`Uf@R#;uxUDBOs6w13R<-MuDsAZjCiESyDrqU{PdmELBswQZ; zvujPO(LAv7rz^|or1n<7=3D%r~rvyXM2XEsXLYG-#(L8Q7=3D&MGu^o;+GUVN}j+jGZv5 zGf!7f${jmlG|gN;Y3g9%q|u=3DhMs?<{;z?7xx=3DtSLK0cae?m0fHo6*&K@@U`jQ8}~R zIBCh{#!0#5#tFId2rldyeSDf4OWnY+TFRR)nwxu%wtKZjZ9md>?!|L+E46LVwo}_7 zja{$aqV2G@&uII)wiN$Y^}I{w=3DDM|Q(pJ`XowhV>q4wK4?cLfwrftjC&D+*%GM*RH#CWYhZ1TQAi~+ecP!TDS4C zZQHkAp69M#w|&iq6PER&byscMFtT>@j?rz~N7lS(gD!ZBKDTVVZ2jhf4m(D+UbgLp zS8ly@%UXSE-E~=3DQ>eABm-qOyA%Er{YG-m3})s0GNZ`RwaPR|2d)4g-!ly;8QvCZ{# zJ6~Jbr;k;a)tV#wO4W&!yS6ryEg_p}`}Fj-%C5=3DER8wc!qTQE%+SV+U_r9<)RcVwa zwlr$ZN;&m`BdHThGp}6PC2$ zK)uq?dqS z;Ba9ob&uhRg`EddSD1RtY--{1i?i$Qba_(tRHTpnJZK zS{v4$FfDMpkY$`Ei`svXC#0;Y`uHPC%I;S4k1_d^TjA>BC55hQ+D#c~JEeQDt9PJx zXrO*D?=3D4JMntI#5 zV0>~5?N^!m#9lgzn7Z+ex| zwBCGE#!q*%`-Q*J?X4VGk)L4GGxhAHLd##dRxjsj>KW2e)<>M|`08UsWh!+yV}%)g z8{U;2Tf29kEsR%6=3D@qa#J<4;@Xj8Ai>~nrJoBBLcukEiiR@BB`g%~)_o#_d zy`CYOJRXSiU~E753ee0cbI+h4G3dEp}c0%K;XsV|DW zil#Rs?R~E6^ylfS=3D)BXV=3Dh&a{b@ylVjH%Bqvu~N3`=3DPdr-a0oosI98)z1o7d&uNpl z>Aw(@+O2bQ6WZRT?JL@za@*Y8=3DJo5>ZQZ(g>)LgzFMr|ots`sJJw%W8|JL(8#Db4? zl|Sv{)I%)$*hY`*>xn)V6l#qzeVj;N`#${R-LbB_HThv58M0m>eYcc-8B!S=3D)yLBU z-+;{b9{(;KqR7>^&&}=3D9_7-h-X#1kJ=3DX!m=3D)%JF6U)1)vcm5pjfe%snpU=3D?}dEf8P z%{^1wow)Z8=3DjLwK_Pg5B=3DS$9Bw(RWXm(0J2Y|g&8YW-@kVD$~T!dHXoJGNu@N@W=3DKMYNg!%M|G=3DE_^;UQpBUr?)c{XakYJze&ousD0O z)Mw!Qv7uNjb``seJ;mN)U$MV9P#i1{brrk1y1Ki1x_Z0%y862Yx(2(3x{KXi-QC?i z-M!s?-TmDI-GkjjJ;k1`p6;HWp5C6mp8lSJp241>-ePZ8Z+CA`Z*Om3Z@<3u4fYQ8 z75lpSy8C+idi(nN`uhg@2K$Eki~U{w-TgiNz5RXt{rv;|gZ)DT#euGY?tz|x-hn=3DS zRU8-?92gob4t5Q85B3c94)zW94-O0t4h{|JCJyQ9^?yU@f`)Xap`lWaFfS8no!pW59@VChJFo79DyF7*Wn59}QY`=3DrLeKSxi0}wCK=3Ddz=3D-l_^3kA0haLk) zlQFQF{Zt~HfMTZ^(MwA}%(V#_#9s@>{Uh>hPMTZ^(MwCAC(V#_#9s@>{e)7?v zMTZ^(Mw9{a(V#_#9s@>{LGsa{Mg67gI@~WF14fh~^3kA0haLk)lwtDGphbrs14fiz zBOeV~bm%c)M0p&||=3De^6TWIL5mJO28<|% zd^Bj$p~rv`Wkht)`#&1A=3D+I-ph_ae|G-%PG$AA%K4f$x$qC<}XBg$Ix(V#_#9s@>{ zb>yQ#iw->oj412LM}rm}dJGs*UPwL~wCK=3Ddz=3D*Ped^Bj$p~rv`Wh41$(4s?+0VB$9 zkdFo}I`kMYqP&QFG-%PG$AA%K6ZvS+qC<}XBg&=3DZqd|)fJqC;@mywSKEjsiVFrsWG z9}QY`=3DrLeK*+M=3DVwCK=3Ddz=3D-l<^3kA0haLk)l&$2WL5mJO28<}%$VY<~9eNBHQMQwh z1}!@D7%-w-PCgp6=3D+I-ph;jw_XwafVj{zgf4)W2UMTZ^(MwBbbM}rm}dJGs*t|A`| zT6E|!U_^Nd`DoChLyrL?%GKnfL5mJO28<{#B_9o1bm%c)M7f51G-%PG$AA&#W#pql ziw->oj3}ezqd|)fJqC;@mV7j5(V@qH5v3$L=3D=3D~oJT6E|!U_{wTJ{q*>&||=3DeQYIe_ zT6E|!U_=3D=3Ds9}QY`=3DrLeKsgREbEjsiVFrti;j|MF|^cXOr>>?ixT6E|!U_{wXJ{q*> z&||=3DeQY9Y^T6E|!U_|`|)H>+-g9a@+^cXOr>?I!!T6E|!U__Z99}QY`=3DrLeKnIs<# zT6E|!U__ZB9}QY`=3DrLeKsgaKcEjsiVFrw7SM}rm}dJGs*UQRw5wCK=3Ddz=3D+Zy9}QY` z=3DrLeKnI<0%T6E|!U_@z>j|MF|^cXOr%#e=3D;EjsiVFrw@u9}QY`=3DrLeK*-t(iwCK=3Dd zz=3D(1!`DoChLyrL?$^r7xphbrs14fkV$VY<~9eNBHQC>kl8no!pW59@VJ^5(RqC<}X zBg!kuM}rm}dJGs*ev^DOXwjj^fDz@l$VY<~9eNBHQ5^Yb(4s?+0VB!{qJ#F|nEyqB z`z8Mi1o!g`+4TD(rU#5DuOc4}T6E|!U_`l*d^Bj$p~rv`Z;vA|DM} zbm%c)M0p+gXwafVj{zgfegBBfn3>Z<~NIn|0 z=3D+I-ph;oR0G-%PG$AA-C?79DyF7*XCtJ{q*>&||=3Deax?j8(4s?+0VB%qkdFo} zI`kMYqP&@WG-%PG$AAV^=3DcMTZ^(MwH(r9}QY`=3DrLeKc?9qC<}XBg$>$qd|)fJqC;@ZzmrOT6E|!U_^Nb`DoCh zLyrL?%I)N%L5mJO28<}4d^Bj$p~rv`<(;B~-v7~{MTZ^(MwH(p9}QY`=3DrLeK`OoB| zL5mJO28<|okdFo}I`kMYqWnJjXwafVj{zgfACQj*EjsiVFrvJRd^Bj$p~rv`<=3Dy0? zL5mJO28<|wNIn|0=3D+I-pi1J6|qd|)fJqC;@e@s3awCK=3Ddz=3D-l5^3kA0haLk)ls_RK z4O(>QFQF5j>gBBfn3>Z;9Pd*y7=3D+I-pi1G#U(V#_#9s@>{zabwDT6E|!U_|*M z`DoChLyrL?%6}st4O(>QF{|4BX?wCK=3Ddz=3D-m{$VY<~9eNBHQT~p6G-%PG$AA&# zE99d=3Diw->oj3|+OG-%PG$AA&#??nf_|D!>R4m}2pC|@NX4O(>QF(V@qH5#_t&qd|)f zJqC;@50Z}tEjsiVFrxeu`DoChLyrL?%J;}egBBfn3>Z{eZ=3DVg?uz<(V@qH5#|4qj|MF| z^cXOr{Fr<+Xwjj^fDz?i$wz}09eNBHQRc`;gBBfn3>Y(0ZW@;6$YPX(F8fq?ZSGNA zeKa3`QZ`lOS?c-PTH_aJ>q5X zIfdr8d)`CO$meJFQ>L4#eEOAK2Tx|kC#vUYYmFB)miDbR{wo@LMw@u5-9q#CEf9Z> z#^#TWew4-R-2DC=3DUFK3)>?OHJ@ab%SAx+fbxtfrUO>6vV8c)lAUCVVprLl$LFV}e5 z-`4q4Je_l`@qHRg=3DWA>H`Zn=3D5wu!&0P5fY+_?z3rZ`F9Jf9v+#)+YY;Ht~0~iGN7r z3)StT8egbxDZWtMQaqhMt=3Dsu=3DjV)Bqzibo#Y@7If8egampKlZYLYw&Cw27zlKb@+r z+ix_s(0;9N6JOINp8DZ*KDRD^Q=3D9muZQ@%rp8DU`>&s<>sbRMN=3Dj@IRWQDf)uuK6 zO^u~zlZE0JXuNfx`;|EAPMXxNj)m{#^QGgLhQ)g0O*Q=3D_^?g&yY|e7_QzTs%sV;|D{`|JSOi!NFKNJ_;kj;5+_Vf5XaV_z5Jkv1$9I%aeT4oyb zHku7DZJB?5Klc((eMlPSp98KZp00&76tbTpHxW;LU>Z#JQ`gUZeSUq8_$|!e`W*1q z);P}rE54Iwj*>s4raH9Nb4{B%ucgkd$Ll^VP`VylM4w; zW1NO_TF%F_TgIQ!GXDiF^QHq^F5HW$6vF z=3DiT@~;k9>vD4jN6_}ZPKzp3D^bUbeiryo2|e|+`(_vn<) o(5XPD0-XwUD$uDwrvjY{bSluPK&Jwo3Un&asX(U!4_kqM1G4?d%K!iX literal 0 HcmV?d00001 diff --git a/tests/data/igvm/qemuinit.igvm b/tests/data/igvm/qemuinit.igvm new file mode 100644 index 0000000000000000000000000000000000000000..08e605ae0d8164b115bd2ac8b65= 530ecc7d78eaf GIT binary patch literal 137112 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 arvjY{bSluPK&Jwo3Un&aslWqP;Qs (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976549594809.6149361611658; Mon, 17 Aug 2026 07:22:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyDK-0000yK-Q8; Mon, 17 Aug 2026 10:21:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyDJ-0000rJ-6p for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:21 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyDF-0002ml-0l for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:20 -0400 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-636-asYPk4trOFOFhUprtPBzDg-1; Mon, 17 Aug 2026 10:21:13 -0400 Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cca3673560so60328035ad.1 for ; Mon, 17 Aug 2026 07:21:13 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.21.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:21:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976476; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XER8W57BiJJLRtK/OlZrMpYMv+YG/Hs7ea3NGyBppDY=; b=F5L31tkN3QRGoN8qbfgo1eXSGuJl1Luq7MRLUo3GxJqm93gJkoumZLaTz2CbQNIfMcKK3T Ssam8IwFtXeRePOtyl9wpfhAHkYnZgOXOkn56zU6eDw9cjFkUJT4Kerz4mdfB1VGGQPU3g LB7xj9JseXXSRkgbRw5fO7XYCKsSUig= X-MC-Unique: asYPk4trOFOFhUprtPBzDg-1 X-Mimecast-MFC-AGG-ID: asYPk4trOFOFhUprtPBzDg_1786976473 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976472; x=1787581272; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=XER8W57BiJJLRtK/OlZrMpYMv+YG/Hs7ea3NGyBppDY=; b=f++cpOiHYd9JroIkql62VSFcfsrT1f/MCImp+6MYP8HKDMF2I9ozo+qmjSTsRcxHgi WTb6PtcHNzmQfNXpnz+caqeM0ZjhQ5Y/yvUVBzw3DMCaqeYd0mRlW0aZUWdDjJmK+1nU ewLenYGa7BVW2B2RmBtTur1uQBGYdhQ9r3IunMTuuF9DpHu00EN8SsNNBQDBf13dQJhb U24lX9s+UoIlNDhbYEf2Fmnktp2m2JCaLdEFB5xMVISsHSKCnrSCos230MKFwNOid9oS gsyvtqlFsFBgCR8l1QMftkjLl6E/c6Gb7edL6PgEskdi1MV9P3iV9agxFCJpk/HFKA2i hiBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976472; x=1787581272; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=XER8W57BiJJLRtK/OlZrMpYMv+YG/Hs7ea3NGyBppDY=; b=O1ls9iQzQzKaRj9URZj+s6GHh9U1OUS9n56da6aDmypje+bV/TBuI4xJHlsAaaf7pP ZokrHb9UEkcN9+Rg07PCik7DEV7oarOVVz6lReHgS3vZpAaTODfL6YdgyvN0M+GtLZUF s/uo8+mchGyFDwZe3ApKkmRJtw9UUKT+zM4Z29mm9WPgj8TAjsLVGFjcpmzDe5lPo6Dl 4/dEXXiW0TrEcQDAhGFJlej6mnilaVqEAdRJhhY+PIn0ZvPdygSdmPVbCJ3/V/uYPPg1 NZMcJdQq2pYf+vxUUwjU4ZgIVWosdR61jgqYuxW6qobgv0JQ7ieaM/QIuE4+/4P/oHnw Ku/Q== X-Forwarded-Encrypted: i=1; AHgh+Rq1Hmz32uV/7gp8RiieFlph+fBVliXa+iX0a8XyCQn6C3xN8O8IuDi4L14fKPdm3o0u0mbRlmZLUhCm@nongnu.org X-Gm-Message-State: AOJu0YyfagSgW/ibIfmnao0VnhlLLLCQvzlx+o5d2hFovOpX2/cI36Uv PVqOM0JF2BGynUOmcgCC8d2Y5JMTiuryT+WDwReeavR71ZHr/nzWexT1iA3H/QvqbqtwEHRLzFT 3uwIx+HvzjC/RpD3jrLe12LbvQZXSgRnVh4o++5F+yWVWaFbyR3r+femJ X-Gm-Gg: AR+sD12HzXSvO2AuB6yHX1gyTp2NPkshVml1TSz8zsIEDhvHU5gXRuZrbe7qtss1JfZ zupXzbfNLwbiTSC87nF69ktFvj4dn3oa9cGf5hoPRgchTAW4aWz3AyEqgxdupUAeKNBbvmMV4Wn UvP1iLjkjYaV54ubIVdDFq1W3LqBskAjPp70B47w4rOou9VXv/f1uiioopjITRUl9IXElYZq1Wv uJtXW/2HBGVv2E1xnkY9vowKQ9T9QuvsVLOko356mq9vQrpRTEKd7bjw3UQbTH4FBsbTGgKpMRF XXW1Vnm+CGZKGgF6/fKxMBC+P98g8wbsoYnSeAqE1x0YvHxM/FAxzFdVTRH5uFJoD2i1tEm0+wl cAqKKdA/Y/B7sUrxzWF8aGBSjF5MVTzGpKQ== X-Received: by 2002:a17:903:3c48:b0:2cf:ba10:6d6 with SMTP id d9443c01a7336-2d5c4f07dfcmr7966925ad.4.1786976472045; Mon, 17 Aug 2026 07:21:12 -0700 (PDT) X-Received: by 2002:a17:903:3c48:b0:2cf:ba10:6d6 with SMTP id d9443c01a7336-2d5c4f07dfcmr7965995ad.4.1786976471318; Mon, 17 Aug 2026 07:21:11 -0700 (PDT) From: Ani Sinha To: Peter Maydell , Ani Sinha , Gerd Hoffman , Paolo Bonzini , Zhao Liu , Fabiano Rosas , Laurent Vivier Cc: ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org, qemu-arm@nongnu.org Subject: [PATCH v6 10/11] Add functional and unit tests for the vm-launch-update device Date: Mon, 17 Aug 2026 19:50:05 +0530 Message-ID: <20260817142010.80693-11-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976551223158500 Content-Type: text/plain; charset="utf-8" This patchset adds functional and unit tests that exercize various functions and behaviors of vm-launch-update device. It uses the IGVM files that were introduced in the previous patch for exercizing the hypervisor interface. CC: Alex Graf CC: Gerd Hoffman Reviewed-by: Alexander Graf Signed-off-by: Ani Sinha --- tests/functional/aarch64/meson.build | 4 + .../aarch64/test_vm_launch_update_aarch.py | 33 + tests/functional/x86_64/meson.build | 4 + .../x86_64/test_vm_launch_update.py | 48 ++ tests/qtest/launchupdate-test.c | 625 ++++++++++++++++++ tests/qtest/meson.build | 2 + 6 files changed, 716 insertions(+) create mode 100755 tests/functional/aarch64/test_vm_launch_update_aarch.py create mode 100755 tests/functional/x86_64/test_vm_launch_update.py create mode 100644 tests/qtest/launchupdate-test.c diff --git a/tests/functional/aarch64/meson.build b/tests/functional/aarch6= 4/meson.build index e81afd6c39..f0881bed16 100644 --- a/tests/functional/aarch64/meson.build +++ b/tests/functional/aarch64/meson.build @@ -25,6 +25,10 @@ tests_aarch64_system_quick =3D [ 'vmstate', ] =20 +if igvm.found() + tests_aarch64_system_quick +=3D [ 'vm_launch_update_aarch' ] +endif + tests_aarch64_system_thorough =3D [ 'aspeed_ast2700a1', 'aspeed_ast2700a2', diff --git a/tests/functional/aarch64/test_vm_launch_update_aarch.py b/test= s/functional/aarch64/test_vm_launch_update_aarch.py new file mode 100755 index 0000000000..2b3d7cf4a3 --- /dev/null +++ b/tests/functional/aarch64/test_vm_launch_update_aarch.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# +# Check for vm-launch-update device. +# +# Copyright (c) 2026 Red Hat, Inc. +# +# Author: +# Ani Sinha +# +# SPDX-License-Identifier: GPL-2.0-or-later + +from qemu_test import QemuSystemTest + +class VmLaunchUpdateDeviceCheck(QemuSystemTest): + + def aarch64_fail_test(self): + """ + Currently the device is only supported for pc platforms. + """ + self.vm.add_args('-machine', 'virt', '-device', + 'vm-launch-update,id=3Dfwupd1') + self.vm.set_qmp_monitor(enabled=3DFalse) + self.vm.launch() + self.vm.wait() + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be = 1") + self.assertRegex(self.vm.get_log(), + r'This machine does not support vm-launch-update devic= e') + + def test_vm_launch_update(self): + self.aarch64_fail_test() + +if __name__ =3D=3D '__main__': + QemuSystemTest.main() diff --git a/tests/functional/x86_64/meson.build b/tests/functional/x86_64/= meson.build index 27b31f2e96..0353b2af8e 100644 --- a/tests/functional/x86_64/meson.build +++ b/tests/functional/x86_64/meson.build @@ -28,6 +28,10 @@ if not get_option('asan') tests_x86_64_system_quick +=3D [ 'memlock' ] endif =20 +if igvm.found() + tests_x86_64_system_quick +=3D [ 'vm_launch_update' ] +endif + tests_x86_64_system_thorough =3D [ 'acpi_bits', 'hotplug_blk', diff --git a/tests/functional/x86_64/test_vm_launch_update.py b/tests/funct= ional/x86_64/test_vm_launch_update.py new file mode 100755 index 0000000000..aac7ef915f --- /dev/null +++ b/tests/functional/x86_64/test_vm_launch_update.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# +# Check for vm-launch-update device. +# +# Copyright (c) 2026 Red Hat, Inc. +# +# Author: +# Ani Sinha +# +# SPDX-License-Identifier: GPL-2.0-or-later + +from qemu_test import QemuSystemTest +import time + +class VmLaunchUpdateDeviceCheck(QemuSystemTest): + DELAY_BOOT_SEQUENCE =3D 1 + + def vm_launch_update_pass(self): + """ + Basic test to make sure vm-launch-update device can be instantiate= d. + """ + self.vm.add_args('-device', 'vm-launch-update,id=3Dfwupd1') + self.vm.set_qmp_monitor(enabled=3DFalse) + self.vm.launch() + time.sleep(self.DELAY_BOOT_SEQUENCE) + self.vm.shutdown() + self.assertEqual(self.vm.exitcode(), 0, "QEMU exit code should be = 0") + + def multiple_device_fail(self): + """ + Only one vm-launch-update device can be instantiated. Ensure failu= re if + user tries to create more than one device. + """ + self.vm.add_args('-device', 'vm-launch-update,id=3Dfw1', + '-device', 'vm-launch-update,id=3Dfw2') + self.vm.set_qmp_monitor(enabled=3DFalse) + self.vm.launch() + self.vm.wait() + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be = 1") + self.assertRegex(self.vm.get_log(), + r'at most one vm-launch-update device is permitte= d') + + def test_vm_launch_update(self): + self.vm_launch_update_pass() + self.multiple_device_fail() + +if __name__ =3D=3D '__main__': + QemuSystemTest.main() diff --git a/tests/qtest/launchupdate-test.c b/tests/qtest/launchupdate-tes= t.c new file mode 100644 index 0000000000..225c843df5 --- /dev/null +++ b/tests/qtest/launchupdate-test.c @@ -0,0 +1,625 @@ +/* + * vmlaunchupdate device fwcfg test. + * + * Copyright (c) 2026 Red Hat, Inc. + * + * Author: + * Ani Sinha + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "libqos/libqos-pc.h" +#include "libqtest.h" +#include "standard-headers/linux/qemu_fw_cfg.h" +#include "libqos/fw_cfg.h" +#include "qemu/bswap.h" +#include "hw/misc/vmlaunchupdate.h" + +#define WAIT_SEC 10 +static bool debug; +static bool trace; +static bool confidential; + +static void test_vm_launch_update_capability(void) +{ + QFWCFG *fw_cfg; + QTestState *s; + VMLaunchUpdate launch_update; + size_t filesize; + uint64_t capabilities; + + if (!qtest_has_device("vm-launch-update")) { + g_test_skip("Device vm-launch-update is not available"); + return; + } + + s =3D qtest_init("-device vm-launch-update"); + fw_cfg =3D pc_fw_cfg_init(s); + + filesize =3D qfw_cfg_get_file(fw_cfg, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + capabilities =3D le64_to_cpu(launch_update.capabilities); + g_assert_cmpint(capabilities, =3D=3D, VM_LAUNCHUPDATE_FORMAT_IGVM); + pc_fw_cfg_uninit(fw_cfg); + qtest_quit(s); +} + + +static void test_vm_launch_update_disable(void) +{ + QFWCFG *fw_cfg; + QOSState *qs; + VMLaunchUpdate launch_update; + uint64_t control; + size_t filesize; + + if (!qtest_has_device("vm-launch-update")) { + g_test_skip("Device vm-launch-update is not available"); + return; + } + + /* use default accelerator */ + qs =3D qtest_pc_boot("-device vm-launch-update"); + + fw_cfg =3D pc_fw_cfg_init(qs->qts); + + filesize =3D qfw_cfg_get_file(fw_cfg, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + control =3D le64_to_cpu(launch_update.control); + g_assert_cmpint(VM_LAUNCHUPDATE_CTL_DISABLE & control, =3D=3D, 0); + + /* disable the device */ + memset(&launch_update, 0, sizeof(launch_update)); + launch_update.control |=3D VM_LAUNCHUPDATE_CTL_DISABLE; + + filesize =3D qfw_cfg_write_file(fw_cfg, qs, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + + /* try to clear the dsable flag */ + memset(&launch_update, 0, sizeof(launch_update)); + + filesize =3D qfw_cfg_write_file(fw_cfg, qs, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + + /* check if the device is still disabled */ + filesize =3D qfw_cfg_get_file(fw_cfg, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + control =3D le64_to_cpu(launch_update.control); + g_assert_cmpint(VM_LAUNCHUPDATE_CTL_DISABLE & control, =3D=3D, 1); + + pc_fw_cfg_uninit(fw_cfg); + qtest_shutdown(qs); +} + +static void check_error(void) +{ + QFWCFG *fw_cfg; + QOSState *qs; + VMLaunchUpdate launch_update; + uint16_t status; + size_t filesize; + + if (!qtest_has_device("vm-launch-update")) { + g_test_skip("Device vm-launch-update is not available"); + return; + } + + /* guest not started with IGVM and with default accelerator */ + qs =3D qtest_pc_boot("-device vm-launch-update"); + + fw_cfg =3D pc_fw_cfg_init(qs->qts); + + memset(&launch_update, 0, sizeof(launch_update)); + launch_update.fw_image_size =3D 50; + launch_update.fw_image_addr =3D cpu_to_le64(0xdeadbeef); + launch_update.control |=3D VM_LAUNCHUPDATE_FORMAT_IGVM; + + filesize =3D qfw_cfg_write_file(fw_cfg, qs, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + + memset(&launch_update, 0, sizeof(launch_update)); + filesize =3D qfw_cfg_get_file(fw_cfg, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + status =3D le64_to_cpu(launch_update.status); + /* should fail with NOT_IGVM_INIT */ + g_assert_cmpint(status, =3D=3D, VM_LAUNCHUPDATE_NOT_IGVM_INIT); + + memset(&launch_update, 0, sizeof(launch_update)); + launch_update.fw_image_size =3D 50; + launch_update.fw_image_addr =3D cpu_to_le64(0xdeadbeef); + /* control set to 0, not VM_LAUNCHUPDATE_FORMAT_IGVM */ + + filesize =3D qfw_cfg_write_file(fw_cfg, qs, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + + memset(&launch_update, 0, sizeof(launch_update)); + filesize =3D qfw_cfg_get_file(fw_cfg, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + status =3D le64_to_cpu(launch_update.status); + /* should fail with LOAD_FAIL since it was not IGVM format */ + g_assert_cmpint(status, =3D=3D, VM_LAUNCHUPDATE_LOAD_FAIL); +} + +static int64_t get_image_size(const char *filename) +{ + int fd; + int64_t size; + fd =3D open(filename, O_RDONLY | O_BINARY); + g_assert_true(fd > 0); + size =3D lseek(fd, 0, SEEK_END); + close(fd); + return size; +} + +static ssize_t load_image(const char *igvm_f, void **addr, size_t *size) +{ + ssize_t actsize =3D 0, l =3D 0; + int f_igvm_f; + size_t l_size; + + f_igvm_f =3D open(igvm_f, O_RDONLY | O_BINARY); + g_assert_true(f_igvm_f); + l_size =3D get_image_size(igvm_f); + g_assert_true(l_size > 0); + *addr =3D g_malloc0(l_size); + g_assert_true(*addr); + + while (l < l_size) { + actsize =3D read(f_igvm_f, *addr + l, 1); + if (actsize < 0) { + break; + } + l +=3D actsize; + } + + close(f_igvm_f); + *size =3D l_size; + return actsize < 0 ? -1 : l; +} + +static guint32 match_string(char *serial_f, const char *exp_out) +{ + GError *error =3D NULL; + g_autofree gchar *f_contents =3D NULL; + g_autofree GRegex *regex =3D NULL; + g_autofree GMatchInfo *match_info =3D NULL; + gsize len; + guint32 count =3D 0; + gboolean ret; + + ret =3D g_file_get_contents(serial_f, &f_contents, &len, &error); + g_assert(ret); + g_assert_no_error(error); + + regex =3D g_regex_new(exp_out, G_REGEX_CASELESS, 0, &error); + g_assert_no_error(error); + + ret =3D g_regex_match_full(regex, f_contents, -1, 0, 0, &match_info, &= error); + g_assert_no_error(error); + + while (g_match_info_matches(match_info)) { + gchar *word =3D g_match_info_fetch(match_info, 0); + g_free(word); + g_match_info_next(match_info, &error); + count++; + } + g_regex_unref(regex); + return count; +} + +static int wait_for_match(char *serial_f, + const char *exp_out, int64_t timeout_s, + guint32 count) +{ + time_t start, delta; + int ret =3D -1; + + start =3D time(NULL); + while (1) { + if (match_string(serial_f, exp_out) =3D=3D count) { + ret =3D 0; + break; + } + + delta =3D time(NULL) - start; + if (delta >=3D timeout_s) { + fprintf(stderr, "timed out waiting to read serial output\n"); + break; + } + + /* wait 20 ms before trying again */ + if (false) { + fprintf(stderr, + "sleeping 20 ms before checking serial output again.\n= "); + } + g_usleep(20000); + } + return ret; +} + +static void set_test_params(const char **igvm_f, const char **igvm_init, + const char **snp, const char **cgs) +{ + if (confidential) { + *snp =3D "-object \'{\"qom-type\":\"sev-snp-guest\",\"id\":\"lsec0= \"," + "\"cbitpos\":51,\"reduced-phys-bits\":1,\"policy\":196608}\'"; + *cgs =3D "confidential-guest-support=3Dlsec0"; + /* + * The following two IGVM files can be built from the source + * present in https://gitlab.com/anisinha/virt-firmware-rs . + * Typing 'make' from the top of this repository will build the + * IGVM files for both confidential and + * non-confidential tests. The IGVM files for the non-coco + * case has been checked-in into the QEMU repository for + * convenience and easy CI pipeline testing. + */ + *igvm_f =3D "tests/data/igvm/snptest.igvm"; /* prints 'hello world= ' */ + *igvm_init =3D "tests/data/igvm/snptest-nohello.igvm"; + } else { + *igvm_f =3D "tests/data/igvm/hello.igvm"; + *igvm_init =3D "tests/data/igvm/qemuinit.igvm"; + *snp =3D ""; + *cgs =3D ""; + } + + return; +} + +static void set_expected_out(const char **exp_out, const char **exp_out2, + const char **exp_out3) +{ + *exp_out =3D "Hello world!"; + *exp_out2 =3D "Test succeeded!"; + *exp_out3 =3D "boot process complete with initial igvm"; + + return; +} + +static QOSState *set_qemu_args(const char *cgs, const char *tp, char *seri= alf, + const char *igvm_init, const char *snp) +{ + QOSState *qs; + + if (tp) { + qs =3D qtest_pc_boot("-machine q35,igvm-cfg=3Digvm0,%s -m 1G -acce= l kvm " + "-device vm-launch-update %s " + "-chardev file,id=3Dserial0,path=3D%s " + "-serial chardev:serial0 " + "-object igvm-cfg,id=3Digvm0,file=3D%s %s", + cgs, tp, serialf, igvm_init, snp); + } else { + qs =3D qtest_pc_boot("-machine q35,igvm-cfg=3Digvm0,%s -m 1G -acce= l kvm " + "-device vm-launch-update " + "-chardev file,id=3Dserial0,path=3D%s " + "-serial chardev:serial0 " + "-object igvm-cfg,id=3Digvm0,file=3D%s %s", + cgs, serialf, igvm_init, snp); + } + + return qs; +} + +static void test_load_igvm(void) +{ + const char *igvm_f; + const char *igvm_init; + int ser_fd; + g_autofree void *igvm_blob =3D NULL; + g_autofree char *serialtmp =3D NULL; + const char *exp_out; + const char *exp_out2; + const char *exp_out3; + const char *tracepoints =3D "--trace memory_region_finalize " + "--trace qigvm_cleanup_memory -D /tmp/qemu-debug.log "; + const char *snp, *cgs; + uint64_t gaddr; + size_t igvm_sz; + size_t filesize; + QFWCFG *fw_cfg; + QOSState *qs; + VMLaunchUpdate launch_update; + + if (!trace) { + tracepoints =3D ""; + } + + if (!qtest_has_machine("q35")) { + g_test_skip("q35 machine not available"); + return; + } + + if (!qtest_has_accel("kvm")) { + g_test_skip("No KVM accelerator available"); + return; + } + + if (!qtest_has_device("vm-launch-update")) { + g_test_skip("Device vm-launch-update is not available"); + return; + } + + set_test_params(&igvm_f, &igvm_init, &snp, &cgs); + set_expected_out(&exp_out, &exp_out2, &exp_out3); + + if (!g_file_test(igvm_f, G_FILE_TEST_EXISTS) || + !g_file_test(igvm_init, G_FILE_TEST_EXISTS)) { + g_test_skip("igvm file bundle(s) does not exist!"); + return; + } + + ser_fd =3D g_file_open_tmp("launchupdate-qtest-serial-sXXXXXX", + &serialtmp, NULL); + g_assert_true(ser_fd !=3D -1); + + if (debug) { + fprintf(stderr, "serial console file is %s\n", serialtmp); + } + + qs =3D set_qemu_args(cgs, tracepoints, serialtmp, igvm_init, snp); + + fw_cfg =3D pc_fw_cfg_init(qs->qts); + + if (debug) { + fprintf(stderr, "target endianness: %s\n", + qtest_big_endian(qs->qts) ? "big" : "little"); + } + + /* exp_out3 should be printed once from initial boot */ + g_assert_true(wait_for_match(serialtmp, exp_out3, WAIT_SEC, 1) =3D=3D = 0); + + if (debug) { + fprintf(stderr, "initially booted with host igvm\n"); + } + + g_assert_true(load_image(igvm_f, &igvm_blob, &igvm_sz) =3D=3D igvm_sz); + + /* create a data buffer in guest memory */ + gaddr =3D guest_alloc(&qs->alloc, igvm_sz); + + if (debug) { + fprintf(stderr, "guest paddr: %"PRIx64 " igvm size: %lu\n", + gaddr, igvm_sz); + } + + if (debug) { + fprintf(stderr, "writing igvm file into the guest memory\n"); + } + + qtest_bufwrite(qs->qts, gaddr, igvm_blob, igvm_sz); + + if (debug) { + fprintf(stderr, + "tell hypervisor where igvm is loaded in guest memory\n"); + } + + /* now tell hypervisor where we loaded the bios */ + memset(&launch_update, 0, sizeof(launch_update)); + launch_update.fw_image_size =3D cpu_to_le64(igvm_sz); + launch_update.fw_image_addr =3D cpu_to_le64(gaddr); + launch_update.control |=3D VM_LAUNCHUPDATE_FORMAT_IGVM; + + filesize =3D qfw_cfg_write_file(fw_cfg, qs, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + + if (debug) { + fprintf(stderr, "resetting the virtual machine now\n"); + } + + qtest_system_reset(qs->qts); + + /* expected string should be printed on the console */ + g_assert_true(wait_for_match(serialtmp, exp_out, WAIT_SEC, 1) =3D=3D 0= ); + g_assert_true(wait_for_match(serialtmp, exp_out2, WAIT_SEC, 1) =3D=3D = 0); + + if (debug) { + fprintf(stderr, "hello world found on console\n"); + } + + /* check if VM_LAUNCHUPDATE_CTL_HOST_IGVM function works */ + + /* set only VM_LAUNCHUPDATE_CTL_HOST_IGVM control without IGVM bundle = */ + memset(&launch_update, 0, sizeof(launch_update)); + launch_update.control |=3D VM_LAUNCHUPDATE_CTL_HOST_IGVM; + + filesize =3D qfw_cfg_write_file(fw_cfg, qs, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + + /* now reset the guest */ + if (debug) { + fprintf(stderr, + "resetting again in order to restore host provided IGVM\n"= ); + } + qtest_system_reset(qs->qts); + + /* + * exp_out3 should be printed twice, once from initial boot, + * once from restoring host igvm. + */ + g_assert_true(wait_for_match(serialtmp, exp_out3, WAIT_SEC, 2) =3D=3D = 0); + + if (debug) { + fprintf(stderr, "booted with host igvm again\n"); + } + + close(ser_fd); + guest_free(&qs->alloc, gaddr); + pc_fw_cfg_uninit(fw_cfg); + /* qtest_quit() kils QEMU, first by sending SIGTERM, then SIGKILL */ + qtest_quit(qs->qts); +} + +static void test_set_ctrl_once_and_reset_to_host_igvm(void) +{ + const char *igvm_f; + const char *igvm_init; + int ser_fd; + g_autofree void *igvm_blob =3D NULL; + g_autofree char *serialtmp =3D NULL; + const char *exp_out; + const char *exp_out2; + const char *exp_out3; + const char *snp, *cgs; + uint64_t gaddr; + size_t igvm_sz; + size_t filesize; + QFWCFG *fw_cfg; + QOSState *qs; + VMLaunchUpdate launch_update; + + if (!qtest_has_machine("q35")) { + g_test_skip("q35 machine not available"); + return; + } + + if (!qtest_has_accel("kvm")) { + g_test_skip("No KVM accelerator available"); + return; + } + + if (!qtest_has_device("vm-launch-update")) { + g_test_skip("Device vm-launch-update is not available"); + return; + } + + set_test_params(&igvm_f, &igvm_init, &snp, &cgs); + set_expected_out(&exp_out, &exp_out2, &exp_out3); + + if (!g_file_test(igvm_f, G_FILE_TEST_EXISTS) || + !g_file_test(igvm_init, G_FILE_TEST_EXISTS)) { + g_test_skip("igvm file bundle(s) does not exist!"); + return; + } + + ser_fd =3D g_file_open_tmp("launchupdate-qtest-serial-sXXXXXX", + &serialtmp, NULL); + g_assert_true(ser_fd !=3D -1); + + if (debug) { + fprintf(stderr, "serial console file is %s\n", serialtmp); + } + + qs =3D set_qemu_args(cgs, NULL, serialtmp, igvm_init, snp); + + fw_cfg =3D pc_fw_cfg_init(qs->qts); + + g_assert_true(wait_for_match(serialtmp, exp_out3, WAIT_SEC, 1) =3D=3D = 0); + + if (debug) { + fprintf(stderr, "initially booted with host igvm\n"); + } + + g_assert_true(load_image(igvm_f, &igvm_blob, &igvm_sz) =3D=3D igvm_sz); + + /* create a data buffer in guest memory */ + gaddr =3D guest_alloc(&qs->alloc, igvm_sz); + + if (debug) { + fprintf(stderr, "guest paddr: %"PRIx64 " igvm size: %lu\n", + gaddr, igvm_sz); + } + + if (debug) { + fprintf(stderr, "writing igvm file into the guest memory\n"); + } + + qtest_bufwrite(qs->qts, gaddr, igvm_blob, igvm_sz); + + if (debug) { + fprintf(stderr, + "tell hypervisor where igvm is loaded in guest memory\n"); + } + + /* now tell hypervisor where we loaded the bios */ + memset(&launch_update, 0, sizeof(launch_update)); + launch_update.fw_image_size =3D cpu_to_le64(igvm_sz); + launch_update.fw_image_addr =3D cpu_to_le64(gaddr); + + /* set both host ctrl and format_igvm ctrl once */ + launch_update.control |=3D VM_LAUNCHUPDATE_FORMAT_IGVM; + launch_update.control |=3D VM_LAUNCHUPDATE_CTL_HOST_IGVM; + + filesize =3D qfw_cfg_write_file(fw_cfg, qs, FILE_VMLAUNCHUPDATE, + &launch_update, sizeof(launch_update)); + g_assert_cmpint(filesize, =3D=3D, sizeof(launch_update)); + + if (debug) { + fprintf(stderr, "resetting the virtual machine. This should load " + "user provided igvm.\n"); + } + + qtest_system_reset(qs->qts); + + /* expected string should be printed on the console */ + g_assert_true(wait_for_match(serialtmp, exp_out, WAIT_SEC, 1) =3D=3D 0= ); + g_assert_true(wait_for_match(serialtmp, exp_out2, WAIT_SEC, 1) =3D=3D = 0); + + if (debug) { + fprintf(stderr, "hello world found on console\n"); + fprintf(stderr, "Now resetting again in order to reset to host igv= m\n"); + } + + qtest_system_reset(qs->qts); + + /* + * exp_out3 should be printed twice, once from initial boot, + * once from restoring host igvm. + */ + g_assert_true(wait_for_match(serialtmp, exp_out3, WAIT_SEC, 2) =3D=3D = 0); + + if (debug) { + fprintf(stderr, "booted with host igvm\n"); + } + + close(ser_fd); + guest_free(&qs->alloc, gaddr); + pc_fw_cfg_uninit(fw_cfg); + /* qtest_quit() kils QEMU, first by sending SIGTERM, then SIGKILL */ + qtest_quit(qs->qts); +} + +int main(int argc, char **argv) +{ + const char *arch =3D qtest_get_arch(); + + g_test_init(&argc, &argv, NULL); + + if (strcmp(arch, "x86_64")) { + g_test_skip("vmlaunchupdate tests are only available on x86_64\n"); + return 0; + } + + g_test_add_func("/vm-launch-update/cap", test_vm_launch_update_capabil= ity); + g_test_add_func("/vm-launch-update/disabled", + test_vm_launch_update_disable); + + g_test_add_func("/vm-launch-update/errorcheck", check_error); + g_test_add_func("/vm-launch-update/load_igvm", + test_load_igvm); + g_test_add_func("/vm-launch-update/ctrl_set_once", + test_set_ctrl_once_and_reset_to_host_igvm); + + if (getenv("LAUNCHUPDATE_DEBUG")) { + debug =3D true; + } + if (getenv("LAUNCHUPDATE_TRACE")) { + trace =3D true; + } + if (getenv("COCO")) { + confidential =3D true; + } + + return g_test_run(); +} diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index f7c7d06620..12ed368997 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -61,6 +61,8 @@ qtests_i386 =3D \ (config_all_devices.has_key('CONFIG_Q35') ? ['e820-test'] : []) + = \ (config_all_devices.has_key('CONFIG_FW_CFG_DMA') ? ['vmcoreinfo-test'] := []) + \ (config_all_devices.has_key('CONFIG_Q35') ? ['dump-test'] : []) + = \ + (igvm.found() and + config_all_devices.has_key('CONFIG_FW_CFG_DMA') ? ['launchupdate-test']= : []) + \ (config_all_devices.has_key('CONFIG_I440FX') ? ['i440fx-test'] : []) + = \ (config_all_devices.has_key('CONFIG_I440FX') ? ['ide-test'] : []) + = \ (config_all_devices.has_key('CONFIG_I440FX') ? ['numa-test'] : []) + = \ --=20 2.42.0 From nobody Fri Aug 28 00:49:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1786976511; cv=none; d=zohomail.com; s=zohoarc; b=BsEiMD0e+5gcitpRsUOYf+uzZkhxe7/4XIaae2MP2dM7eWMTNV7bUYA/LbgG2MhvS7rOVvzeRHMzVr0EAhflR7UngHrWWmHos8GmyYpeCdC4p3l046BIAC8TYGfIcPx8zeSQgOSvsFLdsxHGBt8RTFHKM4kYZV1NitS5Ct8I+mc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786976511; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=HEynkQAuetadjiXXgnnb/1Qn5LV1t0jsCpsOMBFblu8=; b=JMVhbuY4eE7m5j5agzky+VnRH30lZH6BkhCLpie8JyxAnVNECrVHoehjC/15PoOh+Krtxg54+vRD3IoKRDzEx/iXwTqmDQs/VpBU+MdBOOJ6TgWGMFbNdsFx8ZVTv6HpDKKNYAXeEVbX+V9pvGCUxB+uYz1fCwq4plxVorMm/g0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786976511666999.0863926750039; Mon, 17 Aug 2026 07:21:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wvyDS-0001PD-Nz; Mon, 17 Aug 2026 10:21:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyDQ-0001Ng-Hv for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:29 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wvyDO-0002qn-Nl for qemu-devel@nongnu.org; Mon, 17 Aug 2026 10:21:28 -0400 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-349-OJz5cmTJMae4RLxP4KJC3w-1; Mon, 17 Aug 2026 10:21:16 -0400 Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d55d8cd938so36966795ad.1 for ; Mon, 17 Aug 2026 07:21:16 -0700 (PDT) Received: from rhel9-box.lan ([106.219.133.98]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2d5c1efd10fsm3705105ad.81.2026.08.17.07.21.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 07:21:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786976486; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HEynkQAuetadjiXXgnnb/1Qn5LV1t0jsCpsOMBFblu8=; b=X+DokLG1noMJD2jc37p4lvG+PKqm9jHSySrrQKz9/fx5jGHnhbLzlar8HzBZjTMlMyPHbr 3PyemPFhMqDu8FQL5jmIVVZ29kN8hn5cPJIpj1RPwVFmjoKB9taD7aeAz6Nk1ZK/JlEy2D f3HE6XphP7K4L1p+4EVDhWIhH5Kj77s= X-MC-Unique: OJz5cmTJMae4RLxP4KJC3w-1 X-Mimecast-MFC-AGG-ID: OJz5cmTJMae4RLxP4KJC3w_1786976476 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1786976475; x=1787581275; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=HEynkQAuetadjiXXgnnb/1Qn5LV1t0jsCpsOMBFblu8=; b=VTRBObi6D3haaoXS6H91z0KvL7EpYa7BZ4LO2Mi6deWcMZSTrl/EA7Q3v5pHrjOk8l eyXZWLrwgcDVT8qEtAtnxBvZtuJ8lDa/NVxUy4kHYhrArWV4tFcXBcv0lE5RMvFoAGs0 sGwkyGb2zE5dDFmJZXQZ49k4h+nA9VEWMWGT8E/qpv5SOPrmtvBUONsfboXejG5jRRB4 PEbWdM9Y5OC1hw5sQj13mkOEaP+o5QCuDbFAFd69ge7mhC6dbeoSrf8Y3AN02eH1/0kY iJULpUlYbpN+Ui5LZObaAF5eh7c7kEnR4ca8QiSOXrA/oBh+1wHqGafqGsF5hzNjTNJa 5wNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786976475; x=1787581275; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=HEynkQAuetadjiXXgnnb/1Qn5LV1t0jsCpsOMBFblu8=; b=MrWrYnNNexAdDSJHps5eZ1mJccTuYKXWtnsnEX5DSACujynA6ASA55o4DzS6F7Oi8x bEE4ebkYcsDvvIO5BtJUAcT+6mHDwQdYSXgcOlL3OX8L+X6kx9IMvvVqN0Q9Ri/XOzzG Q5Wo8XdVjJ2Zmhkjdy9AZnnNawbYGJK1sbv0iSCdHWWyvmiJd34P2MtuMhOiMgr22fP3 Fh6fiucqGtOcwSdR1M7O4QCCtcAJxoFduchfK64Qkz68dY++bw7u4VuABtMWfGsoI9to wPsXXpvGJTJpJ+qzBlyYjeFAb5W4H3aNstREAh9ge0525A0AdiKSvmks1hCiqAbp2rNZ ajJw== X-Forwarded-Encrypted: i=1; AHgh+RoF1nZOsjMSFC4UEF1R3OQBJuWq/qul4T64jhRbBPA5BbhA1rwbYw11lI4IbLj1G0r6thDbl47xB1Xt@nongnu.org X-Gm-Message-State: AOJu0YxbKfii6MiTC56HXgBXiHBJnGqlIk34nYD2e4PjpLoFgJXQQhAb f5E/3xzukcJMKcUF9raVo/FRxr+9ZPf2Is6iQ2KeCisCFxxv+NWTgGv2y/RYmibVfiXEBC4m92l 2SPjIZ1cpkSxajGNKaZJZAJzeKqn9a4JhvchI5/0SMEY9OWTozX3RrbGr X-Gm-Gg: AR+sD10o4SJIPwwLLK6JgfjpWhb1IsgqKXgk6BhgUkc86NdYD5ToBN5u8gJnPAYJ5XV EZEOWaRHhRHgqbr7WwbIrvmlvCyk7hxi8qwlDX2+pjeGIDrT11RmsHXqleTUoBbOCw0LNudd3Bf ZHHDe/bw0yUMD0nutxzr5jL/iLJ9jue0jfdBgSI7MxbIogX175ZWFmQ67O29OEZkFrB47vpt+9u zRo+UwwK1wznSRuiZuo9u4pGcrjNcogMiA3ELfS24Yeir6sPXmZAv76R+Yp8BR9fpK5kgnqtzTC zfvX5RdrWanv6IglzLroYUzDGUMIRW32jIxXhAbeTmhURBX3ekU2Ynvce2ZtgBPg8aPEYrZxE21 ibV9pBZk1zdUneAfO/Kz7V2qQOBpM9IfupA== X-Received: by 2002:a17:902:c402:b0:2cc:e620:e307 with SMTP id d9443c01a7336-2d3b0ce9623mr253496745ad.20.1786976475498; Mon, 17 Aug 2026 07:21:15 -0700 (PDT) X-Received: by 2002:a17:902:c402:b0:2cc:e620:e307 with SMTP id d9443c01a7336-2d3b0ce9623mr253496225ad.20.1786976474813; Mon, 17 Aug 2026 07:21:14 -0700 (PDT) From: Ani Sinha To: Cc: Ani Sinha , ani@anisinha.ca, agraf@csgraf.de, graf@amazon.com, qemu-devel@nongnu.org, kraxel@redhat.com Subject: [PATCH v6 11/11] Update MAINTAINERS Date: Mon, 17 Aug 2026 19:50:06 +0530 Message-ID: <20260817142010.80693-12-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260817142010.80693-1-anisinha@redhat.com> References: <20260817142010.80693-1-anisinha@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.343, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1786976513404158500 Add maintainers for vm-launch-update device and associated documentation and test code. Reviewed-by: Alexander Graf Signed-off-by: Ani Sinha --- MAINTAINERS | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index f249be744e..bbee4e565e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2850,6 +2850,19 @@ F: include/hw/acpi/vmgenid.h F: docs/specs/vmgenid.rst F: tests/qtest/vmgenid-test.c =20 +VM Launch Update +M: Ani Sinha +M: Gerd Hoffman +S: Maintained +F: hw/misc/vmlaunchupdate.c +F: include/hw/misc/vmlaunchupdate.h +F: include/standard-headers/misc/vmlaunchupdate.h +F: docs/specs/vmlaunchupdate.rst +F: tests/functional/aarch64/test_vm_launch_update_aarch.py +F: tests/functional/x86_64/test_vm_launch_update.py +F: tests/qtest/launchupdate-test.c +F: tests/data/igvm/* + LED M: Philippe Mathieu-Daud=C3=A9 S: Maintained --=20 2.42.0