From nobody Sat Jul 25 20:47:29 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=1783997227; cv=none; d=zohomail.com; s=zohoarc; b=iMo5kYbspO6jxX1jUzl956Zynw6cPBIq6JAAicdXvhU3BBel3DWwd434VpYLn+7F9aPq9ZaL9ZzGlZ932bsRegFCefKAXkLkXfL80UssCLLujze0se/oftRmknFiYxO4Au0bpHJsCQ20pGxrUd8BPhJvu/X+wQa5HU8v5atRxGo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783997227; 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=3RGzh2fHUfrVRh6xn1gsQcwfkH2531OS9ix6zx1RXns=; b=adAPC7IQKAxHfemOkLiiO5vEquBlOag1xkqd4MK2GbMVECmHMXaylhnSQsqoamEqCn3jlY3Xd1Bst6coYKRvMsXJa6e60+c0VE269BWUIG0yqZBCOfn6Kaf0EpIZ405jFlLeEPVmcVkLHOA+GneFL52vOUUiLEJrZHJe4s1chNM= 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 1783997227506615.69236542323; Mon, 13 Jul 2026 19:47:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTA1-0008Mu-2D; Mon, 13 Jul 2026 22:46:17 -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 1wjT9z-0008Md-Ok for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:15 -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 1wjT9x-0006b8-1P for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:15 -0400 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-357-7HU8GyPOPsKU4EHNs0MUyA-1; Mon, 13 Jul 2026 22:46:10 -0400 Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-ca8409ba0easo463596a12.1 for ; Mon, 13 Jul 2026 19:46:09 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997171; 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=3RGzh2fHUfrVRh6xn1gsQcwfkH2531OS9ix6zx1RXns=; b=Tp2ANaRw9+up9X+TP5tvjkHbqPL1G/xt+I/SPQhWogMMhu07BOcuG4lXCSYTPNv3UYM6aA NNcJu6VBdhNWF/N/0aPB20hWO82SGnZSVRohOyskRhJod78UATrc6Ab9IWnXPjhqiD8mWz gwIvIwAmfxfBvWN927ZFyz4XvSWnA8Q= X-MC-Unique: 7HU8GyPOPsKU4EHNs0MUyA-1 X-Mimecast-MFC-AGG-ID: 7HU8GyPOPsKU4EHNs0MUyA_1783997169 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997169; x=1784601969; 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=3RGzh2fHUfrVRh6xn1gsQcwfkH2531OS9ix6zx1RXns=; b=V+7lCYJvA0oLtIFTMhXp8wbrvQb0t8oZpAS2bfsfCZuZKd3LkaPJ3Ne2+OGiR/wleO WpcOuLa8+t+l5amxeam/gxpPrG7NbsN+J4bCEvSOpr/gDWKr2hh4DNwFL8C4Gl5YlIny d7SWpqP0gG/dlrfmN3Exyv4+tipRtk5fO4bhFSQOBiroQYfmPcAJDaDOpAXaoAbCwY3U pIgucBbmcsKHKPgW85ZrNCQAh0MfAnnVWZ2HXk8jTsnsxEv5VCj1Dl/T1Q0PpJLDJ1an +Xy3dlj9mDH2sGs1pNJSxepN0qXhu7tKo8RB/P9eHI31l0XbTBnOhHUGGGpJjuBw18Se KxJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997169; x=1784601969; 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=3RGzh2fHUfrVRh6xn1gsQcwfkH2531OS9ix6zx1RXns=; b=I4TMzfl1STeGooBxoJSXaw1RduSfySbSmtG0xB+grIP1FQ//JT8JUAfuagWAJQq2dC KO5gWLACrpNGtE0tUToDYBJRunmlwRsFJRK1TRUQEJJCJGZ4H1izdI/558Jv57OSwxcM T8lUTyLPCS/qr4g2wwr6x2d6vb7f0Hqcfen/6d+TG68SVQPxI6t/ZRUWYTdg1iqjimn5 jYzx+T1D+hAjp/oAH75KxN3taOGAWzhBa9nIDN2FkX706uM5MxmTHZYm4qwEwO1rrizx QgDduxcVzGpeuvCuw+Na+N4QmHGGYHx+SDz0fw2cEag1FpvW2vitL9e8RscDQJenN1wY V8OA== X-Gm-Message-State: AOJu0YxqqofnDiYvo9avVbPAf1tHcbPlFof39H/UbK7rwm2FJVR5jXII 1vxVDuhAhgBdkgRpr+MuYtacPYqQdwaFT0wIaHf8rs9WDUyldfONdQrP1k2uW6MgueT91YPfDgC bWiNJdka5L5Djeb9mvd733+PKdFyXWuCIKOLM06yrs4W0fXZA16zaTGrHEYTkhE0q X-Gm-Gg: AfdE7clB76xbA//GvskSVtPgxcAFp2ze3+0c71cbcli3MKjpz4c53z+hG57k3yy0d9U HwW+j/WQ+E5facoo8ZgulMgIFsPqMG67YB5821wa/3maGVhxSlNRrDphbRV59ycmw6Ql4exCw8c 2EkFcj75HqoxqIIEW56pYhxLZBoYmrZT9nq30paMOeGlJaUUd+Gduw5dG/IEY3wyC4aSwajY6vo WtPX/x6fuWEGkzazbFeZExxeDRH4Y75IytLVyDl1sTKRnVNpIAtf702QT+TMk/2X916tHWGsNiN U7eHW1gmXXhxxitYsMVNKpzZ2JsNmoMrvqPSs8pVsJJ5ahdac17h6enyl55P4aqkoxh1Qd963ef HA/R+e7pHxBI7dh25WskNampkTd2PWYb8zjZj87Wlwaf/Lg== X-Received: by 2002:a05:6a21:6e43:b0:3bf:b7e8:68ab with SMTP id adf61e73a8af0-3c0f08602bbmr18381412637.2.1783997168854; Mon, 13 Jul 2026 19:46:08 -0700 (PDT) X-Received: by 2002:a05:6a21:6e43:b0:3bf:b7e8:68ab with SMTP id adf61e73a8af0-3c0f08602bbmr18381374637.2.1783997168306; Mon, 13 Jul 2026 19:46:08 -0700 (PDT) From: Ani Sinha To: Gerd Hoffmann , Stefano Garzarella , Ani Sinha Cc: qemu-devel@nongnu.org Subject: [PATCH v2 1/9] igvm: store IgvmCfg pointer in QIgvm Date: Tue, 14 Jul 2026 08:15:20 +0530 Message-ID: <20260714024557.204578-2-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997230703158500 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 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 Sat Jul 25 20:47:29 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=1783997252; cv=none; d=zohomail.com; s=zohoarc; b=LivG+5rbtjE/7XYTEaIlDqkAhCqVZymDvh0Bz1zZ/VpBB2741+KL+qZ5uxFp0JTTPvOljAtrCVA4U3/uQY1S/A9i+qQFMIBtXwJTIV4rrrmAGO6zzduzIeBV/zhFRPrC2DIeARApjltmitEzoCy07QT0agiwpj3EdChpYVp4FqQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783997252; 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=TcjFc/7/NHyuFbF0/DRanapEJL83S3ru+B67fe+lavo=; b=C5NDKU72uIqoSPTuYVhX3BsLfD3J3NyqBC0ZjnZ+8VQLCvQrYcKNB+JzLq/sOatgko9vum7kDjxiSmtldi5+yYNmWPeuk5GmuW6n/QeoYRmedmEQGRcIXB/adiMDWbcbZZCFEDVM0rSXu4LHoG1TfvpD0Tx+1r02/Div2DiBWIk= 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 1783997252426283.24428950462334; Mon, 13 Jul 2026 19:47:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTA2-0008NP-M0; Mon, 13 Jul 2026 22:46:18 -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 1wjTA0-0008Mt-U8 for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:16 -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 1wjT9y-0006bE-Vo for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:16 -0400 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-113-8UBnKblcP1uFUAbs6tf5yA-1; Mon, 13 Jul 2026 22:46:12 -0400 Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c88aab7c1d4so5866387a12.3 for ; Mon, 13 Jul 2026 19:46:12 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997174; 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=TcjFc/7/NHyuFbF0/DRanapEJL83S3ru+B67fe+lavo=; b=Ma/zKw7rjs0urItQQOtkLU51sg0cRIrubtIKI5ezUKoq3SDNhMN5Hri9mCPhGk+/HoLZAh JuxY0VmBfIjESuXwziVrMXm9oY8qkgwoBMeuoL+69otKqvbj4VUhHdN/jV4gZHm/TamuAf 1tLWiv6gQLKxchvhe5Ci8Yr3E/ZuwLo= X-MC-Unique: 8UBnKblcP1uFUAbs6tf5yA-1 X-Mimecast-MFC-AGG-ID: 8UBnKblcP1uFUAbs6tf5yA_1783997171 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997171; x=1784601971; 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=TcjFc/7/NHyuFbF0/DRanapEJL83S3ru+B67fe+lavo=; b=DK7YQYDJDx151luOa2pIXgyxFHdGn9TravERhblC40W565GErji+yot78selt0dEgn GEUX4WufspGfUzKlkaQqNUwXgnun8Htt/zRWwcZ8yMk1an9uQXQxtKAg6dpX8jAxVH6y x77JW3a65578bHvA86QUvwR1Iyg1rmJEqYsPE8XY3IEZ3r11J8wm3yPgYEux3CX8yD+9 7uz/Bau9Z1VOa8MtQdo7N/v7p22Xpt0IuMrRnC+FYFdae0T2WJ87t/b2nosUeQDcBrXb Lrvb5IqmKEOUPVS0IS84IeCoA1FPRVqa/5MDmzjt/BG7kgh3r+/7ySqjhxNCe51Sr+tv iRZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997171; x=1784601971; 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=TcjFc/7/NHyuFbF0/DRanapEJL83S3ru+B67fe+lavo=; b=sC0WPaI8yAttIuBNlYZ32UkoP5juDsICkC12mDfQJiXPTHfppOQhognaeuuvvD/Fj1 6TBoEZzq0/htXvbn4J0I3tH301I8dJFrjdEuTmUqSkWi/OBfqxqIX1GGEZeTiXLGE9lx cGnP8xpyhNdDb1K6eR98MnXpkauV4QYK7jH6SzQjpTLNE2P7EI40kWuenEY+dkGynwNx pnSl9S+BWe1FmFc8xtNDL0edCYr37X0iGT+GsDKHMBiBQx6IsDVgjV6SQsCVXR72b+K+ hrf6FFi6yT5GriwGXB0vjr+7EjMmd8cNDiNgVivdR8nVJQz1nEXiVcG3QuYVr6lI+h5b iZIA== X-Gm-Message-State: AOJu0YyIbNYN74KwJwf4qw99E7zkNrOe5o3VoOehmbdTf8gvIPY7Kbb+ Ol+h7nMiFLOtJ4VLw1PzKuPVr1i3Ctrerciyj1CIkcgRXFAArCJE9OYmIbJ5b1aIVGubcH6ltzV bwe24Hlx0/P8FhNwAk4LraQQms3SGohxI/sNLveY4idjmPWwyAOlTW2Cp X-Gm-Gg: AfdE7ckYSQlM1s8v9Pqv7eY7rsRrZgY+5piigcbWgnu+ZESEJT/gYIgSZqUSFARWAVh lnXslZX1L6VTDjHAo40b/2R9dVGfOYZzW8h5I0lKoXixPjk02vjh0EHuky+spsUQLeRd6twwShL BBb8lEvM8fdqextqJDDoYh7NVxSyYD6Pvtv9FC4SDxYynA0Bqi9y3rLxuehN/aXg0CxpLZaL72c VAzPCigJdzlcpmK1UMs+We/CYvGkNOBBEDpHUqnEiVptQmWkZqZbAwDgauHXbByw2mGd1MKpnuG np/HsaBMK1bRQ0gcvr73tmsADpOMqXdATkyhV9/DcP3stVl5ePjRVRNHmd+GVRlYLj0g+eg6vo8 jC3qVzC5bRh/pEK7JngfG6lmawOcP0NhsIQ2O9cCK2vRImw== X-Received: by 2002:a05:6a20:cd8f:b0:3c0:9c19:6597 with SMTP id adf61e73a8af0-3c110b6c159mr13098674637.63.1783997171384; Mon, 13 Jul 2026 19:46:11 -0700 (PDT) X-Received: by 2002:a05:6a20:cd8f:b0:3c0:9c19:6597 with SMTP id adf61e73a8af0-3c110b6c159mr13098630637.63.1783997170908; Mon, 13 Jul 2026 19:46:10 -0700 (PDT) From: Ani Sinha To: Gerd Hoffmann , Stefano Garzarella , Ani Sinha Cc: qemu-devel@nongnu.org Subject: [PATCH v2 2/9] igvm: track memory regions Date: Tue, 14 Jul 2026 08:15:21 +0530 Message-ID: <20260714024557.204578-3-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997254287158500 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 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 Sat Jul 25 20:47:29 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=1783997252; cv=none; d=zohomail.com; s=zohoarc; b=Oh0Y/IRPzJP7/iPYPmQxHDkTgb3Qv7CQlcg2K2wlGjqtjkARiZN5jvXCXokmQWPlXC9QqV5qVY161YMn/xe18OCinvZ66tSfhEAmZOpGIIwIjT0xPDOCyGckw2JgBpomU7GVC0Nhy1+PWsGzpHeZYBsMO6ha2wJYtSZsG7crV+8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783997252; 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=5EmYQxtfgWJQkuqsSyOE1j6hfE8WRzBw4xEeURpSQRI=; b=MKNGmIK+m2512PfdLaB1dUiiHY/bbJVG8FzTrqKLK/Jd0yYQfbmHJdGjLnhJ20DZE+/jAQfmkjhJjI4A/CbWEzhom4obXxNTCviagfIPImklYECVO/XXfV+f6UOHHoYInYCSARBG2qKZlon6ONUAyGpbMXwmht7P0XhjgzdIqqY= 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 1783997252805526.3011561759492; Mon, 13 Jul 2026 19:47:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTA7-0008OI-Eb; Mon, 13 Jul 2026 22:46:23 -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 1wjTA3-0008Nt-Hd for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:19 -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 1wjTA1-0006ba-Ne for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:19 -0400 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-30-VXAKD_FtPZ-bQxfRgHKTgQ-1; Mon, 13 Jul 2026 22:46:15 -0400 Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-c860544c077so1055199a12.3 for ; Mon, 13 Jul 2026 19:46:15 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997176; 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=5EmYQxtfgWJQkuqsSyOE1j6hfE8WRzBw4xEeURpSQRI=; b=KpwGLmGW035aH/1QGFIyTqIF6hTcuc36R+gNksdNZXEIsSv60gnIatwAdQ/nUftqYDGglf T8RBhM7KefuVxuVIcR74d0CsUMXfDR/xyP0tL2bdt4r9gGok1pdrilEqLjwJ4f3sOalyHK 4UjuiHaAlaYPu1mi8UaGQFxCOdTRfN4= X-MC-Unique: VXAKD_FtPZ-bQxfRgHKTgQ-1 X-Mimecast-MFC-AGG-ID: VXAKD_FtPZ-bQxfRgHKTgQ_1783997174 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997174; x=1784601974; 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=5EmYQxtfgWJQkuqsSyOE1j6hfE8WRzBw4xEeURpSQRI=; b=rZOUbcte0XCgKBTek2WrwtkAitoWXMR9bYVicFI4s5vBUXZxwfXilvfH+dVAMedd4k ycAMfiGmYQQyiv8pokcXGFUoUE+3VvrpWs11vUgLQPSMtFy/zsIZ35Dnd8Us7f8uh0j7 u3NA6Y8CEB74lq02MhqDLVoze27IgYpVtTZTAWrUGt1VWM5jGX8I0TjHGfDpbd8vX7TY MHBYNeXzobF9eEDB0Qt5wE35Sb+gKWiVISbIIXXYysSvUIvKQjeOGj1FzxvPeLvzIThs Sx53W0IHs6gOhfkciJ368XR0EEZIQyhOMcZn4m2iFsiYIaislrMGqgefRIAq5qoyvrdt bp8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997174; x=1784601974; 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=5EmYQxtfgWJQkuqsSyOE1j6hfE8WRzBw4xEeURpSQRI=; b=ryKMydtnKwr/zbhNVvVOvL9rryVugtrlZZ9tSM6mYT+vqfVgmcVlAxltSYzz5JSNbE o2WRIsIl6WzzvoJjNKKp3IskIMeDaR6lakvVsTADTvLeCxXjeXEmvs3Rh6WQd6qCww1f W8PF94g+ktIuQbHKO7tjcyvBSQCPZ3lB7YxqY1ZMICuCHh9cWC47IByjV8CDQRw6sLYv MXe8XqysxZI5ovnff0gm+f+1w7Iq5hrZLVPJaaEqZSgng2Q86T7weO88LWh1s0mFWeow Ce4IZrk9bOGQIYHkwg32h7mQ25C1t2eEXQsXraTBCbF1TtL8PgRd29EyiIv/YqGBEm1s LnEg== X-Gm-Message-State: AOJu0Yz8URy7bT94pEF7pr94iN+s335INjMs52gnLIPU3U5szhMbzENH +IIcbU1A8aBXWHUgQ5L5EkvyTY2PvprWsOnYIQnnffA3KoyCpABp4i1uVFkKSy/MqGWhOS7a//7 XLdOUrvpkQGC6QuDtBD38XunK2SSTW2nKfFDw6Q1+KiavXP5FXcUUihiSHNy2VPZ9 X-Gm-Gg: AfdE7ckmPkq34yl3Wus1BpVaGqGQ5mf7D4l4DeHb9STfhDt39i13Rhgq0dv6HH6Z3Xr YstS1EjhZXIbxJqUgwp4gs7fAkMbtI9UNdlaCATwut32qKxgatZ7OkKpvXK94T8wguqa5depIxH oC4PLCeirbFk/dSJ9Mt+GmjCD5MmsdSGBlHAi8d65Mi+IdsesbDse4F5I0L4PGZ1mXNUq0TxXF9 ay0Uh+5i59cZUlQqC9lh4u6hidFDCQ7fkaYyYmbJDQQN742WppNeORja+Py2+1pPK9HpPuz9MeB Ia+Uxsyy0O6N0dPXHZ9y/wPF6KXV7UuW+YQNJIGEmq79u7i9uEY4pZS9w2bDoZE/Rr0Ael1bOA+ 3aSVEZfYoWvlDTLWKC5SpNzGHJmf60KsHwxT1uYaC7iNN/w== X-Received: by 2002:a05:6a21:4889:b0:3c3:477e:5de7 with SMTP id adf61e73a8af0-3c3477e66bemr2856812637.70.1783997174114; Mon, 13 Jul 2026 19:46:14 -0700 (PDT) X-Received: by 2002:a05:6a21:4889:b0:3c3:477e:5de7 with SMTP id adf61e73a8af0-3c3477e66bemr2856782637.70.1783997173628; Mon, 13 Jul 2026 19:46:13 -0700 (PDT) From: Ani Sinha To: Gerd Hoffmann , Stefano Garzarella , Ani Sinha Cc: qemu-devel@nongnu.org Subject: [PATCH v2 3/9] igvm: cleanup memory regions Date: Tue, 14 Jul 2026 08:15:22 +0530 Message-ID: <20260714024557.204578-4-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997254283158500 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. Signed-off-by: Gerd Hoffmann --- backends/igvm-cfg.c | 2 ++ backends/igvm.c | 22 ++++++++++++++++++++++ include/system/igvm.h | 1 + 3 files changed, 25 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..c7520d58b7 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,24 @@ 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); + /* + * imr->mr will be freed when all references to the memory + * region are dropped. Freeing it here will cause memory + * corruption. + */ + 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 Sat Jul 25 20:47:29 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=1783997227; cv=none; d=zohomail.com; s=zohoarc; b=HYbyDIEeo7mRjC9pIvIf1jnKmxxxz21lgtRyBF0X9Ct+KdtbH0Nztcs7/KJXTPDBjprv8wl9zr5UOlkitl8IavoXTXkV8KEF+mEYyQ1U7u4wFijzQxefp3P+GuBC9MakmkjQ8ONCdQt2DV8cbsJYp+80ZH5QjrWfrlTPNXBrDu0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783997227; 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=NH4CLgXr7cIs8gXKijQBNsDJjUwYRjOfRXe/kgW1Yys=; b=AYD2zzUGXdU+r4m19ZmrvJC6BGj/WZCV0Dxo7F2cdbyh5RTYAXhxEf3Juha/j/ZPvRlnYlznwvHGWHZaN3SS1XuLpM0yea2vasYg9x5JyveXlW4wGyDBZamuaZV8n3kZMCVximXzC9eXMz+bcDfo5nSV5R2QYvjdPCDLh6Xwieg= 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 1783997227650254.01617599402618; Mon, 13 Jul 2026 19:47:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTAB-0008Ob-N5; Mon, 13 Jul 2026 22:46:27 -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 1wjTA6-0008OL-10 for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:23 -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 1wjTA4-0006bm-Gx for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:21 -0400 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-132-0_uMqlDCPZCDjPUlUtD_Pw-1; Mon, 13 Jul 2026 22:46:18 -0400 Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c860544c077so1055285a12.3 for ; Mon, 13 Jul 2026 19:46:18 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997179; 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=NH4CLgXr7cIs8gXKijQBNsDJjUwYRjOfRXe/kgW1Yys=; b=WKoaxXDa0WthYT/LWcHPiX1nY0frVSn4EKlZtdlWBDK582eAJgtnAkF9RD20M2qYgq293X quethBIGnMsjkCwQAm+Y9187iNKm4u6zprRZN4uzQwGsB4tQJIu8S6zTHZ8cOd7MzBxfki RTg/PaLEdX+yY8cW3p9u1mFmlju6EII= X-MC-Unique: 0_uMqlDCPZCDjPUlUtD_Pw-1 X-Mimecast-MFC-AGG-ID: 0_uMqlDCPZCDjPUlUtD_Pw_1783997177 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997177; x=1784601977; 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=NH4CLgXr7cIs8gXKijQBNsDJjUwYRjOfRXe/kgW1Yys=; b=phIbm6d75pxXh25olzrP344l+WAx6bN8uNZlxnuEcGL+7F+j7LZYenmwXq8f4kKglI Di2pCj8c4VB5ibK3lGQMncfEksTyImuj7tBc73HIbqQ5IrOf9rwTKwFhniOCyF9++Jyd j4jdq3MUvVcBhjgF/KZ9CPNq8rC6ipbuNw3UwPhVGCb4ISF2Psc4sHiyHZAtJkhrTQLe Y8UxbbNV6OaoQpAs38+/BqkLD0x+zzbmNMvd35uSOEw4I6ApGnFfKPkx7GSLGGHdtrof +++Yy0EqxPoqMvHoRV6jWKAdfN9srSadjMo8WeSNwy5fjstwt5ISMTSLvgtClDKwPGBw YCuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997177; x=1784601977; 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=NH4CLgXr7cIs8gXKijQBNsDJjUwYRjOfRXe/kgW1Yys=; b=kp2N8v6YZ1bESz5x7RdyqyoGjRDcIXT9BAAjmIIG3TTsxEp1fdaCyooGGWg1sZyxiW nmYwO/SiLor6u2fKiIEUGHTruq37x1NpmTBQxBnv8K/VpJPTRc52SHiUn0p1nxK5bGRB 3bGcSybu2iPdxbDVeszIvzg8Uwx/WW/oTXtSU6VUlQCT8/koV1kHwjOCSdcOBcuI1Gtr P6uCuqNwAU1+wrhhuS+ruZ26zOU0qa4Fb8qkbh02sa+I4411W8JnMu5kMlIVw3SxpXHA iaCwLg/qAJnsynNPw3uDgTrQRa4lXVdEjbu2B4nAjxIaCTdNuWb5QJR6Sa4mnM+UG9Mj qMXg== X-Gm-Message-State: AOJu0Yxxu5Tbu/L0/6BeSy+XXpMMVKFHVpn819TH1te94cPo0aAQbwgH nd9kfGc6UGx+ogB+mHk0ahDfhtfxyhlxp1qHPNNv/v07a6PEHaghH8miWFrbATwhfkxaCboH3t/ tgBepL4Y8iG5055quhe3j9nhjAshbkzxdW9uE6L3vQkbXoHFf3kruIxRd X-Gm-Gg: AfdE7cnOvxgGqYoGWEQlZPTvdc9GARqIa01cJUhpqITCnLeEiipyW+UxP+wgVJOyDml NqLC1NEMElXnUPMk6/L7p9rY03afojYHfUSPCnSBlvVzlr+e7UzIkRW2I1A+ObDmOYZK56BrUXL F7PVHAEkaJi30zeyUUClzga8mpPgrF95EvLLzRFv69KWgnMGZRO8XE6DRaK8qoXFrZw1BUcGl+Q +bqRFDun9bDTP5A3+6K4D9zDgRduCq/uCoUASGR2QsAHGHV0L9d+cWL6JsfNJDTNnPVO+5f1bKP 11O0CtTucURJJ6K2P/de2sO5Z7POV4C8kiV7/jEh0wO2Cl57Eo18J1B+Nafcn2V5PuTzIn+Csr5 K1UM2k7qRvpODwss11jhm4+7VUKHRkvM/mzXAMt9QanHSXQ== X-Received: by 2002:a05:6372:a80b:b0:3c2:dcdd:a861 with SMTP id adf61e73a8af0-3c2dcddc2eemr6701119637.43.1783997177238; Mon, 13 Jul 2026 19:46:17 -0700 (PDT) X-Received: by 2002:a05:6372:a80b:b0:3c2:dcdd:a861 with SMTP id adf61e73a8af0-3c2dcddc2eemr6701097637.43.1783997176784; Mon, 13 Jul 2026 19:46:16 -0700 (PDT) From: Ani Sinha To: Ani Sinha , Gerd Hoffman , "Michael S. Tsirkin" , Cornelia Huck , Paolo Bonzini Cc: qemu-devel@nongnu.org Subject: [PATCH v2 4/9] hw/misc/vmlaunchupdate: add api header Date: Tue, 14 Jul 2026 08:15:23 +0530 Message-ID: <20260714024557.204578-5-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997230631158500 Content-Type: text/plain; charset="utf-8" Add a separate header file for guest usable api definitions. Signed-off-by: Ani Sinha --- .../standard-headers/misc/vmlaunchupdate.h | 73 +++++++++++++++++++ 1 file changed, 73 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..9845721ea5 --- /dev/null +++ b/include/standard-headers/misc/vmlaunchupdate.h @@ -0,0 +1,73 @@ +/* + * 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) + +/* status code */ +enum VMLaunchUpdateStatus { + VM_LAUNCHUPDATE_SUCCESS, + VM_LAUNCHUPDATE_LOAD_FAIL, + VM_LAUNCHUPDATE_NOT_IGVM_INIT, +}; + +typedef struct { + /* api version */ + uint16_t version; + + /* + * The guest can read this in order to determine if loading new IGVM + * succeeded. + */ + uint16_t status; + + /* 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 Sat Jul 25 20:47:29 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=1783997262; cv=none; d=zohomail.com; s=zohoarc; b=MD3ySyHuQc+RQAfoE4rABHxeW6vyTc8O8WpnG2n6cI/A39ykXajDfJ0/had4z7+u/9xqGdCOqEGc0EXBONfPqzozJ104hob8NBhlmVtjUoQY9e4VvPIvv+H7po3OW1EodKsJTBShxKgRJDn2onS0sboSU1R2jYJHuXtLwmvWAMY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783997262; 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=ayDKbQIMHmkvEltzCJOUg1AJNbeiv21Z8VCvXefyhRY=; b=VdWj1utotQn1Gd7k4L8BpN/0PEp4jBRWqghroiCLZtkI65E9PHMMaDu2f/BMOLtZaOQjECB1xH7u4gDDamlySae89pN64OMk0MmDteilUAcTdpll8+PiUkUva/wFqZOCtCmv7AN69HzEA4q4WqZikIyUmkdUUG0oLu9et/T8y8w= 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 1783997262188153.5043511271814; Mon, 13 Jul 2026 19:47:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTAE-0008PA-Jz; Mon, 13 Jul 2026 22:46: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 1wjTAA-0008Oh-Q6 for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:27 -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 1wjTA7-0006bv-ER for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:25 -0400 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-262-Vo_MS0vlPMCTGtw7pbvvmg-1; Mon, 13 Jul 2026 22:46:21 -0400 Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-c88fc985a65so4949658a12.2 for ; Mon, 13 Jul 2026 19:46:21 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997182; 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=ayDKbQIMHmkvEltzCJOUg1AJNbeiv21Z8VCvXefyhRY=; b=cn3sNPnQ/MGy1qjlE0RmocOemFVBKwYsemmvSuniS0wWarWb9+ehJ2/9MunOe9zE0wELrf sR6ZCCGdKplZyeTQZK6cpChJNzkeKbAD/Ti9N+sLqCF6cKPvGt+6k47g+wJ/42stwclBbk xY+bleuwjI9H6hxwV3MM5Dt1TBWO6Mw= X-MC-Unique: Vo_MS0vlPMCTGtw7pbvvmg-1 X-Mimecast-MFC-AGG-ID: Vo_MS0vlPMCTGtw7pbvvmg_1783997180 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997180; x=1784601980; 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=ayDKbQIMHmkvEltzCJOUg1AJNbeiv21Z8VCvXefyhRY=; b=nqzkUXfeUDRHFS14CAE40ls4MkjaA4TKuZZ0xiR7WRCAa78fmIYmebv9se/M1XzbcS AFQmILrB2WAkPmaP0K/YhCnz+jMNmsM2zZg9IwVIWxGkXhywlezaJO2+5VqgYucgCBph kW4k93C+t5TER9VXHN1iNZgBv/Ci/Ly33LRRGg/1J+eu5Y4Fn4wfMNC7/nQA2/8QXQBe 9boyXOXCAd+ZRcSpBkPaRwTm8F3t2/K6JaMdjLDykZg745YYIfbmfq4nTONf2NRoceOQ I7I+PRKjecmBLIeaw4lXmS72SYdrK5TByR711EFZDAYbjLQVzHduqKDQ5QkV+qqOC41S PAIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997180; x=1784601980; 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=ayDKbQIMHmkvEltzCJOUg1AJNbeiv21Z8VCvXefyhRY=; b=Ij+7zbojwUCXTeW8rIOO7LbcQkM+S8ExMhSaIN0EZaJeLmfe5GqLXsUc3Q2pdtwkh5 QrV2jdGqCci6o477UiR/bccY3RuPuCHdHjIz0QlKpeX4BPIG07KVGZ6jPJBW5JLsgVP4 36o1vWGmiBiB5eyks3GdhzI0oAzw9I5+v02jBL+aGGYMQTOZUVfgCQmSRGUvGPPng6rR mm32btcHWgwGDPE4LH/Etye2S+7bMGObNNCa5eBtgdFAh1azy4tRcumkubVeoumyzUeq 3x34qSLPSaaN6B9mMRRfSe9F5LakXoWmz4OgBJjNZ7jddG4mzTpCn69/hYGZc6HKSAvG /xJA== X-Forwarded-Encrypted: i=1; AHgh+RoXZwvikbVWX0lOWz616NGXaRKobeBxBgfMtLyLeGAe23e3dspkw2izoSPV5iioy1ArZ28UoEB5Y0m1@nongnu.org X-Gm-Message-State: AOJu0YzH9saSESC2NF+JMKfe+kHhCXtjzFP0Axh3p+8sG/5yzGqh3HZY h8B4IllIzv3B7TmxhMg8dAh1GNSVftnoSwAEnp0/ppEzQ6LbfRNl/IwL8ruiCdP59oQnssf1FaI ZHm4ulFtZTbQvebDTrqJm3PfEi2As96xLynQjkyOnEmnH3B0RP8Tz+GHz X-Gm-Gg: AfdE7ckUkYGDRoPUStNyjG860etnQy4KHoEytIUqpSKeMZTQ5lNC/KuEFV1yUU3eCbA mFp/X88ikZ4oGJCO4aFberoVVtNAwTVlV9e6BgebySs0yQAc/PulcZf5sAe1yYvhSMCZqS8KP7u 39BcJSsZYvjAqRyB4K7KIdnqZBiKWraSgHlYkcHtlK6XEIuW6bR8EVSOqgSA+Q5Roz5np+KWHKk oxv3vMTVRJJnMvaYb+IIaHHuz1Aw7cXeZ2IE5jp2UVtetEc8D3T96/jto40pRNo4NHZLffKfEMM erA3P+5bSDHB/5B5+XK3qrYctCV/pudByqlaOFU4TZStUB0a776jUtDLxnD7uF14VK2xSFt0Gwq 0G8BHx9Hh0JOww6jg85mNsh2MyYHywX6z8VSOQquAOmQBag== X-Received: by 2002:a05:6a21:6817:b0:3c0:9c19:65aa with SMTP id adf61e73a8af0-3c110a4b3c4mr12003545637.66.1783997180143; Mon, 13 Jul 2026 19:46:20 -0700 (PDT) X-Received: by 2002:a05:6a21:6817:b0:3c0:9c19:65aa with SMTP id adf61e73a8af0-3c110a4b3c4mr12003510637.66.1783997179599; Mon, 13 Jul 2026 19:46:19 -0700 (PDT) From: Ani Sinha To: Ani Sinha , Gerd Hoffman Cc: Alex Graf , qemu-devel@nongnu.org Subject: [PATCH v2 5/9] hw/misc/vmlaunchupdate: Introduce hypervisor fw-cfg interface support Date: Tue, 14 Jul 2026 08:15:24 +0530 Message-ID: <20260714024557.204578-6-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997264549158500 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 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 vmfwupdate: This machine does not support vm-launc= h-update device Functional and qtests will be added in a subsequent patch. CC: Alex Graf CC: Gerd Hoffman Signed-off-by: Ani Sinha --- hw/misc/meson.build | 3 + hw/misc/trace-events | 6 + hw/misc/vmlaunchupdate.c | 307 +++++++++++++++++++++++++++++++ include/hw/misc/vmlaunchupdate.h | 38 ++++ 4 files changed, 354 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 23265f6035..b8c7de295e 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -163,6 +163,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..8406d0a6b5 --- /dev/null +++ b/hw/misc/vmlaunchupdate.c @@ -0,0 +1,307 @@ +/* + * 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 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 (!igvmc) { + /* The VM was not started with an IGVM, bail */ + info_report("guest was not initially started with IGVM, " + "not changing launch state."); + 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."); + physical_memory_unmap(image_addr_ptr, len, 0, 0); + return -1; + } + + 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); + return -1; + } + + /* 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; +} + +static void restore_host_x86_igvm(void) +{ + X86MachineState *x86machine =3D X86_MACHINE(qdev_get_machine()); + IgvmCfg *igvmc =3D x86machine->igvm; + Error *errp; + + /* 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; + /* 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 Sat Jul 25 20:47:29 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=1783997268; cv=none; d=zohomail.com; s=zohoarc; b=Ihin4jLGX4f01Ksx/milFscXbyE7Ss6QyTj/dhpa/hdGfU/vKZc7sm2DEdPNCEgjmyZNgCBmpiLiQQ5Afzq/UmxULZj9TjVp3WKrQFPZ1XM7kxCLiQpUcvX7nkUVseXMzsIcgC0D59v/DURCsHTvYQ4BtGpabWk9mtegC4P1NFE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783997268; 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=lAOTOyT/Bj532rxjgE018FEynR+dgRKfnK/qJSmhccs=; b=Yzr9VD213QmWly2qIiY2wAW1E6u7+R9E2Lyii8O5KzbuCZqrQp4gkqTqB0JqnzZ42EVD7F+spDW606g0nG7lqu/CrfinvUId2zKxvSwBrQblERN/TnaELVVZgbW1uuubO2LyOYAqvU3bMHd5YIdCncK/+iTCmnQddCmnf2ftD2g= 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 1783997268946943.5645168757071; Mon, 13 Jul 2026 19:47:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTAI-0008Pu-Ka; Mon, 13 Jul 2026 22:46:35 -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 1wjTAG-0008Pc-Qz for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:32 -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 1wjTAA-0006c6-Tt for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:32 -0400 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-177-cOhpxrRTNaiP0zXp_fi_eQ-1; Mon, 13 Jul 2026 22:46:24 -0400 Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-ca860baea9fso1068953a12.2 for ; Mon, 13 Jul 2026 19:46:24 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997186; 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=lAOTOyT/Bj532rxjgE018FEynR+dgRKfnK/qJSmhccs=; b=K7ps/hNLB/7BMG6JCdFdATZmy+XdAoxhxRzJAaFho1oOnJh0gX1iwF/QnhY6zZsw9Ye1Wb 8UJQcfK53Zj7GC/EmV5UN7+X56FxgFIuIdv+LswdSmpwfB6RZTBHtgCV4fPrOP3Di80/90 BJMyGK71HBGf40UOlY0ucrrBDAvSlNI= X-MC-Unique: cOhpxrRTNaiP0zXp_fi_eQ-1 X-Mimecast-MFC-AGG-ID: cOhpxrRTNaiP0zXp_fi_eQ_1783997183 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997183; x=1784601983; 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=lAOTOyT/Bj532rxjgE018FEynR+dgRKfnK/qJSmhccs=; b=tHmf8jPLQ37XybkhfD/yxvpkzr9oMgJM0qlENS8m5G15BiFFJyeIiHBQcc+KrjNnAg DedAEu0basQ595+zjMipS131tSSZtW/Unx0ryoAoMjBZTAvZLi53t1brgiBHYrPPyDe5 OFFDGEoEQ1cqaVwnEI6UVWH0eMzhOKFhz1nKBnZ9+TBkt5NDmNIOyHBd/akhmVXQF5Lo PNk0tlvbzsOCkScLudVMPNSki7nTpRCXzcela9Ot22vym5aWB9CDn3QXT3TK6VQ7cnqh WdB+/bpsURXcxLecFrZPVc7S4hRR12xi+0WW6HijDXq5rsM/z6VqyToqb4qHvRJVR3Qm LQAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997183; x=1784601983; 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=lAOTOyT/Bj532rxjgE018FEynR+dgRKfnK/qJSmhccs=; b=r+vr9N5yAv0X5i1H5zTUOsc1+mOimGQFucMCyM4hpiihy6wgWlgNUkvpan1lrPTZsb 0+rtPG7fYJG3Xh1VUWPZPoFcgcggAz9AKLAJtLwKkzUESWopVd+sdxCl2/UX4E1AZI+D 7sccjNKZGg43haKaj8GAFbxZqesexF5K73Elr8AeQFEw77usLiOpfzybn9rXRSWL5FxZ mBBblbzO9QdTTDz+L+iJCqNTWvTJVnfVTRY3WpXNCOiNbRegPtnOyQxzuhtpgI06mzAL ZjYTXJ48cYhrGrBfzaFa+/LSjP7aRP73CeRHVvcTbPEdnCn/tZMAVXXvPg1zazXXPXmA oLyw== X-Forwarded-Encrypted: i=1; AHgh+RpykB5588QrYyGn8UQ/0OwLCR/yiShf7/aj5LLT1SFMnaaol6gEEi2qk61qknzA9GFJwBWrW4oiUeu1@nongnu.org X-Gm-Message-State: AOJu0YyzH4ZRQiv4WHJlUnXSVPu8XjuaVh+7xoZ4m5hAdo73oBHUcwEO C1cAHDEFLj7JVgN6MknDxHqf5D75XSInSNMlV6ObZ3ivhSPl0+hSsheVNaZiqGb1HGMmI8ONxww KfYOFyAfcZ4pLBHxEENjoN8GoHfJCle2YsAtdUlmest0K+kBcaDYMm1aP X-Gm-Gg: AfdE7cm2vHV3DuqnVG24nCeVIuSTPoyByssqWtN5TLI1wdwVxTGaurchPt2L4pTRX6N 0/uO+avZ4SnsCx/0QciwwQ4NOJLJAie8fpZLjpihmi4mNclR+PIbhTImVIFEAwYgTDnpU36CQJl 87U/+tEdOdbj7JE1nWaZbt/fEx/vebnnqT8N4MUmHpEpFZrwVzdPc5f0bojotnHge/FaRjZ1OJ/ zkbcWpDuP4XRWS8q3yhAUXeuHiFQ6rQEoCPKO8wwlsHZJqgGI082akkor2xzN0gd4d4/yVnFpKz bv2IUQL6lN1EEaKm0LudTE7wUIxJlUkUX63Oi/tV8gMlT5awGrLwOzrSpNNiFjHiOgWRwhv0WiJ rok3YkbtYPaqzhSsAFvtDBAJgH0htmH75Jcu8mJ47C2my4A== X-Received: by 2002:a05:6a21:6497:b0:3bf:acb2:5d48 with SMTP id adf61e73a8af0-3c110774733mr12082665637.38.1783997183277; Mon, 13 Jul 2026 19:46:23 -0700 (PDT) X-Received: by 2002:a05:6a21:6497:b0:3bf:acb2:5d48 with SMTP id adf61e73a8af0-3c110774733mr12082623637.38.1783997182746; Mon, 13 Jul 2026 19:46:22 -0700 (PDT) From: Ani Sinha To: Pierrick Bouvier , Ani Sinha , Gerd Hoffman Cc: Alex Graf , qemu-devel@nongnu.org Subject: [PATCH v2 6/9] docs/spec: Add a specification document for vm-launch-update device Date: Tue, 14 Jul 2026 08:15:25 +0530 Message-ID: <20260714024557.204578-7-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997270305158500 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 Signed-off-by: Ani Sinha --- docs/specs/index.rst | 1 + docs/specs/vmlaunchupdate.rst | 172 ++++++++++++++++++++++++++++++++++ 2 files changed, 173 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..657a954fc2 --- /dev/null +++ b/docs/specs/vmlaunchupdate.rst @@ -0,0 +1,172 @@ +.. 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; + 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 5) an= d ``control`` (line 6) 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 4) in the abo= ve structure. This same value + is passed by the guest to the hypervisor in the ``control`` parameter (l= ine 5) 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. + +``fw_image_addr`` (line 8) is the base guest physical address of the guest= memory where the IGVM file of size +``fw_image_size`` (line 9) is loaded. ``opaque_addr`` (line 10) and ``opaq= ue_size`` (line 12) 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 4) 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 behavior 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 Sat Jul 25 20:47:29 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=1783997227; cv=none; d=zohomail.com; s=zohoarc; b=Ooif3A97k2MEWJjeg+5hhUZaroSeJ6qfLkVu9TLt/7+AorXNKfkqiHxAjsMIb0wTm3dMpponS4eOOtXG+XQRj9Dgq91Ni9Wk9rI/ogfsmchibFMlCClKWkB7XoxbZ7VEhr+yu6+Fid6vSoNqzGjvTntFjqVRbWeaGp+BOFbKt6Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783997227; 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=uD82petn3C9PZ6zar+k90ve31KtpPAGNZJ1nBNexhWE=; b=Y3T6gOupVq7eMN7qBKIyVnDBq6qAf3hcDM384vsFUWt0mndWUF0zD/u4oXJ4nU1rJO9Oc0pcLyQ1aIZvWqdJMUFVOEGM106CxZy71973gj918uwFNCSSHNqE2NtgCnYx2GQCxTfhWVB2xyVBYXktrzFUg/YeHCar0IXAm+61weU= 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 1783997227848972.07215535549; Mon, 13 Jul 2026 19:47:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTAQ-0008Qd-ST; Mon, 13 Jul 2026 22:46:42 -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 1wjTAO-0008QK-2k for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:40 -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 1wjTAH-0006cZ-KK for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:39 -0400 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-124-3vYi42PxMX-Ys9AKkB4vmg-1; Mon, 13 Jul 2026 22:46:30 -0400 Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-c894c1c4aa9so5642498a12.0 for ; Mon, 13 Jul 2026 19:46:30 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997193; 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=uD82petn3C9PZ6zar+k90ve31KtpPAGNZJ1nBNexhWE=; b=AVK7OZh6YtDyvIQwJQlRjNHccUng9FvZvFhz8KCjEwDNI32AKfBIqOSOtOpYlyjqlUIYhj 6l/EQkUDlcV6Bpr3jOeS+eMjMZIg8KD6p+Q3t4fOPTcWWx4Vv+X4+BvD3Kt7bgtEYEXKZh pGWrNNMSjb9STXFVlP8Z3QbNrcQ2Uug= X-MC-Unique: 3vYi42PxMX-Ys9AKkB4vmg-1 X-Mimecast-MFC-AGG-ID: 3vYi42PxMX-Ys9AKkB4vmg_1783997190 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997190; x=1784601990; 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=uD82petn3C9PZ6zar+k90ve31KtpPAGNZJ1nBNexhWE=; b=rUFCsTFPyr4UNiSM7kn0BHtSCrme4RksiI5BiYnbHg3DzfUgYiuJyiB1OaXqs1s1/c 0yzDaZ6/aghEhlQuIpKmMNSJGtHCtwubK8FdB1eKSFY2aPljBgnJcgZznF3f0cN8vR8y OQuNrS/uktWOvSm/8IdHG8PIxg2x7h1wbOYOp8RgM7TbtzSiTSw9D8dNkTKUTnOZdP38 9GT2VCCDuJ7T7XzWtxGbRdMgrd/YtB/tEE8JVT4wQYfHAbzPSue9vtwyHY0dDtGEdfUq 2iOZmej68F6wlgMLm6HVRT9u7dtFUJydMoMn64kScgY6J3qXuIfmjuQAFd+PQ3Cq/iBa EhDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997190; x=1784601990; 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=uD82petn3C9PZ6zar+k90ve31KtpPAGNZJ1nBNexhWE=; b=RLIx9B5gd2sUDoIrDQH1hWDgz+GVNXESB0VXNN+TCPm7KcZ9BFG2/zynEv/9W7GDRe yfsQ7a/oXm7Bdx8G9rQLmLgvi/KUaIGMLDYcZA3TQwMJ80HFePStcwTMqJZHpXXUshxa 0AWF7/lNSce0pgw3QYzVBEDgCfci4kvDhGr/dpTyNG3SVySLsvhFxaA3M+pHXLxkI800 fCKucA4gPHikgsX8jhkv82ITQLD9tIHboUJoM2bTpjag07TU9c/hs6NA9sMaYsDf+NBQ JFC1htmqBwYGTm9TRIFT1KqROg8LjvpIl6wiDyRyZcgmz/b0eLrC0xQoXvVDF7qiYzFU Ezbg== X-Forwarded-Encrypted: i=1; AHgh+Ro6hhE19wD2LCXFzRxtdLSfNeO+4Bu1glPFlGb/5cbiG08G2eQmw4SSvYDIzLmydy4jNLJhbImE+2/A@nongnu.org X-Gm-Message-State: AOJu0YzeqGqAReASPKGC4V4t/73JOgf78l5/wciM/fWKkEkBYDu9yoPH YYDiAiuUxkhafZ8f/OMsG8kgkereiLfE2Yll+bWlWbTqkf76rWAms/TbYzNoRSmDUv3jx0DtzL4 ipi02dt2rZq/zfiGCWHsPKfdZU7dEMdaS4XpHyuTpUqJYUY6qwtHhzeIjHT25bhK7 X-Gm-Gg: AfdE7cnFcICYOocKJ/XDP4GoHIdebX/YJNp5WdZO4MLhFoI2i+QgFAhaKXO6rim6pYd 6l46LadlWQR4czplFKxSsnGLezeXbbHUdZ0qcuHMOrbNxN9fNfgv8Rhknnznq2sb1FrMOJLvYfj 82+cZdkZ+eqmYM5nAd1mH3pEYZrSfJXXy+PlYpRQ4cUFsKENsVVQHeN1HuvBfgkz+luLFRP/7r8 itdMzVRIQKw+i09Sqb4cShqcgKyFJgVlRPg4KrZ+UdA3emSpkM31FGHkya/lg7D9onP60EO4h0t o67zPChIvwM3tpoUf2cRbpQjWsWfLMi1SRYGXHOhepD5pZZ5IMjvfM+hoopOdqyY1B3IEtBlo8/ i9N1S+AoP/hLZsffndw5ckR6rCAbNZbiQ4Q6s3UhTpIKpOA== X-Received: by 2002:a05:6a21:9e0f:b0:3bf:9795:ac0a with SMTP id adf61e73a8af0-3c356f7569emr541200637.4.1783997187496; Mon, 13 Jul 2026 19:46:27 -0700 (PDT) X-Received: by 2002:a05:6a21:9e0f:b0:3bf:9795:ac0a with SMTP id adf61e73a8af0-3c356f7569emr541126637.4.1783997186330; Mon, 13 Jul 2026 19:46:26 -0700 (PDT) From: Ani Sinha To: Ani Sinha , Gerd Hoffman Cc: Alex Graf , qemu-devel@nongnu.org Subject: [PATCH v2 7/9] tests/qtest: Add small igvm files for testing purpose Date: Tue, 14 Jul 2026 08:15:26 +0530 Message-ID: <20260714024557.204578-8-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997230720158500 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 Signed-off-by: Ani Sinha --- tests/data/igvm/README | 24 ++++++++++++++++++++++++ tests/data/igvm/hello.igvm | Bin 0 -> 153624 bytes tests/data/igvm/qemuinit.igvm | Bin 0 -> 137112 bytes 3 files changed, 24 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..e785099579 --- /dev/null +++ b/tests/data/igvm/README @@ -0,0 +1,24 @@ +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 + + +Following files are used by the tests/qtest/launchupdate-test.c: + +hello.igvm +qemuinit.igvm + + diff --git a/tests/data/igvm/hello.igvm b/tests/data/igvm/hello.igvm new file mode 100644 index 0000000000000000000000000000000000000000..62196ba40a1bd63a7fb68cdb3eb= 26ac93fed40db GIT binary patch literal 153624 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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 17839972306081008.0000953535224; Mon, 13 Jul 2026 19:47:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTAU-0008S7-QB; Mon, 13 Jul 2026 22:46:46 -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 1wjTAS-0008RW-Kj for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:44 -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 1wjTAM-0006cf-PL for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:44 -0400 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-282-VtHpoXXsPtWtd5wv9UrcTw-1; Mon, 13 Jul 2026 22:46:36 -0400 Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-c88ad1558f4so9735022a12.2 for ; Mon, 13 Jul 2026 19:46:36 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997198; 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=5fyQjkgvEsxqWCkcrmIFcUIZk2rH4A2mC8bViuOQNLM=; b=EdV8eO0sHU16sN137Lz+2/CQCan+4gtnNI+iIBhH7SQ7TbkqE9eGldxeqabQiPDbXTdLHq bZEsQx7ssRrC71vP78P7EcMyB8nBTGnTtX68jHkN1o3MIA0FVl5J7LzXkuLy8X8RN+fbDu UgzKouzW2SPCfewl78zz530cdMJmqKA= X-MC-Unique: VtHpoXXsPtWtd5wv9UrcTw-1 X-Mimecast-MFC-AGG-ID: VtHpoXXsPtWtd5wv9UrcTw_1783997195 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997195; x=1784601995; 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=5fyQjkgvEsxqWCkcrmIFcUIZk2rH4A2mC8bViuOQNLM=; b=b2xCCwol94p4J/G8a5wXOx+ufH0u1RYIineaWZmGwm1QayIkvhaYf4TKEStyq5gNS9 OU12HoigRxNcLGQbZq2wB4wsi+msFKu3cwkO54gwWe5xKMsf0e8zvgUhk7porR4LtCkJ jJkrtfJXhX6QxDJ2PS3ZxLGEjqaX3AdbmUiLROYnP6pccy8LeKy72+i26lcY2b+uL9aL loWZb61oyvDS9b+qVjHw+Puga2OqaKFA5dto3WUWW73EgCfBuxrfr2VTAIo3Hz1kVrbt ewJi0nbnOe60EtzzoKe0+337+KE6XrxsrSf2aEGrn3tLlANT6LaPhWKwKoePlK1iGVMp 1k2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997195; x=1784601995; 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=5fyQjkgvEsxqWCkcrmIFcUIZk2rH4A2mC8bViuOQNLM=; b=bQQXTI906udit7YeKHR08qyYBN1HGrXVKWc2oPXZAdLmnIUkhy4Uf1Eqin8OasAXSX VNM2FaWEB8eHY1S/bmcnr6sAvci2+4InsxU7hj4S9okVbIKQT3QHi49/S7PaTRifgXNH kt5/xtS8gUf3eoIStD2YNUgHpbmyIeZD7Mf1euSC9sDlBnA32jezVo5nGPsyuPODqKZO KAWzXGfGXEdYFLdpxDtlCcmKJLrp9964xpNDv2MX8lIWTDZtqTLTiwl+IHhwxDMSzsjR xFSGyUYOo18VOGZ0qXVjyZpok8iw4Sorrzc02ivXtKlbcK0AZPWg2tmMgR/8rQ6CpJwO nLRg== X-Forwarded-Encrypted: i=1; AHgh+Rqn03bmHxUVcXp0+DvHwV3rLD5+Kkl3jjZumCeU9fjJXCaIZS24+EMgoHJ+3RpurWmZJ/OAlT9A4DRR@nongnu.org X-Gm-Message-State: AOJu0Yz71OYntWUn0Sli4yHXAGtMSuCPB2jXIOZc8NefnUaQ+6s03hNF 0nzn6sFy+ADSiozLM1wTmghhFa2RpXQXXcIlcOFWfc3OKhNCt/vKogUK4ei2nKYBnDGSxFIPZ7w uD10RPTz/hQSge8ZcVTQlQADenq7LtETySdXUC7TNKr3E4tzY1IOwWuSRvVcLyX1U X-Gm-Gg: AfdE7clK31qfPrM5AI7H9A/Lwt+pGFO2bM3d6ZgKjo0S7XsSdmvYUHhrh5tgOXXOrV7 9ajeybKx64cgfKjnAKOFpGCwWzvSe7tpJkOWINw3AITESrVMBst+CgWsVPtTrtgy6qW7Sjnjf+/ GC2KxdmNYIoNBrt0BLLuECUfXfiKx10PHwvHsr4HyY+jjrmRVcGXVhmnrodveSZ3jjzAOAcckLN 6pM1RfDvm0bffsnTCGBq/ipLeSFtZ5zxOr/ssfkoZdSTyhUD8p/60fW0bS2kCPbjbADs9etttgF rrwys+6deUEDrKPDjHeO8uZNicPmPHjeBqIC8aeh3/SFbdxVD62jDuha/JUb90mlRn8qwISPXKp 1N9v/SCm7q0DRNxI2Dxx1GHHVCNXfKThhM2Oug09BR25x7w== X-Received: by 2002:a05:6a21:7a8b:b0:3bf:9aa9:b2a4 with SMTP id adf61e73a8af0-3c357395a06mr411836637.20.1783997193002; Mon, 13 Jul 2026 19:46:33 -0700 (PDT) X-Received: by 2002:a05:6a21:7a8b:b0:3bf:9aa9:b2a4 with SMTP id adf61e73a8af0-3c357395a06mr411728637.20.1783997191610; Mon, 13 Jul 2026 19:46:31 -0700 (PDT) From: Ani Sinha To: Peter Maydell , Ani Sinha , Gerd Hoffman , Paolo Bonzini , Zhao Liu , Fabiano Rosas , Laurent Vivier Cc: Alex Graf , qemu-arm@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v2 8/9] Add functional and unit tests for the vm-launch-update device Date: Tue, 14 Jul 2026 08:15:27 +0530 Message-ID: <20260714024557.204578-9-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.133.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997232166158500 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 Signed-off-by: Ani Sinha --- tests/data/igvm/hello.igvm | Bin 153624 -> 137112 bytes tests/functional/aarch64/meson.build | 1 + .../aarch64/test_vm_launch_update_aarch.py | 33 ++ tests/functional/x86_64/meson.build | 1 + .../x86_64/test_vm_launch_update.py | 48 +++ tests/qtest/launchupdate-test.c | 408 ++++++++++++++++++ tests/qtest/meson.build | 2 + 7 files changed, 493 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/data/igvm/hello.igvm b/tests/data/igvm/hello.igvm index 62196ba40a1bd63a7fb68cdb3eb26ac93fed40db..2d3ffda5b157c13d109ef965d1c= 0f41e9a34caf5 100644 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 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 literal 153624 zcmeEv3w&Hvwf-dJv;mqlEJAclt!5Xk@g*4}64Ofu~%f_ne=3D z*Ywvp=3Dj?Cqwbx#2?X{n0pG6DLetUHw5D4M_*!u&4#`fyKsV~l4g~vdkJ`kuf7r9o; zuONZyeGpe}r^_$nHFg?|zeT)W!9xljQShjO#}quS;0Xm!DtMoQ_bd2-f@c*xr{Kd1 zKC0k>peTLU`d9Fff=3D3iQs^BpNk1KdW!IKK!r{MhxKA_-P1lk12Ru!4nFeRPa6p?^o~v16g;ZnF$Iq+ctXLG3f`yS{R%#y;8_LFDfqC0k1BZJ>x%vrJfz?e z1&=3DCtOu^#{o>1_lg7+zSzk&}acviu43O=3DmhqY57QhN6E34=3DH#=3D!J`TuQ}DQgCloxX z;C%|-uiyg;o>lOif)6YBsDcN+spwz9Lkb>I@Th{v6g;lr2?b9oc%OpzEBJtdXB9lB z;KK?&s^EcdDf(CNkb*}PJgVR^1&=3DFuLcx;?-lyRG3O=3DCVSq0B2_^^VHDtKVMqJISs zDR@M|qY55V@VJ5}6g;WmeG1;M-~$StRq&jG4=3Debnf(LF;^snF{1&=3D6rRKa5k9#`;$ zf+rQcPr>^Yd_cjo3Z7H&VFe#m@W8hf{VRA#!6OPDRq&XC#}z!G;7JAVQ}BKTA5ieD zg69-`SiwgXJn$Vw{|X*b@Q8v(6+EWkaRpB(cv8Xp6ue)-2NXQ3;5h{!R`5{;4}4eA zzk-JpJfh%H1&=3D9sT)`6xo>cHY1@Bkz0R_)0cuv8G6?{~|1K(5huizmCk0^Ll!D9*@ zSMY>_Cl$O;!TS|_K*6&Lo>TB)1s_%L!1opXD|kr3BMKf>@R)+f6+EHfNd@my@O}j! zQ1GmR=3DM;Qc!ABK5@B>Bv3LaAMh=3DNBIJf`4r1y3k=3DQo;KaykEfw6g;coIRzh9@KFU1 z3@G|n@Q{K>6g;ZnF$Iq+ctXLG3f`yS{R%#y;8_LFDfqC0k1BZJhl>6cJfz?e1&=3DCt zOu^#{o>1_lg7+zSzk&}acviu43O=3DmhqY56lQPIDGhZH=3Db;86vSDR^AL6AGSG@ID3a zSMUJ^&nkFM!G{%mRKWv3QuMFjAq9^pcvQh-3LaPRgn}m(yidXV6?{O!vkIP5@L>fX zRq((~ivATmq~H++k1BXf!Q%>^Q1GOJ_bGV4f)6NoR>5-$KCIxQ3Lf~eqJISsDR@M| zqY55V@VJ5}6g;WmeG1;M-~$StRq&jG4=3Debnf(JGz`d9Fff=3D3iQs^BpNk1KdW!IKK! zr{MhxKA_-P14hZH=3Db;86vSDR^AL6AGSG@ID3aSMUJ^&nkFM!G{%mRKWv3RrIgm zAq9^pcvQh-3LaPRgn}m(yidXV6?{O!vkIP5@L>fXRq()8MgIyOQt*g^M-@D#;Bf^{ zD0ouA`xLxi!3PvPtKc~WA6D>D1rOY!=3DwHD@3La7LsDj57Jg(pg1y3q?pMv)*_<(|E z6+EZl!wNpC;DOO`8bB5PH};At$WQ70e;>ZC0v__=3DW~+I5`iKuVL(y_P>cfXB(2x1> z`zzpaAD*v(Cw%x=3D1w84)YbgcuS1f;@4{xl1_xtds3iyBzZ>fN1eYjfz&-w873iz-O z@2r52`tX$%@W2y3{a3*2efYWxc*uvZuYgB<_@)YY)Q1mMz+*oA{t9^9hvzHc2_HUI z0Z;ny+G%%*X*_ZOqDfqC0kNR-8LjHj#OZu;r zf4zc-6g;BfQ3a1FcwE5~3Z7K(J_YYr@BszSDtJ!8hZTHO!2?ez`d9Fff=3D3iQs^BpN zk1KdW!IKK!r{MhxKA_-P1cHY1@Bkz0R_)0cuv8G6?{~| z1J5Y>SMZR6M-)7&;4uY{D|kY|lM3Fa;Qb0dpx{{r&nft@f{!YA;8{ig3LaAMh=3DNBI zJf`4r1y3k=3DQo;KaykEfw6g;coIRzh9@KFU1j4Aq8@Q{K>6g;ZnF$Iq+ctXLG3f`yS z{R%#y;8_LFDfqC0k1BZJIYs{p9#Zg#f=3D3lRrr>b}Pbhd&!TS`vU%>|yJgeY21s_)M zQ3Ve?ujpUFLkb>I@Th{v6g;lr2?b9oc%OpzEBJtdXB9lB;KK?&s^EdYDf(CNkb*}P zJgVR^1&=3DFuLcx;?-lyRG3O=3DCVSq0B2_^^VHDtO=3DpMgIyOQt*g^M-@D#;Bf^{D0ouA z`xLxi!3PvPtKc~WA6D>D1rNNa=3DwHD@3La7LsDj57Jg(pg1y3q?pMv)*_<(|E6+EZl z!wNpC;DMJE{VRA#!6OPDRq&XC#}z!G;7JAVQ}BKTA5ieDg69-`SiwgXJTR{4U%^8P z9#Qb9g2xm*uHXp;Pbzqyg7+)=3DqdS6CGZW(-@=3DA2@b=3Di)e z)&uDH)4_OOxAxV{*wPAyvg@n5oRR%Oe`M8oz}>Me5Xc7HdE=3D?Sg-FgE9($2SWkqDPbge~DHh#?@;-2N4b@EIG6S1fGM6GS;sd-~e#@}5^E+H5@%L<;0gu|( zZNMf7wIr#}`=3DT)qqLTh9AK>M28N<@f$8eE2tIW-+ZB*24KHc#a`r~N;ZVIYGqCj?z=3Dn2OpTJy-4B>%VC#ElZVR$>d)+v_MW zNf9oxBK~k8*CeNZvdNt zu0xqgqnk#o)q&o&@HxQ^V8Tfn7JuY+Z|j^S-|oknjBvpQ`0FBnOObopnP+$bNlN}i zJZ;_2RE_R!O&%ST7YP^zN$cJ8DTo@9gyAaW*XYIb)CzsB2N5@QQrJyx39sXQy0v4P z$nr0^P}r?!^EuPJkdBF1*prwEplgMy~rTA}`K3Z!>9b zLYl2_B=3DyYNFh3nix+jJ62!_vS3)j*UAd4AHoOUvjp|}Ikt#wyzBbT>$eTEKj`qe?&~2EUmQ-5{gpGxerioP$?J}ua4)VVtS8*ZFtI)O zIX~gVcy8n{xNlDxxPp;c3@6APfpO6%HfM>8Z zy_hulFqnHHxB=3D$l93=3D#bDUA|$onLjO=3D;W`dH%GQijYUp#_!KgE{CZ!pwo(Ous;_7Y zlHsoN`>edD1{Y%fDbTWHjb=3D+YY!3ouR~(me^hGIJX$oYDqti1hl!N0 zWuz^FFkbMg`w(H|tN4NW-UAdBweZsTxT#!eXQL#bqeUG=3Dt&)m*J!>L(xz+8yHQ}ZP z-R{9ow>ukmQ)|OXGKE^j+T@}IF*ONoCZE&Jv!n+LjF5{Vgqdm`anm=3DMBnal&KE7a~ zfZ)6h?vZqEdQCV-n#ikPu07Tj_6Pyu!xkT~_+f-$X&=3DLJ+aJtrY@rIY(0^qyry{WWbxh^jgVsro`SNh|%Z>B8>cq znWS3-K%vpsyhx4qgqtMP**S$d7%OlyH%YKn?SJ`H+ip}Fg=3D$@@HqO*2RHs~f!U>^v zlL=3D2dv&jja3rVjBW^{-K_$HGC!EAJW!9oGSLpHca(or=3D7q>a3ia_tGPJJPh67_VSm!qZL*IbmZ$ z{(FTa4JO1Wk_5r)%7cXhg4f$%G_*on2#8?kuO z;?g}&`E-2aTG8=3D$C`E8k&v?)=3D^C{{0dv9Q9>juPy*nYo{)v?P&U~Ur=3DLC0BKJsl6( zuv{?=3DK8InDLO`z0S3swf=3DUO4-({UF51IBdwiG*7uYOGy9w)MFALp0s$(;;zL>iFlvI;}&n1 zt53%>KPNigK`DZRQ4z%&$)}{_+nYcw(|R!CLdSorvO2zyiNM@C5`~WYarJb(-i8en z!{B@v1}TWV)6P#or-*7tgOdaEFV0RN#NJ;!1~nBE3)G7&Kkh48icF2TWV(D z$ENufL>ReId`9c>Kw$u}XN>_22`A2LY?>?|VE_yk18_z@hEA%_m)9E`K#yf@I3T>B zA+kKx^Gef|tFx3up?`Etw}f4U8U3T%4llwe2yQPA777UNw80oSG9vUB;}s$f$rTNq zgrlxoJZ|xb#hWZnN@712k6OG%u0H*r_Zg#q3K1OSL=3DtNxAD{k@Alt3)LtN?~lP@S! zrtU%}0&^=3D#6iP|r>gm7NhV>Q0;FuT&DTuhCf6yuAxmL(P{{i~(RomESCZ$1NoFqV4u^k6*wjD+V+_F1lY&dT!^dv&fi_bXtJ% zXeUIWj+HhT3YYkB_Pj#o5xJsEBH?ft7Ef3_YVj6}lae?Li^nYP%GGBO*IpwAvEd+N z5JOU0I6K5E8N{YA`D^`8#Dzip=3D|yW0XE70&>m^YbL?5o6L9DZ3{lzfUYKEb>qD9PK zfeuS;@?0xqU=3DV*n@5?t{K0FMs z&zfi429~3awm$Z0Da4OWAz&^N3#s}g6&*Q73+#JstHq)?6K3{@B}o$Aa>GAK}cU3M?fK@54U4_ z{B~>);wxE=3Dq`oDWAVEH8CBN0PA~NU z;l^3(F=3D;ZX{&U)Iw#{X|RSxTY+L>-cHx)zU2wiVE9kQYSSP$^7)gtAyY!OjKJr9sD z$XA~=3D0;}7P`uICNz=3Da?((F2?f58yQ+oIkRS2W9~ChlorEjS(L>rR0RcQMQW2*D?5np=3DApThq&o2mU=3D^nk=3D!Yu>dlQKYl(|A!kCZ2KGFb#%ML7j z81>;OlXySF65f@IY zCo#)L*l>zwwe?PNlXkv`WN-rTh6&fOdE3=3DRHj@T~WH;D8YHrWi>?E5f7Y?TT0o{i4 zO=3Dd0SJa$&%G4A8B$t2si$Rj+980?%9j}JZVY5zdW&~5k$X{MdEpjXs8 zS0pOPG3Mj3$0WPRumL&7ERUCeswl^nB99;D00tC?_l!r^$0O)A%rcpcK2^q}TZzZ0 zkH=3DxMl6D4>%;*}GUgUV+RYe}x8W6g^gM)1FnBOxVTYNl%Zo@}SW{b;tY^lU!#K+@F zCfOlH9wU~=3DV@f=3DZKI!TD2+QN>p7Ge^;}LWl?j}vNFQDhsbyFoCLp~nYnPit4HlXW} zj_<2>Q%y590w z=3Dq~cO-hj~c@5mb{N)JtUKegoX1XHg;x8Z7&Sse6ya>Qt$#N&GAuxeW^gmD|(&O1$t zn{?70aRoD@iFv0(p(CquumB4+MoTRTF?v>4s_EPH~^@Z zFl2y&%LsKTC1RIgg?|3?=3Dwq53Kp(bvMYt*dS`GBF*6{Ma_WVB ziA4&5~ zgFI4(V8|L6L3fwb?khtMB(lsPcb6e(l>;L(1j#r*DMKWmlTDiMlpzN&P1qn`D?>yE z`xzuthDaLm2pOl~_{)QqAuw_;e!z7(2lYg@7-X=3DF8kcBCzGjdgmm$-L^cv(_We7Pa zd<2<%wJeyV3hzSjy0T!2eHwy4TNZo}W6wqK6J=3D!}r-cRtFS9dvX5dd_VKa+~8E#F$ z-iHvX|L^|H>Mu*nW!8!QqP|`|6YOAAb88YJ#5~wzfxu=3De*Uju=3Dy;`gs_Kv}n4BDhh zaf|?ag1tB2k8*(CXAQkeNN@J8>8*N<)v(kBo|k2JxpCezo5e|CzlW5~phedh$I{hg>b_*?Znbn5Q~EpH)V<823BteD;NP^k zWGR`K}rZAkmhZXctK|3};Ufqgz>YiI68mIc9dh zq_~fw?kF(9DI%1V1R*8frMTd zE;j2*aT#N9XZ;>!YHgPn@o!$A)HX^D@Bf$>UM~z|EB!j^fs~)^Biplv1t!8Zh`?rN z0@`HI%gWGA=3D&s7fVn#*{mP#=3Dcut|$mg#1AE5PMy;_c`non}+{pzf{_JGbl2*9nju1 zT3)8%>C1#w$A{DzzVN8@~S|CY;`21ybJKMK2)!Y)R0*ZuI+8>{Zw*}F76 zwf7e&)I!9l$5hcg&bt_1pEW#*Y}naejkx=3D*tsTXvyVqRc>|B`@MM)akO{%XV)mC<| z#&e=3Di@Jl{d?FiJuCNd3+Otk+(vAi9<;sc-9N%)HJEX?zwHpopo?CKBV_?WjG~5?t*~)qoO87-h8IhF{Yo*2n`#%HTfIp*m3pqa30lx9aq0VCxXBBG6w|tK!n1Xa4kaW z3Wv6ip&sTx%&k(ww<*&`hC;BV{g)>Hv@=3D&2l%34ZI^37c`$?#MJm=3D+V^g;WCfFLEC zbBLM|Mj`}SXxq`PeJE1?Pi(%CeP}CpCgdM1K5~OX{!V!$6?o)&c8$>Ql4`S&som6d zvY#P!4PzUV@OdN1^QmCf10HimzEqX-$iw7X`nR5Z#z+`C6+@IPOn?10EQmmnf4Wo* z;U~lBuXCufi~hg2UwMYtzp!G51f+{h1BHKV8J$Y*xd{$GF2xgLc)Nt-CP7^iTgh#Z zNj_j6yBAlJ@+LF=3Di!kLFoo#}_cLVGOH6txCZy5Nq}Jhk)6Pyv zV%|Ne`!*A#buXoeS#-OpxlEp1&y~ESk7`v6WsAHfsF(u=3Du;ZGpd>01|OU>5x1n(vl z%*0!3mnv_vbLdYlJHfCcjKM!1B@M8@q>EWn_MO+5g31Wv(!&eY_y<8q*N`p(`bE*4 z(P602wnJ&?$ru$Yf7Q^$LeriX!C|DR&rvshEH2V>c-~rzh`_5=3DESBj|n6k(wR_ZwI zbR*N7ZKmS6j95V*l>sG^it>^rN@gKa$Q4zUGHfzRr}3nnDEYVA>fY8evA&BoYMB%z zhC6j)h;K)~jb)L+0?UV(HE=3DPI4lcG^)QIfE^RmdAQzRStC66t@Qls8%l{Du zXF11 zvZQj?iGJORz%%%%T0XZRjgiUeXT}^6InEwpItq5Y)P-yT8sZZea2XyU)fU#O$}eFo zPZ-IiStsW=3DmF5cPhj=3DfQEj=3DFvwUszMAEsf~jM7zZdJ%G;u)3dVJ`WR5DA@|kXSx|| z%|MB10O$q18LvQyn?wBvr{apm$E*z}5etbv`P))twBv6^uXfco>O@Qj_R>l1f(gtu z&`9wA*pkv$jg!o>Iut+L%0_nC!3CM5Y@!khb4@tv!Lmjhj_JEVVTKqvjmgX^Ho=3D>N z8LC^9aw05m*->;_jo?0S zCwWJmxLc;WQ2DACnj;VIGNUBl7dNN=3DpF*R3x6wnBu}SA?fVdt0Kt ziK^aMb+5Y*n($7)k23yoMtD)`NjFWOFhp zCnGYp1kAb{T^O`Xl#$#0#JGDH)`8934bmfj$S{8@^kQw4)d%zITm%So%|;jbBUsfy z&wA>Ah=3DH~|fWGEwz)ZJTssLP%^vaAptYd7-zlW3dQlDY{5)m_PV_gk~6@*FaA!bxK zh=3DG3HxABB0X_LxWk`Dy`AwM! zJ=3DZSRV*jC}KWXQ@e!JIlJdJEj)kh)X$oCHtU>Cj9t-r#f)YzL@3r?SxZA)#>-~IFP zaoM=3D?X@p_p$~96#C(ERnEn$YrCLwW1EAbR4ydLd9uaM@TKxVSM1^LBh)i{Z0bQUYQ zOF$lAXEE~DPQk^bb(#2T-Es`%orq<*UnsO5hDR97es_*@pN=3DzfBy^X*6HkR-lD>Gc zb~YKEB%a_M%$J@G^Gm;G5zxtk;4zVzcD{a}F%Kv0L*VS7U&6~h_=3DA2}dUn!rW1Pzn zXDg(aq?tJ<`XUO6cX%YKuu|aVJ*i9R*&{fmA51&PfDV~tRgiWf?KD}^oc}_&*jr;o zvGI*WM39#ek2h06Pl1hF#^BWO(&Udo{}0}?x58FlsbOF1P$pJ6$a0I>r=3DPxsEg&E1 zfKkylTp|_i2b2I^CmG|kHMoQDv42xYtd-6B=3Dp>(z`{-<{2zH1F=3D2c1IpM%Fk3Kz4L ziOWRBazpq$lz86lsk>z)d=3D8U#u3l6H|9bY^$GTR?KBsf${yEsgH5mK!c(7+C{DFP? zOR%TC^wbgT$uK6C;-n>OIKpJ}?5`jjIuX&}yk8nU;jKMkmW&StKluR4GV(tx5SWL_ zM%z2E(s?YpbuuN6eayh}ZLi_8xG>1gO<>mD$PAv0J6hPAA+^^dyAka7;a07)S%kSB zn`h4j(-#p=3Dh*R=3Dq_AJ(LY-UMjb{~At?lX%@X19{sxA0TO`ppf7niK~*?Uk}668ZSS z#h4SB=3Dc;`0lj}$i)34?9{&NDoK964guIX_-BlyV=3Dlipb+dW+fRldNSeVBN)HW#>XK zP|2!oG)zpk_yjY(B$xyRvvn4WwhJv(Qwy?m|K7r)GBQ&qlwhS-f-|U9lc7%{LP#b) zPA(i_VQD%g&d58czD(_lo6O5!ctK%+>CuH}Dd>B$LeJu9=3DOC%oTkI=3DM+1FJCOuc#ilXhWFRy((Z zr39t+Lkf^-c-*A_59ry~exUMmFoN>BLSn5nH@^16Wo3&=3D`*8}DB^Go@p@nR@(tdo; z5Iz))nf8N5Ym-Geemi*+NL!PIGe6)xAr@??Ll( z9w?j-&;1@;Tj%z6y<3`_*14&!f46rXU8k64hIE%0x_zX}Y(>y_+-bxg=3DM$K-%?!6K zjJy>;$t%L=3DrMnsnzv4}G*UG}r^JPrC^Fk5o=3Da|-0z6=3D4ZFN2{Mec3wJSNO7ixvsIk z4ZEKB49_HZ+F2-dbc?tHTF*@;LE1Um0=3D3A<0LH624HjrD0@nMz08!BUc}~vy7}PyV zkX?1-V?2NQ5B7C_U-rNS;>(_Y#BhivL3|ncD*3W7-)F%7;@b&c!RZO}-mp}$E4@%W z8DDno)7F=3D*`MKYhQBUtccA!+a19~d=3DWprrhpS#8N+d&);058Br;_gSQ^3f@Qz{Dl% zcN=3DOAmIJe7eU1t2L>6S0f!%h=3DdUy2W73jb4KH>JqLnTs~=3D4VY{?aQQ}tU&*ZhSWRD z=3DwD|7*ZT^!C;azUpnsAf_17JK{*O0-?#rZ~tw8^w_lkV3Eu(**3C#NnwI}=3D!SD=3D4| zA=3DO+)e}xI`eVOzFQzzTcY(whT+x_yHWdfTj(=3DV<6Tl?fD0NAIPT7LiiK?(lTZh7E* zgSF?{-b(RLoD{!g|7L$geyD<6*2G2bhm`Ssz6nhDgyqRyIt!+L?Vg{@WdUo?`Tx$# zjBnP<_MHCyvgEht@lSl2@h^Fq@xQQ}_*g}jwRgCj{4uhWTjbj(e+(mhiv^9GhzNPJ zb+8>7G}*~JJf5(9#c{@-(lanU%pD%wM&NEmi;O?q9rmPe<3nUu`#kKj3+xdcmXpH8 z{Te6T#nC{)zdI)3}TZYX2qqvl5v6_x)$&KhgevZ!>pZ zUgpOC{T=3D$BnEx#{|0(~X{GYY?@AEIp|8F+`>Q|nB#r<@ICwO zQQonR)EM{BP2nUW#|7-5W*XjeE{;#5d&|EOuPFEyb<5&kQ;dIlG5+NkrSB^K`NjBe zD#m|pd3^Q<+#NMxWQ}gZNm#N5H{WWP^CNO{egqsXd~dDzUV7bbZW5#SwUIw&BA+F@ zP<`R=3DGvWJB41cQ$Kg}cV(RqsrzZ~T+qkpgo|J=3DmzY7_pGiFE#SjxhhriQ)H{@WRCK z%_jUdk3I@pFZ!-j*bF0Qu~gC}qGfR@lF~k7PhT~nI(EM!JnUB1TzqlBI zP73ycOx=3D#<;dm37)QuVXQZ7!LSHh`ahDHCi^SMp z&NQFBRIGmvGG#nb|E+LBX=3DfXf&bxi<Sk&~#D86U%7l5mhreFX4-Dw&%nmY|}4%-I9IV&PO zX4-iXLKZzd;zOWMhz;#drunLOh@y|PO5s*lqvwZ^(68sO`_qf;N&cH2`H%Zx$#|`Y zoVKyVl24Dm@gv6XPheJTf7>!~gLsg=3D8*}~`_lEB;n#Q($G@O5vu6nV-j7`|D3;S3p zrX)7I#U2}YbrSYt%&R-UEZBqTeXR7d&eY?8n9GAbnE5IOyorkMrz1mN=3D%^QJw3@m%KV{fXN4^LSyrmVCIREzNi-&LIKY~cuA;j97|Hh+eLsxC1 zXrvl>;^%n{>sT1L>k9ShaVpPWpMEO=3D#rkv?9w*hO+i#dqpR(2jD%Pj8Q1os7c*UOc z1j}QeD5>=3Dgctm|V=3D-dAK^lLnsZ6DDJp0ik=3DzW*bu40!|H(X zdtE*pjvj8UxbK7U*lkM+q0@X3rRKcL%i^esNTWemb1~oSL(>Scbqn=3DD_IFN$VQ_!7 z_gqu{ys*}Gk}N*)*21xX!V<5Qgc~x zBm8N>iYqmXMT#||7v}>vVxL?fm6bv_gZ$Qa0-&H}4{MZbv{a$U_Dd+bU3q~yqM^ga z9|+;o2&SiYnT#vs2#<4X7wcP~>oDpzZk!`3;d*A=3DJ@(GvC-(t7G7mp4Ds)tGII%2; zPEtxBhq*R~PLsn*uCgRa2br)o1-h`E+uN7Ky*0>3Dircr_U1yI97HgGiN76Du2$hv zYcA7xA>IPzQE0cpM&>dAhat|0%5+rPIqiptlxeH4H|`7M`w{ho+O9bx?_u{E)f>?p z9$74&Zs?6C~A~9@j9I28mnPY*j zj>1ZC)`5j;7JVf-Pa+v>61ve}MoodvzrqWOEENfa`+;s^tzl_;c}225T=3D|D)^%Rmz zJMItobcLLgCdO|L=3D8|K%rtnpS0$w!Y79I&7WIuzq%cqmvdXSv76~VZqFP|T9J&hjqzP#PGR~K{ zLWOe6%M%Hz3soCWAVCojYT;~2)XL-2TnDB&g9r?#?2f~i}P=3Dn44kvS zPwa~D5;DdJP}r(%R16MPX&zc2mEZ&$DGo5xe47dU`gcr91bY4+oExjc$Wv@kn$cmZ z3?*a8i8bM6`@3n_Cc^3q(@dz`qkk)%cx=3DutJPnGl7touu9+h5D|9Ti}HLE*znbd^S zQ3Lao!+B=3DbX>W%Ve_w#aYhy~(#{fI)b`_MTl|Ub2fQNdr@Ub(9TdFb0iquOkCYa7qZAD}<)T{1Je?ad zjxgn-y)C`>f%>oudIwjehe}|`$qnj_ixGQ?9P2|9#Q^qd`BM+h2EIYg%*SfHcZTse zjCz&-F6Z6xFoXv>F9|${foZAzta0cKi~&ZVbTsJS}Is6P%;nVmS9@3H}ij37ru8We4Ph z_-kxWf&E21)JoymE5U=3DfYDA0hq0u5Odq5zbQyx z*Fc<3%+9ZHI;ndH%5({Zvpl}^)`cb_HmTQsnDlHMq!+T3 zjbow(c|?Um$#?RuNRLefeJtKn0=3DH25REot9?@CW(;us>8#ajPq$eBTQh zE`~JP7pE39@dka{1?VZD$Bdgs-r(iC1@*j%EQX|77N^d@n|4!3B<`k;=3De1L;8aD~t zNQNtM114_@Cuy;%6{xuO6F8|AO{pcQ0gK@P=3DzS(Q0Mr-gL@L&pagnI0^{lSYJDP<2 zRW_}#~WWD)d8jieT}&(2n~*cmFA3ExD7-#?!!9|z_d5@7$V$2 z!|lRb60G0+utW`=3DEb@l`OGj(K$23$#dci=3DUmUp<}>zB1Kw`r5CSL(lO%j55hwG{2=3D zWPkl=3DrZmAJCW&YTp?s^~(p%jgkFFxAWujzjfUB)fcK1zrp zfXWnJ&3YU?a((_7l%oRwke}3dH+_yw;mLD)VZCSP#=3DlX1WSnEH>F!ZO!RxZKjc)@k zijzX26sP3xz}8l&=3D#5mpNpDnS{NwTNj)k@KeQvt>B~GoT>&9h<6-LCCK%D17dF>Va z`p1^mUmyzTv6SGcp0yw5!8@p^F@FhWtWEV7SA+7H%wKLp!_4q!(wE$5g=3DdkUCokZ5 z?mk6M@P@aL=3Dlpi4*~F;)eD4Ij^laqoFK-&#-JFkq)wlslfz5(p7Qg7f^isA)G-4N+ zz~E3eiC}rZ6mt=3D;wE`oK@8SqC8K4}=3DlZl(BV!jIDwO_^sX3DurRDn(ky`6Un-o?!e zAFL@zG6VC$c;Vx}xypznO>PEDhx4Tt@Jmz8s7I{sut@l({JnTI`Jq|B);jnKa$Rh{ z#gU3iVb7?kY3GamAdvdwq+<^tpBAbAP&2(G7=3Dszf;GFYbnD3N?kP`|aQ^Rkt0r)nZ zNg)$*FebPG8wWLqp!AQVn|dotjWRWVqlE(nG2#8dFihFB*{O3HVZ0&eqI|lpXg^qh z4$%T8))(h`ybDf=3D34c=3D5&)5+1fHC-L-x&MTyq8j3h)BT8bWbAyebf(eGUOcPHxZ2# zkMm_F(%PPv{k0Gn91Q#{$|T%~o*MJ#VR&BNXjiaDr`BWv5lt}0iTu?2J(Y6<%*zVg zxz^kp@5q(FZ8kuhDo)4ux($=3DccY&oMqB|Q8o-l3s{vCRvLDYlj@je(qnCG?@*_dDI zOe`s-S<)AikA2B7jI6wt0VYX{uFcQz();S7O^|Qa)<*nv23Y?GSMNW75^b)2AGgbo@4xJ_xuML19vTWR|btij6ylf3PosRwM44?#2pA- z*dTa?DOa4CM>!23eyV#1jr652QnGMNZ#I*pF?$@+NCrZ(nPQ-Zxn%qDs+`K)HX(9c zB6DuauqmgyAsN<{g+6Nz=3D0ir{d^pp_-9++UXSP`e$*cZT)C)#Iz`4LYNo5=3DVLeWxL zen_N=3D^WS~cWH&!cB`YIN&O`%&h&fnkj#n&aG>^N>F7X4aU;f_>!ieMtL|eVk$* z@ph3!o@ySq+D9Jwhsc0p|W4yg$&~FW~(_=3DKkM!Kf~M~&HDy(|2p2!Husd&%tOpQ`I~vD+(V8HtCxmn zPHX{;e=3DfD3r{vjAi4XVsV=3DxBvmrLy>3`pEybCin0I0_D6GX|BYk)?FjJxpr9PC_lO-w5y7Bz?u{fC@)l*J@5#6QRjDqWP7++{l%Etc0XygJ7orJbviRbRg%wdOG*tsr z#s6Z(_55Z1)&P1<`R}2_%W7n!PwHO#`tzeQqBHd2KR{Gm++m|7;`9gJd?Z_3It82$ zz1HXtc}$q;o19&x^ou_G^3wbKYxhfLTv}og_G|ikCwZ?tt?cayUriU5sk;S-fpFbJ zdTN=3DvtbJs^r+DVAZRBgYis?1-IP@PvUd@@pStD7Y<#bD8c0SSf<@7Nf>r3C_#Tn-X z77b4i=3DT%&fHpg%wCU|K+i|NzOP1o=3DV<5mvPygUl$qnmM{&A_Z;+YG*BGWfF1ppzLS ziW#(%m$=3DPfKa;^(HUrn60o=3D$eU#F+&EqwjuO7gq%jb-vn+Q&-rdx%X;x%}L;m}311 z7HLpsXTBt#Ai*u1^h`THl+|KlACup;z;69*^+aq!x06eaD(JYpjxC40OrcA0IykMpk>2k@ducB(0MV}{g> zWHZh^M^%tzogq5i65X9F?_hfDS6X9;iY%vvVTr*{alV97GxG^e?BUniGqpRfZxHWWwxMv^4<8SNLgp4k*Px@i6a#5!!kK60iF@lq3F=3Dld$Lo1$?c7@mxuZk zrFL(Nm^mohzG9xRIG<>oV|P~O6yXn1=3DpvIir^?p1b{R*r(#h5f+92-Yw8j{!|4rA6 zHm+T5MeJsl$}T;ecWRBzOj+1IYp3Bx{4cx;Hr0@A>F44HWt7=3DgSs(aE?O$pOAB(g0 zj;)dd;eNw5JJT>7OJdOJk!kF5I}|cC#RX%SiN>C$6xstUG%S&Rq$vbI@30flSSSMLXJs6Xj@Ml){6e5q4~$dgmCMYp0LRXJP$iYzBMwp~5q* zFTP%~{GE-!EDLG)ibFAyvS+*%Mp2|?Fa{9cfP5*%NrGVgD$8LxPA#E#Ngo@gnK1EX zUSc0-@0pbDkis$G>srIt0v}%^qny;pw0_n=3DZ}dThKa6}H%ReKhp-{Gsg}ldzB{SZdh7dChd)MqX0qzfD#!0!V2qOx%F4XQh88cQG`-|@T;#d{l%{^ z{k&J0K6UjgEB|FLEB&jrU+G$Dg3I?SP1x^RdpIi9|H}PJABH2LPh2@+zw7rg;fNag z170RL+uiMVT}X0ir@aTs;1y)WnNynB%!bLDf98JIZyY9^9F4ADrTwnM>;)9t0)4;h zmoeRmf_;S-H2KmD#f#m4)61oAko~UvUS*0ualaDktJl7oxqx~YtnFt^nCon5%yE=3Dg*As{hjOSXg{08 zex*NH9H*F057+M>gkiDg&!t3+RuI3%TR#i2)kJEuUvP6b3x}GVMEK_Y)$1X}_RHFV8+a>*a(Qc0<1uzc~NMCPSJ{ zS@E}DL+Rf2{<)9hv+x|1z=3D3bNl67g~{<*K&(DMCrYY|F^fvo;-?w|XDEE#jQ17)m# zmG;lcl*#V*mmOsK0~05h;J?9yx1LgQ{}@cdr~F1bdC$|!O1gZ1L>A@EWCG?9*iKgs z@rt3c%+@c(UH7&a_xE<1{Qf`LZz24WdldWsv+r+2alkpM-^gXAN?DuZ_cx{kDZYQQ z=3DtdxYq%i49 zR_5UUWy{4(Cd`ST@=3DN<-Hx=3DclNvl(4A7B+jZ(;TF+Ny3 zN}p59LuBMdG1EzP(`*8r`4dP9QM7L>(cmry1$?uF_HSr$dL3pTAKM>I;U#o<_o=3DA1;7FkUQiaW&&$=3Dk^0RDbQoiiomrU&>{}uufkL! zDk{o=3D8LowxW?me2F~7A?mdMZHuBw038@!JoW4yu3OI5H3qwv7U10FAQ+)Z|hK{#3X zFJtV-;HiMu3S>i;EJNCtak}%6mU$Q2P20Jm!|gM|r4x_x@fzs*VBv#M&}j!4Ey$`C z6x0t0ih%s<>N#tnwu%(-UFcHp4t%raf{N3C)J}8Vc(PU&1K=3DKGFb1p?=3D;einqUH5COu zW|K)8-e;QoNHOg!`Us!4$m{O%;SavW-3Y}b2l%j#Vc8wB#0NM zv`UL4GNpB#*bFvs%2!zJc`YN$OVjJ6{o*;gqk3_n{E70>rMHVQr*?+L8P@4O`!Lt5 z=3D*EJ5+1^`|JF9w^hF1tbD5M<53JGx3jN*pOa2;i!Lj&_1yo(q24!(ddeIq~o-g*J0 zl6Kwzp0~ClF1zVMgZhhmd&1@4Wog=3DB?Aq9jyuPSd&%j5;eR14_+Q2W z&nTg+i%K6;_HmZV%GZcYS>@FiE;60)(lTr)vVH*tlKF>Q-J{Uf@P%j;i~d=3DP1uxEK zgIg$17`l|_1H6gfWs6)`Wu9eyL_#V*qsc497hOUaUMGM&BRhzt@>1R|-?y^H)kH-}C;XrBzLlIG zhyJ4F-;PZ7^nIH;tQV45$XJ?m2wa$cneW?hJOlAzIP(v9pQy=3DA9qStm2RBZ!x!|pG z5i^HDXX3jhOT&kDq!;ZcJspo|2VlPjNC#}$q1pL) z0=3D-U_4An%GY$%HtY0AG@<_6i>66_V95Al1{ElwP?z=3DG|t1pZYN9Wd5jr|m)emJ{MkH+bAVOu$WON+5xNUFydC-P z{)utKhhmcG&<3(Yoo&ybT0&q8`GW-Fw2M6t;(g2t%`1(;&DirGJ|y`&3qHuOU7ZI} zi-sJY@v9#)k>b!^rgvxjJ~ zbn&u$ygg7=3Dh?XiK+6kA9g|rwDka!bmCq+B*vo9mShZ_%5wH?%K6^s`v5$%1qjT2at z2@o9aNOH)u3z?p9*K+BF2=3DzwWYN4ON@1SBZWK;;XfHP;`OW1<&1y4M&0Yf+j>2)Jh zs=3DW7)@5nC|$A~Ei+wQPQ7~Bblowq=3DuzWTxXo^~#Rf_%&WCqorw+XlMeV4Z*s?X3wH zJ|X>)Pk4tTAf!Dn-1a|+rrh>^O4$(lBF!%^P8+VnU=3D2Q zU=3DHb~afJ7}j#XEL5B^kg`M$iFef)u4Q?}zA;X)05t7NI)?`J#@X#5v;#?a-W*%dbL z`+#9{#=3DLvv1?~Crc__ou48ziL^y6A@al{bEIz&RWdoVMTY{^LTP_lI(i-YfKZl8iO z{0`;c9EDlkTs5Vb#)p5Ocv5iuh}0)csDWQ}NSxC}7{<3s^Nr)fID)jU7yf{qcGxca zya7Jd(=3D?pFiY@qdJuE+CT>*2SI! zD!BiJS13w)HEelcy|7fVLMMatGz8hk>0Ir5n%q8hl5a7>;?A49prCSlW8r!ww8YfN zIG7fNPO)C$EmX#9%kA!CR@p}ody7%>5!UWV^(_;r-ayen(eQ})eiQ94LPalN*vSl=3D z&9DUw3yUdwHhF0Fs4m%0R|^V(!i6Ayt7MZp*d zIbSZKM*P&R^wjN+Ic$3IRF81D1EX6^yovqbwQ$%vlENE^eC~R`QOE3?=3DYTUKA0vs` zK6B4ki@EQ6p)p;VK*1Ix7WqIH8Ql(4NaTEM0M^YC9cb--EBGz9dnWcp_y!}iA@7@$ z_z}Z5FH+k16Q9f8B645{I>wg6RIH0Skv?vcrcssQ;%a#Yu-KiM3b8RyWK5I*nb-vY zo)|2qxyBr~**%Q6PsXa2;{&+G;m6=3D`2%mL$$=3D!E|G@B^iNDYXf;koBhT++^Ktq3FL z7^iOo9Kl=3D-AdwSz!q~Kv8pI!~%P`yQ1a3AVKpuEQE=3D48Z0X^Y!-tBacwoJAVpC%Yb zbh@Wu;Gmtwqh;w7!%{E&lAGBgh~Wy;vVjq3v1GrYk>4U6K7ISS_oA*mlRt?KFpAiM zBDs>D^XSkN`bZevRTuEJY-g$^oMcj9G6FCoQ63J$0T)HOl7tcvk?DOp!xu3+`wG~+ znE=3D6-P1U?fN3H)1u66i6LJ9vLqs2U-<=3D%x%IcPol5 z$n*u65@qc5Vn`C1fVhM}8g$G4*#}NEKqe2uIU)U>Hhm81+{{`zj722#bAwLSWJ6Kla}%0vr|DQ(1ovDGpKuq1c#7*8`5KzYE~IQcY3)1#ip3_#NIEs zfCAu{6b7|Vxr@F}nCIv0f#J32Ai4%M)zX=3Dp}H9ee`~40k)2g zVuSDL20O0|t2WqtgS}NSki#^Z0ip&t!2%F0k5WF>gr4<2av-mG)}olVj7<}cyk-*o z@9KPa@c4`*_BHo-5jWEuFqGd5kP_zxicIt0UX)TTJ+BnljZ-FK_z(^(!uvGSRB+5s zIi;P?F*RSvPnWIn8hM`Ny-ZRMIlh($Eu$5pM&LI?Y?WL2vjROyoScUKYPwdw+B3dt zC&LGK*6;fZ_>XXk?`Hl`TiIx!XFWd`350P$O1@H{p*i|!)+aua`MrT9&JCyIHn zakOpI5ePey8J&cLUQ2@UC73Pc$7YWH1Fm%1g!G5gy)yj^@Jr}F;RsCUhDnJbbf)J7 z!q8}^KRNjSNQOG_l(QJZiwyssU27kT8`tN(BH>gr|o)^s}PX!u18H) z7&m*#?F;S_P6|`_(+2(zFUHspbdU$66Y4-Cg&1;DOg&4!paZ-g-T`*!Mps`Eetop} zity1LCi@s&y&QI$53Pk znsv%IP!;h%r{EeVJE$Vw@n@E(hBBz}kzoC>S=3D1nhsgHXdJFB8t%7d$!{4Wz=3De(%SN zU_P9Q}%GNIMU~U;56^_rD)^Qn>uQt#;M| z2obX*V)FCaDUvI~GI`Nh-ZTEGb(57QFE~+<0gmn+REeHBCIJdZ()^kjFk$9Gre=3D0A zZ{RZm=3D(ojqI(C?63732h;pxrDaJH0_Lo#Go>@q+46pDaxV>#$`nuiVggyGdoy1;gu ze`C-GZAsW~hKtS8+hiJkZNTjwC=3DLWouML0cY$-lxwLJT_J4w7Mf$~JDqT=3D@+D}HZn z9In7MeO8P#;r!WYb?wI{gQKqLM`FTs#vXlit>g~rUnPH3E0HBD?GgComQ|TI*C6M@ zxAK?g{FO1lljq3*FqyI4R}O!NlGu5kWjfEZ*m*Wb2uD3h7$&^@cVB*XX)z~K;d^t} zAanF^i31YM(-OT@ff=3D|w;&oNy_ zBkdyk1A}%}Mn7ZFQ!Aq%HR$XzbQ8uJR8W8!)w2p>u*~n)@y0yaL);*r3jM#w#f~SA z<3c8@|6B^X#c|wIqf)Xpu~MMd)=3D=3DZ5Z*8rGwzj~u+SgXh;BG^!r7VNbn!qF%}4>4;cBPTk6#J5{!6z#a^oV$La?v~w!7jV6N=3D449yM;c*eyMQ1S3 z*iTETKN_OzZ-O3=3Dph>I<&Ii!k1Gccg|sP7)@KL(@OnIhVqK@^(Moo z-)=3DI5yjn{A*J6IhAPmdlrTi}3b$+u<{}y?obX{econbP&+Gb|ThnDbpX)IS)qhvuc z3TZSNze)Xhct^ULDxWUBUmL~ZqB67*ATX=3D9x|Ce>Npq1LYLR+I$`1?9h5)T6y8H5; zGL9_cysdR!GCZAkPoAHg@zG`7<{$D$>yGr`fSF69f}0~G`Bn!$DBpx11RWU;ofPQ$ zqX29k=3DG_j(VG8&L`YGT15}J}CJuGfPj!Ycf=3Dxu&zMq(^Rl4m;s7~zZ$o99FSjO=3Dc} zX_j2qNISnjlS(C9g=3D77Ru$KXwU5br*?lGh~9I5ctE~I(_p2nmim*A|}n49t%{$v7g zrup=3DjEj7B|<(#$%fr^}doq3M`S~w+Z#;=3D?#3>W^*pKb!PXEEWWNQmJ96LzHTHfi4> zY)@dfbUu`Hkj9MIFx$LN8iy_6ez~HN$S=3DDK%m}Zr5;uPqA8{As0Z%R`sMj+p9%6hL z;6vJJMm?pY!befM?D+@>OVAd3hzk~vQP<$ZR+3mdC#sW7iibEKdhJ6eANuS=3D0zIlP z6eNSN%>ZX7E)BPnl#{Zqw4Ql#LC=3D1DNbC{JofIzbKh`ry`jGa;ZvPptSns)Ca>arN z&5m1Rha})8*`Zi6JNfnsOfHK!TxLi+QB-3$v&Bs7gBLC_pcI=3DVxs?~5v-Vj;mTAU! zTqwEIB(X@&9HGv{;1hIK<~w%SPms+jTwvSlEbM>-Ih@C|nAviBoGm}38z&fJ)K1>v zaEs>Ef0BG2w6Q}JpyGgc$F)JX5(y*~IQ|Q*p`n z`GD^P@I#pictWhzbTYPqesKYb7Jh{4P@2oJ{)+6?fITF{g*_tt$g2?ZvY4)$0U1EP zxG{N`mfpI;Gd9-%%x^4JmF=3DVkkHGB`nE!@U*e@t$8x!Nhcnn1%;*A5uSm{sxiSM5V zFslb9t9U_s7G?SVCGVfIo~5~~?A1BAEz`X9k5aN7FeNT((Wy|_u!lEuPo(50i+0>~ z1BI>Rj`t*DK^&)A%`h@5LizD+ru}>l(t@ebg>Gig8VMo6QG93$60COz9}lITgayn9 zMxc1FCKwHy_E{VY=3DAH7bNGayw#R87nvFrB@V);K|-k@YPzWOE8bF!Ns$9rS!bv#d3 zIlc;=3DsQ2SY5*fE|mzQF0u12o;*Ws5M57AhgxW3Odxj+~8il8y9>N=3D;eQ0@ZDPcg%3 zRxBZ#KL=3D%YQ%;0ZPBqNqCDU4sOtzA;6&{Aj=3DhzBUcuM*ca061M?a|`hV^cngTFz}9gAZdxuA%Bt z_bI3Tg0v88Ta7Ns?Vl-&UkwiGCS%O3C2>7 z&i0|G9&@OeP;kTTZRk3It&m~M>$(XG$i{nK&?E{AK_M(j5B;8QuyU5)kUgQ?a1vUC(MZSQ?(--B?IRS zTmBG5%pC@ZR(EbYFV4GoLHVO1pyC?`vdgRmF~MN-p|<=3D{KEXCo{){uSlL^@!0?~F$ zw8jv1EYSobtSl0ZGb(Dl5Pg{G@&3yxhN$$J?8cm0_v+&LM#g|)kKAy9u`Mb}gkptB zV9QBc?;vW;63X^|lEwC+VY#lA_d6itXYkm&Cj2ZzGj%<}wEa>}rtT{H7yxZ6>KH|h z-nf&x04YkMh67z`}Clcd?bYMM7_}}6M*{mZK zWYdppF`HfnA{(~G{6jW7NG|QfBpW#g%Ji35ZrkOp*dO{z)bxkgP1-U34mhh~ubcge zQsYKfjP4Yci%MNu^dR4leDmNHnHP5pR}Fzm6ThD_X8K?L^MtlzUIxVuw$8ntXHBJ%VZhnuUM3)kfUsrT#1R%Xp}+H zY{{Y-bx)S&3TMungfsc>6#QAST?) zvH+y3W~<58)=3DMX??Ewshxp6!st?lc}0+8+m2{7qwYr6tLBXa%_L>XBP9RWUNG&pcT zuW4z~K{^8s?UKT&6!vaogtQnSOU*I@JTCDX*Zc6y#`O-Abz}p6G+Kol)fjzR zjFC%h%eT8?jV#!cNQdo7q!(;u+HH3C?MWoBdEG6g%$`u{+>=3DPB?Mb9V5eX{gmptB% zNruH$g*yKu)x8)7_I5Oi>}|7A`~uX@HYkZ_Hal#7pnE94ZVVHUaCy)10w>VVP}_VK zTPwCwOva{+e`u{PCdIV#wPX0SC7eX4G>Y>jrwQYYwI+{iB@g+i$u7qmM;W?r6}tF( zgYWHIJAbfxs#$8};R+Kz3MijQTY~AdMQG=3DCjN?`5Q8$g1F@C>t$N1}ieQY4$O%2HP zoo?!X=3D;MPMg7T74>W<`d`z@Or+%TA#k<84<4gP7`CAVIfx;xsmBO2VW1Cuv*U>q9U zShKJrb^1%2D8Zh4qQSL0dTtM1I~eVGZaJ1N?m(M*J)><{{MM@8#m)=3Dv_|W{D(a#Pn zI%;rnrlx68clJelKFhOaLFxAKh9_DeNX(eLr!+fq=3Dbhwl{@G`dMSK*ITV~*{7lL-` zzE#iXL2_Bw{F@m(f77|MHvVFM>Yfh%9UYw0gFs}Mng2pt>b^z6AB?$!e|b~e#lNpV zG7xA>{j%+-2iq=3Dw@N&%V&L1osbowPvUD$TiQwxF{XP?`#AocFLoo&I550)MuS(F-_ zzv}rbKff+8KlS{I8@k8$z4T3pvSa>WzWVfwvxZLofYUD-0-d{q8^?niPr3~Ivz$lJ zAimU=3D+HuuAT{TyYcTG<{52>6M)kAf-510PWg-onXg zoOg3vJ6|!sW6`STL?j=3DW{}Td>HoxuMPqp0pvkx7+ICXn)P7*5)KuFc_XjuLR(kr)qSW8qRnJinZt52+ z2Jp_}zL&lsm4g_tYs3g*Fn<8VaMT^ajdvj7G_3b8Zv73`=3DJ3|ft#7~T_AbYTFzV(9 zH?+ktCENO-JAU{4n}y+{o`ZF~8P@U8Bsu)@IFUoh%E2?@lKoCS9bbLQ)V<9O1bq6( zl43Srle(|_kHO%ElY*!AUQsu`X#Do%^T8F5yggHM)S_n}fU#~p2d}cAc|w_tJ&reA zVDc-sMkD|K*WSIr*HPSu9v@*F90JH8m^cXu$2<}{7%a(>Eg8Zc*%Ii$k!}3ok%V|; z>Btt?k~liYHVNF0Bi!ahb>g&5OKzKXo2I?oroB;b+u%Gq27(=3Du5JAE#Nyz{yU=3D)JD z3FeV-?tgZF$2JEmK$F|vem-Ym{XH|g|JmKy+1c6EE4g0S-iI&zcWiIjE4R15DLKzC zYyF39?`F1lb;b5>9t)NK$|LL@mP35#&>{Zt(pMa!J;El-^(p;GQlBqg5NhR?^7T~Q zBQ+^aXX@d#DNob#mGH4G4V6iiN$Ik#(ug?LX-#t{JVpAv~yej4YYcv0dIdYzv9qUfw}Z)g8t5U73-Fj*<7x zNDtpWy}ka)_WDxosVY5ka%k=3DHb0|{UNc-OO$mZwdufxbIi|yx2_|n>&+vd&K?(&P| zg+yWH#UpL=3DW`!apd&+cKc-*|<=3Da0(2XZU&faj=3DU=3DGV|hh-nBPp-Z*{y+}cyyDB#5M znuUAozd3%|;r(B|JGku2;}7@llvHNkQA0y z(y^o9mXuac2_wDjpALP-@a=3DL?->6HM_GDT%?W*1WZW)1$Z_bQ-XjbR;Qtb`lRvI7p z?#HHHv}5YINnN}rJ-lZkz5A)D64qY-Ed9^LBdeRHhZ;GlTq75c(exUWr)(^I>t+@K=3DZ$tZ7 zy(&|@HC?zbxL{TDmNiDLzJdZ|~gxtSlJ0a8{=3DHY)A12q2N$# z$=3DAE`=3DfiJrNq>G=3D`;)(l+rBGZyjRMWl0MiTzUb0cd|}(eN~OY2>b*&Q{Vb{O+O~;e z;rqLvn3<`$qxHZZrL4+dBu!KvTAxqV4*y9wBip}Od&B4DLu>Jl*5QYz$dakG!+$Or z^{)QzeeyL7xfxti6K`Qp`}fZdYbGTXz9{Fbz4qpfXPlI2d7}0s`(;sQ@jGd`ZH%09 zMyKqO3?_b@DZVta=3DKGoA(~sXTqp{X6)`aGAxpbo8=3Dw*4wNMTo|_(XV8J5;?TpD7;b z2(|c~Oz~T#nbYcJ{o(_e;=3DX-b;yoK5D&9H#=3DqX_r~!sCf|hu2mB08u|aZBxg!knyHb8j$5X7wA@?xTBo$OcVudw32ji-m+W~B z6!%<5>GpKXGllVv5vjPETMixaaQHh0ac!uYOtEt`)NEm1Tk&Ue?`k?|i7l@CO9i&f2uMwe*dhy{)D1YphpTW+1it`SNp7#)LDE?@@0=3DZidWv0>~&_O{l>>1 zkl*1J?|I?M!}dvb7IXxo9W-n;j}(`!HKp|FL#66WUlmiM^-rjznw3O^lshb-+cC_CY>NP!bfxOFT z-z90uZ@)>NLbBhI0*dXU(!t#n%0E=3DN{7KyFB`YjysxOxxZ#Vzuf2fi78!ta}>39pL zCx>uKdgOfBl)NfxdP%-JCO#4g3`bhnb7Af1XWpobJE3o(#2=3DnMt)~T z(*9@F-thBKTcK-EGYV&?hkqp<%yvn1Zhx}&hVbU0t@yZH53(TiFOqJr|4IEf_w5Ty zYHwbDvfMoL1D!R$sJ~k}i%ijvrw$vRWp=3Dbmy~%Ghx}&4!nT-5|LuqfmP5w$|re$AV z9ys1~!`;{Z$iConZ?rE=3D6Y7u&X&4&#ar6uK780^eEj3#+e^BqZj)bzlqqf+ zEw1@?=3D&r}le)+SMG=3D-!)JM3;zdZ;)SF0We-US63I`7U&M{wj8kg;T%d@|u@Fk7SBZ z^_ISspV=3D0E{G@%Xv?5&4PmI>=3DI}kS~X>DsplLg$OYPZYFNi}liwlfMmy#DX$;p-?G1ky7x2`ff|Kj$!T6`ZbBw&!w;VlpQF$pJ}dp} z386#0JyY{&(y5+M6L+dI{*xZ|gt&*@-C46cUGua=3Dg{&!I`E8vw^3`C0}9a@5Df^;v$N&FolyOnUgC=3DQ46d%zZBWWu3XZhu+#D_sTWJr-vVsyWC4thdSds z+$W_%#nz&04Sl)v6m##C*k9KEu9Yyk{YeY{ ze)#0%73ibCJa|8n8nWlTrF_$o#C31scJxj8nABCeCRA6vjGK{My~)kU$z3_0>ZrL- zDk-_YN&UPfuAlJB9Yg)xRT#guwRnr%vZuzo@$&Z5UjM@-_PpA#1GlDY_SZkV#9mih z6BiJcTvvOP-2QIusM(*X`C+nf3Z*}omXp;fC+n-7GTwY=3Dy5{-z`nz{Zc}v3?3gu;L z9!!^R>6A0HPwurcNUOc!6H*1?b~Wtf?kXETCfr|z zzL(6T8sf|;`Af)*8%?t2)ckp5P7NDQGN~lK(oS_e=3Dg8Z%*p>hnbr1X6D}2Ui@C`@FP>w#Rt=3D~pY7N^KD}eM zRMGy9+AsV-Qgt0Q_jhjpVeR%W%JIenr*ounq>InXqpp*z)-Q*DGqp?ZTC(H3d*q`u zoEKZSJ>rj%ZdZgpP_hf^T{nMk;qD!)Zfz*A@z5Mq@@1#9vtMo>;jITC%667%B~f!mp2cE z2^mX0E_Xz+{i7Wt(}rh6>p2z+|{wC z-Gz5alJ&pkVPBTsFIhgxk}`|!dnG-Vq_5v4qs`LHU!BT(uXumLmvm$ldV6W+j&~jT zeVCD_KUqokc1OD?PlF@V9!RmV9i6iConEr#K&G9R>{cY(yeZzM?4InM>|S_=3Dls(_m zzAKCsI(A$i$&IZv^P2L$ggbD&KP~rdK28>O6z?d_oFaQ9!`3Y)bhI4UEWg1?vYwMM zWW2-48c$0yxp|l49hCMVji4ZH zV~v-_P;SvKwA1j5$3i3A(JqUm5$u@On`FtUm^OS%TuVEpS=3D>nVkIF_ub8)ivq0_SC z`kk53M3)@e_@VP%7k+$o$Fxh6!p5Yq`=3D!H@H`MJDaba>jOi$8}$LSr{k4ZZ^C3)W=3D zuQ`Z6dUw1tuQ7htE8_2UuP1)%E8_p=3Db;UOyiq{A0Kj}%F9Qj^qz$=3D*~Jw^@OAE$TB zYzYUu<9a7w?40=3D-sZ>s-NiOl`$ zP)d--!Z@ec=3D_DB*8Fq=3DG`MY35Cb>hFjLeRRjjw2kpW%fm!*ne5jEv!wiVQhp@m zUv<>w9pTt_9G_{ItrVBbv4rE=3DBI{l_D{P}p;tzIChuW)t{pTyZeUsW;`nH!9$Vrp! zUN4nXnCRWp{+#?wb6hopv%)^T&@pm;$H?aCr8D=3D+i3sb*!#{a{Ga|b=3Da%yJecc!=3D6 z^Hu&VIkvOp{X_gc-16YiTKu`(6Xbo)thVB#GAe)LXwAV_Hp4F++gkfaN6V`X+47Ie z*(Lvq=3Dg;PjuUMw^SC3`lB#(xZ98T_tRAKy>Dot%isO$Ed!W)HNX$`^Sub6-r?$OC`p=3Dtt$ZpIk3*R^)B^59FC3JezhFpSr=3DxlY_L+M-FXur2X5q z+jmQI2w&{{XED?A%usD-@fQ+5w(nBOknw-`Jbv<_?R6G^7QgdZB#Y$*e`fB}@~KA35FAk;#>EsWpd^^fIPo*A#}+%a!qy7Y~7&9mv2duxaPRUTaI zc}E{xyZw9eDP8cc6sCWV(s>$rSN*U@0gfz`2&RVh}3*=3DfOYsw%7g8j_t#s~ z;kD2^GjajQz)~*XrYTFLi60kEkTmhqJ+1##bA!C#7?%ub&C|mV5s$2pCfIpnXnGwx zI^;V6+(|O@3hA5VCD)f93AZzODlK+O%RTKWX=3Dg$2dpO@Da z;p5oh177(ypYTk1;Qp{;rsWoSX1FD+_qohm`8mY9!gI_1j=3Dv5+v0S`s|L0_=3DQk|+b zP_2RgvNdp(x=3DM{-F8@v&Un&0{J)V(&j~Tz{Cm>)iC4`WKS4g7GCuvPcZ^TH>Yd|i#i~nI zuDR^e))lRnw61Jj)w)`~OnGVRW%B!g9$#>>JoB%WFD_jvUt)TH>-$=3D-XubS{Yp;CY z74N@Xdb$}M-~BIJrPUp;)><@=3D?_#XI6oRE<|gY!q{ndZJxP8Y%RT9xq#c^GlJzF$ zBk8)clk^xy=3DOpP-oWMHb47wMS^=3DAAsQP(Hdorw*J?xsXfdeA3nP5sufeBxV4zM=3Di? zWPSZilAro4wj|nz65WG|6Qs?&LNv>gi-XOMBT_ zZa+^X`HJ>BV~Dg%+V2e7!HRNwDDPiyvfkiGqBe>C{=3D_k?`xyDf#2Mu{_IHr>p?i|$ zEBX@$?@RPJ%Kkg9uL;_%9Zc3sp~)p_hhyk*#g=3D6G7{{6Vy(F#ji4l(Cj6#w>h!IYp zp`X~v^`LO@!%1A-e@|S2p(agcf)#R;tAe3*|X z>zO+fcanBE%6dD?*D3k>6ReMQjZIdR3V z#5$aT>K|Fo`iAsQRR5GLA4FeHe=3D*4)!#cLJ69*~Z;wXAdQLhFkxGojPHv?1XaO`u* zb~VRqag6gbfipOtb+`ftG4;))oVq&_SCsvmBt7`Q*v{W3PN4rh%cI;+uS0(; z>){yfY6j`LuP4h_+{Svi6Gt)SlI1IIN%T017B%HL)c=3DyKKZ;|NQ@1IQV4Z*wcw-f8xY5i569Ls@6cY2C6kst$}I{RBPZry#_k68#fN5 zwhZJp_RL7|QPo3g!qL-~REL%HtxL)l#SK>sozpjPc701@OLuQ`_ri5e>zbMt_0C_{m+#%!wSMUAhI8uW|0F1%&4uze z_O08nCC(Y_?wh~0dEswsqf*q`g^g#|om1a*PGeF7`COqpU&v*L=3DJ)mFD-SulwL3eQ z?@Oxa&|Y1W-BegN(3R^MVsCR@a@gGixooo2QZwCG_w}#;ZSD5Pf%US_jprt9sAo~Op|PQ{rLlM2qB^PRhJ{Uw7Sz@Cv}6}8 zTDPvTw|m`uIg*M!&gbTD8tCC@4y*fYch{zndwBB*?Vx+G&=3D;>h|2N%qVcpv94cYFi zKjU>x(9l)@2%UKoPA04 z4-IV0rn>T}&3(Ci@0PV(L5mkBeXdf^O*y>C?yij+vpp%ZGCNe*m|wiO(7z?uH8^Lk zNy#?4`ctMomour&T^kG8RoQ%IVEy`RPO=3D7a`3>1zHta$FKWlZaCy?tIj1$eNn3h1U zzAjGG*C#Z@c?*(6V?vYAor~A&&c%zmb79e7*ZNTB;XI~teS^{}Qr)=3D*;qV2okh^bxPiQv>SNZJoFO|M3^Sv@p$b9SzFO|-a`Fxo#mpLbMB>BHD z{*BB|<{!xXbD2Z_2`|1>nj`ZPnLi-&kjx*GIV?NU{Fkz9m(1UldBw`*tJ{~ZPA^}! z_R{q7Ol$bGv~|s@_O`W4u2_57%Jk}XNvvGkxxB5tvo&+U@|B&kXm#t7OnZ9Ss?{sk zB(WE?uU^`5SXmdhU$LsAwQc!jYgesqU3zhc6ud%eIKAwG|D_% zqn7o{2Kqa@hOX{fw=3DtXUmy0@A7|bupWxK8(9O&!MFBvHG_pA(;dAeUNroNu#gWzkWqHfJ5bXt?TZ|_O@>9Ti+k{Y-zZOc6N2k)t`+&uj<>> z^Rm!Or6VfHF@GrD(9(had~V>dUGKPdFq@N3Z6KHKzbZMJP|X*Fb{zLKOQoWywf6G3 z=3Du%m6Ah)crX`RG|&M7q@{oz1wYF()4q15~9=3DA|0zTAHq$Y+?Q6iyE4mu6!L=3D$?Dv- z7vu&ut=3DcGOGTz_84c87yt!_+(n?!bKC_9weB;zFMDD$ZeU7MwI?!PuA!_Xl)HPUNl zQ^~n%YDnb=3DQVSbXL)rZ4o4e=3Dt4fG8xP7TEEMEZHoOu1hqv7EXu|fr?TDB z0~Y#+x_Yyz!CY4EkUf2&#m^a9DD5Q4RS}7D>ht}(r&usHov~yOa^lU>vJ+JPQ@#& zkq4b#x#oIOOS00c`UY~Tcsv_!$pi7TLl^tf-PIqOp6svOTKgnG?(Ds?dZ>~7wdeE=3D zt>rk@=3DB2^KpOgD~Uba6tuqB&2d!YC1{FZ^Mv)7)ToUWn5;Ghfv!fM&Aa{2a!o*=3DY% zsff6(%f_<(p+DdhwAo9zmZJ^#KFQau?5Pli%z*+r$&l`?OX`NJ}Q zOy*C^e3Q&K%Y3`c=3DgEAJ%s-KNzsyHnTq>O)bI5<2_%4|nWIkW!i)6l3=3DCJHY^Ez49 zFY||FKI}gE|L~rh++XETU(w5z`=3DPMx@F}IN59v8`m6~!%sdS>u>t!C2d9Td#SC&dz z=3D1jv^0q+l6{$<0UJdKE&4EB6O^xH{5J=3D-@qQXfWH|*Bd(h zP1#KYxoeZL#!#wfAifQ;!T+rL&dU#Zams{S;o5=3DT#f#5deg2%esrSh9Y@t6d&!RjH zhdZL&Pd=3D3WZQhD{!;mp`&4MNwDs*iMPdRm4dDx8Kt}I@B=3D)Kz}IXhCB2UnK+xU4+M z0JMJcfr<=3DHCX1SUc(dT&SKzN52mjiwElwTVHxS?G>$Yy%)EAERsZYzFdHNrv(i)k& zW!@$8S$|q8y;tVtGJj6y=3DVkuLpOs2qlleKB>pmlWtjxE6r_BH16)59@n$c3}nlF?}({Ro|${0rG)iQ_Ab#-<1bq#e3 z>Kf~s>K4{5s%x%msjsWAuWzVdP~TYJRKKu(QGIiLOG8~leM3XT0(sTl)UdE&QA2Y> z%YwQE^$QvnELhOEplQLv1&bCmFKB73Ypj>I;R_lY8=3DD#z%2P>mV@p$AQ+-oI(}JeP zrlux&JKogX)UvQ{Vg15}g$ouoE^J!3aN(kb%?n!=3D)h()D)Uas5qQ*r{@+`AxQS+jf z=3DDOzk=3D7#14&5g}X%?q0sH8(f6w8$>D$mZos98yq=3DtRz`m=3DN&s|&ardn$w)q*&u$vb zhi8@09=3D7z!Eu`EU4qG;~p|3Ze+L)DpCS9elE}!e_u2>=3D4A6{XsE#!Nf7pMBevrKB; zwc)8HJlw>~QftnN-&4vLb$aE#wLxAEUKO5%<$P3*-zw9xN<5|H*G7g9uUtMgWFMSf z?K!qGzMM``etZj#pZ=3D03!PL+|A=3DjNvo(rXR!pqB)+>&|*$8*-ttS;+|x zw+DwH@;)~!r&La}98tHtvd(3DHuVja$0FsC%3-TXdrV%395y=3DLB(He-2IY0NR7%(> znabxSNxd>%&M%MiUv2$E?IL+DSUebikxUw^)b-+H%f(f#)ki^H|5+vJ4gBBxn=3DuyQ#swDBK(V)c$9ePypH>62CYBXpu zLWdqz{G+}Sj~WeHjL@M+bu{&d8Vy>E(4j|l4DqPZpv4FsdQ{E(4j~5 z2I5hpL5mSO^r+%*=3D92BBMuQe3bm&pNk?o^KgBBxn=3DusU2g7k7^e2sL`Os2pxJq4)Lhbpv4FsdQ@|XM~wz8M(EI^dJpla z(V)c$9ePw}5sw-TT8z-4M>UUl)M(IRgbqEbvx!HI1}#SD(4#tsc+_anVuTJos`2g7kE)q?)M(IRgbqEb7UEH( zL5mSO^r#jSj~WeHjL@M+buRI!(V)c$9ePyf5sw-TT8z-4NA+IfQKLbN5jym!&L8nhUpLyt-mj~WeHjL@M+)v9EY`#)+lXfZ;E9@P@!QKLbN z5jym!mJ*K|4O)!Qp-0t5JZdy(F+ztPRXg#h(V)c$9ePw35RV!ST8z-4M|C0bsL`Os z2pxJ<9mJzXgBBxn=3DuxGKM~wz8M(EI^x`=3DqxXwYJW4n3-iiARkFEk@|jqskDE8Vy>E z(4j}wNjz#aXfZ;E9@R49QKLbN5jym!mJ^Q}4O)!Qp+~iXc+_anVuTJos!NDRjRq}7 z=3D+L8DNjz#aXfZ;E9@Q%1QKLbN5jym!RuhjJ4O)!Qp+~ibc+_anVuTJos!NGSjRq}7 z=3D+L9OjCj;&&|-uRJ*vxzM~wz8M(EI^x`KGrXwYJW4n3;(5sw-TT8z-4NA-TE(4j|l4e_Yapv4FsdQ>^$QKLbN5jym!hKNUv1}#SD(4)!| zj~WeHjL@M+RUjTU8nhUpLyu}R@u<MXwYJW z4n3+J#G^)o79(`%QGJ|v)M(IRgbqEbPY{n94O)!Qp+~ioc+_anVuTJos!tM+8Vy>E z(4j~52gIXBgBBxn=3Du!P4@u<r| z8Vy>E(4j~5mr5qN|D#5O79(`%QGJ$p)M(IRgbqEbzakzr8nhUpLyzin#G^)o79(`% zQT;XXsL`Os2pxJ2g7kLo7kQKLbN5jym!{ulA6(V)c$ z9ePxMOFU{cXfZ;E9@XcGM~wz8M(EI^`a9xLqd|)iI`pXio_N$~&|-uRJ*xjrJZdy( zF+ztP)fb3IjRq}7=3D+L7YB_1^zv>2g7kLn+YM~wz8M(EI^`ai^@MuQe3bm&q2Bk`!w zpv4FsdQ|^JJZdy(F+ztP)jt!D8Vy>E(4j~5MdDGTL5mSO^r&to9yJ=3DY7@A|5pwv>2g7kLt_Bqeg=3DkBXsCdeT8_`XwYJW4n3-`5|0`UT8z-4NA)%0 zQKLbN5jym!zD_)9G-xqGhaT0x5RV!ST8z-4N9Bk|jRq}7=3D+L9utz?q>KWa2+F+ztP z)h)!MMuQe3bm&ptN<3;bXfZ;E9@TBcqeg=3DkBXsCdeS>(^XwYJW4n3;diARkFEk@|j zquN6}YBXpuLWdsJUgA-sL5mSO^r*f`JZdy(F+ztP)g8p6MuQe3bm&oii+I#%&|-uR zJ*saLj~WeHjL@M+^&R3-qd|)iI`pXSBpx*yv>2g7kLtU`qeg=3DkBXsCdjS-I;4O)!Q zp+|KW@u<E(4j~5J>pTLL5mSO^r*g1JZdy(F+ztP)jh2;)M(IR zgbqEb9}@u<E(4j~59Py~ppv4FsdQ{I7j~WeHjL@M+^#bvz(V)c$9ePwR5|0`UT8z-4NA*kM zQKLbN5jym!enmWLG-xqGhaS~S#G^)o79(`%QI&{CjRq}7=3D+MXVWqWm8C`6{?Qrlu{ zqq_>eSAMZyi(o1G1@v~U}J!06;)Vq`X zayjoJT`uSBigaZ;=3DTJ^#MLCNr;#w=3DxmE|;0PDe#K%PQj5RHQ4*Sx7k_s3>P$MOnqZginG39@TxbpQ- zx!!Wt6XL0+LUV?Vb1LI5m)y6?T$%qq$!n4M`)v1(@;OXDCOsuds)s9s^!oF!|-}S@NGHzg$0x1UHh4JEHyt7WOvwx9=3DELtv z&g(nmbC_nFo}}NBBvm-C;ka*Py|jLLG%^MxBi<|5HBy zWy|-OgUbmlFRwc@iJ!3`(PGCL+v1QF1a`@dB3u)d`Ku*A)XS$?|4P=3DME*EAvr^_qu zulxkWLb@DF>nKFG)b~d#CpAa9;N0>gzc)UAFs&HPzb$H?Y z-)uV*#D{A%OrZ^iX=3D+_kZsqvs&E$t|he?JP@pMYX`sMq=3DS>%_moAUVRJo3Xi4^t}s zSE-B04}D3Pbo{SUlZ}rqW&O(W(G`{XjE}P1N7hnqK@9ah#`^W-*VHG+Uv5`(7+)-B z`8858p)FMA=3DOjPeujUfp!20heU2YGRaqA{2ubc8J?~8ZIeKEA_%KW<}KOE2Rv%g(z zKlBer%D+hR!?~|go5Rk^)zoz}>Fa#K>j z;ocOc2GZrY4C%Kgi&ZQAUir9Bll-tBmHDSnk{|AuM_T{PN%G$%`JwNrEMJD5@&2!` z*#BYD?~vtTiYkuh%dc`gbrKVft#W%>@=3DiWNerQV}e=3DFB*c)ki#IG>?Us>~1PbI}p< z!#(Xt<;<4+&|igfb@+4-$05x;p6(-EUhjU=3D;o1(zZM@ihGqLWD z#4{Eq?WEjazngUE%fj?b#dGiz73p~u>(^JLe@6XXkrbyI;1j3j2OVkDNQ=3D`>0!E* zbb0?O_Qe@J{7gNJE|`&6j&Fg+x5xVA=3DFFD0MDG*+?Qhe^*)7ON@e zCC70->A{Nkik16y6YH1rE7KHHrCI~k8mQJlwFas+P_2P#4g81Iz}LbcXnfk&QbKLb z%)wHr^u*gHo-R#Sy}M?pkKg}s_wli>D&>^Cn4T#8OL$xKB{i{4ZQB<qIB|B{v9+6GBYm-&sgb+sucA7;pWYVB#^d%3KP zalceoQ{#4pv0MG!wRQVzYaXa=3D*!}pd;m1=3DS-Tjp?bo$;SyOh}`o0f6#u$x+(CI3A9 v?5(n-I#p|+S_9P@sMbKW2C6kst$}I{RBNDG1JxR+) +# +# 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..079861ed77 100644 --- a/tests/functional/x86_64/meson.build +++ b/tests/functional/x86_64/meson.build @@ -18,6 +18,7 @@ tests_x86_64_system_quick =3D [ 'pc_cpu_hotplug_props', 'virtio_version', 'vmstate', + 'vm_launch_update', ] =20 # The address-sanitizer makes mlock() a no-op because it 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..247f9ea389 --- /dev/null +++ b/tests/qtest/launchupdate-test.c @@ -0,0 +1,408 @@ +/* + * 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 confidential; + +static void test_vm_launch_update_capability(void) +{ + QFWCFG *fw_cfg; + QTestState *s; + VMLaunchUpdate launch_update; + size_t filesize; + uint64_t capabilities; + + 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; + + 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; + + /* guest not started with IGVM */ + 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 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[] =3D "Hello world!"; + const char exp_out2[] =3D "Test succeeded!"; + const char exp_out3[] =3D "boot process complete with initial igvm"; + const char *snp, *cgs; + uint64_t gaddr; + size_t igvm_sz; + size_t filesize; + QFWCFG *fw_cfg; + QOSState *qs; + VMLaunchUpdate launch_update; + + 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"; /* + * this prints 'hello wor= ld' + * on console + */ + 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 ""; + } + + if (!g_file_test(igvm_f, G_FILE_TEST_EXISTS)) { + g_test_skip("igvm file bundle 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 qtest_pc_boot("-machine q35,igvm-cfg=3Digvm0,%s -m 1G -accel kv= m " + "-device vm-launch-update " + "-chardev file,id=3Dserial0,path=3D%s " + "-serial chardev:serial0 " + "-object igvm-cfg,id=3Digvm0,file=3D%s %s", + cgs, 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); + 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 VM_LAUNCHUPDATE_CTL_HOST_IGVM control */ + 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); + + 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, "i386") && strcmp(arch, "x86_64")) { + g_printerr("vmlaunchupdate tests are only available on x86\n"); + exit(EXIT_FAILURE); + } + + 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); + + if (getenv("LAUNCHUPDATE_DEBUG")) { + debug =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 56ff860e21..5c7883b48a 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 Sat Jul 25 20:47:29 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=1783997263; cv=none; d=zohomail.com; s=zohoarc; b=KPhAxRwW/mYo1e4ppbAumcOvsXqcNMGIagXpY/lg+t7PNWpGktuQbcBD9Qqa7aweJqZV/y09HOa6r9znzjPFn0oHDm1q8wd1FlflSEekk/Dleha6J9kvHqjV266WGzzJXVjUiYbNKO7lx40xfAzImyqSgo9eaMrsMdsrCnL8mOg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783997263; 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=l1ehNsRYSWhnJLSMyFUakhUmUXHYh8MaiUNq0NwGhXQ=; b=Y19/uVABGF2nUf4kvh2gjJFRafD8J1reJgbbjQELZA7a3DR8yinL28/VPhHZ3w9C4VTP5wyGbssi4S92ibNmNyLhC9i7Fo4/K5hUqgUnpfIT4rgZqJH3mPc5ANiP1Ewjozh4jVorusto/skO8dDz+UYWCOmyGsT9Cc6YllSyKos= 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 1783997263271633.2421327053555; Mon, 13 Jul 2026 19:47:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjTAS-0008RA-1T; Mon, 13 Jul 2026 22:46:44 -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 1wjTAP-0008QS-5C for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:41 -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 1wjTAN-0006cq-Ka for qemu-devel@nongnu.org; Mon, 13 Jul 2026 22:46:40 -0400 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-553-Ozazf7R4OQusPG_MWQP4TA-1; Mon, 13 Jul 2026 22:46:35 -0400 Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-ca8409ba0easo464026a12.1 for ; Mon, 13 Jul 2026 19:46:35 -0700 (PDT) Received: from rhel9-box.lan ([223.236.229.143]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-13b924258a2sm60184658c88.1.2026.07.13.19.46.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:46:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1783997199; 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=l1ehNsRYSWhnJLSMyFUakhUmUXHYh8MaiUNq0NwGhXQ=; b=JyPSOHLcq3hYy3GxehyY4SrDT355zUv6+QtUbjFGwYq90jx0U2IUN/2/Ql7G0gwbKb7RFu SQiXTtJ4JThhQaaciMD+icvAMocNm8/y9yxBgwAmyLpMO/j8EdQugSmp1W5Ovccb4W4T/f KR9NBLuMV1+sH6Dfuf1F9MisY7e2Zeg= X-MC-Unique: Ozazf7R4OQusPG_MWQP4TA-1 X-Mimecast-MFC-AGG-ID: Ozazf7R4OQusPG_MWQP4TA_1783997194 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1783997194; x=1784601994; 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=l1ehNsRYSWhnJLSMyFUakhUmUXHYh8MaiUNq0NwGhXQ=; b=jyG5tHBdDtCA2+wMdCbXMBJh6wbX/x0wj1rD9tKnZFBVL6MXrKFtLXGOiuphkxRNqz 5ZDcOVKT903smQPKU3mdZxwqnitYb8FH23LAalGmLGsmx/E9GKKzhQ816Gv3Tf0HSgYs VVAFfPxdrAxIHurFoJun7Ve9+gluv1+EuzEhYyJy4JdHxE49fNhrX/oT99h1GzbllNG7 IMkiznbt+5XdLZ5SnoE8K5zQUa2pVqklnGxicmQFgF10thiCl77hTeXWmHeIBhjgQR+p 5Ep67gKqSVPHJrSW8p6sSSY2JV1QsS7lckYs9KjGhrmBzsmLbWE4kbPZejFW/XJF2rp/ Xd2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783997194; x=1784601994; 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=l1ehNsRYSWhnJLSMyFUakhUmUXHYh8MaiUNq0NwGhXQ=; b=prUQi8IkyodhI4BiWOPLDRxtXJ7ZFRqqPGNG42DbzFRfbPDSi2BAxC5f64dZR4MH2i qvRyiErDo/6MQqmReE8GebaVsiXVsqMXELjEOJYVVfHO/e7Nm+jGSoDMKf5r5VNCqS+I t7JrwuCUnH+4/0sW9x0q9N52ddJaD7bTpFe0LZwBXMIvKTsUR98OmAgqUudemc7h6J83 TbEupMLex/JkdKw5Lpq85wEbWpCaURoUGctJHrEym248E/nvL41q3RVn1HyrQPB+/4aW MxB0ksiwg71iWNCCBw6FQ0YOaHYdNGDjgukIZUxJWXdWkDTZtGUhaZTKXsgI/ilPbwlH 4h8Q== X-Forwarded-Encrypted: i=1; AHgh+RpHdzZkUu/A0EFp8wmQNDOMmlbxCiwh4punn2VowAGce7bKkUEDya+Mm6zV4YsC2YTH9PURQtBQBfxk@nongnu.org X-Gm-Message-State: AOJu0YzR/QuejuZ3Ik2MEmhSsXt93s2SM7AWBg7mBdI4LVf2ks4wS8SG 47TImmmbtf1Qi653ZROeutgG9Kmw1rKmOb6QT5DaSRVSvYq9ZrYNx7JzypTSHH0DeEFqTjkgci4 R6fTj5tavioSZXWS22aKkQJKLx1gdf5Sbhafehm322oVqZdl3J3hsRWfh X-Gm-Gg: AfdE7cl+bIWwsHr6HgHr7vV+2iU95TtFCUTou3DpFO9p0QAipIxJcX97NEfMiwhiUkH vdxmD6zg3XuKGn0WKxW+6jhBmNOT3Q0up5eC6HHdDeYjvHKfoox1Ks5If7+9an/WDArq+++h96U C4kq7Th2KgnkAmA4lGKeAOvHXFwZ7kIC/ALAtngzcs++IHa59qs7otBluCt0ehaC9prpr/Vr/U8 6slxkjbGf47hr4Qfb8uxJO6xdd/9TDy6PBeJRbjncCXiog9YR8F2rklGNDGJ17C60VAJaNfRTQE 5He6Uz8UnZMB0V4Bu49fDY1EzvXA5d+NGp52ncRCXTI+SQL+uYQEd5cM8W858LHstzyo99OOk7r 4yWvE2ItrXg2FY/dIKb+rxrD7QfcReHKH1m7rePPW5IiYfw== X-Received: by 2002:a05:6a21:1404:b0:3b4:731e:6fad with SMTP id adf61e73a8af0-3c0f094035emr17175332637.16.1783997194121; Mon, 13 Jul 2026 19:46:34 -0700 (PDT) X-Received: by 2002:a05:6a21:1404:b0:3b4:731e:6fad with SMTP id adf61e73a8af0-3c0f094035emr17175295637.16.1783997193671; Mon, 13 Jul 2026 19:46:33 -0700 (PDT) From: Ani Sinha To: Cc: Ani Sinha , qemu-devel@nongnu.org Subject: [PATCH v2 9/9] Update MAINTAINERS Date: Tue, 14 Jul 2026 08:15:28 +0530 Message-ID: <20260714024557.204578-10-anisinha@redhat.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20260714024557.204578-1-anisinha@redhat.com> References: <20260714024557.204578-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: permerror client-ip=170.10.129.124; envelope-from=anisinha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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.01, SPF_HELO_PASS=-0.001, T_SPF_PERMERROR=0.01 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: 1783997264457158500 Add maintainers for vm-launch-update device and associated documentation and test code. Signed-off-by: Ani Sinha --- MAINTAINERS | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 6171cc7494..c51eea98b6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2826,6 +2826,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