From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail05.groups.io (mail05.groups.io [45.79.224.7]) by spool.mail.gandi.net (Postfix) with ESMTPS id E2628D811D5 for ; Mon, 20 May 2024 18:16:37 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=UTaZ4WiZElg9yzZkDenWByCWKKADTQnGgcs8OgJqQME=; c=relaxed/simple; d=groups.io; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From:In-Reply-To:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Resent-From:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type:Content-Language; s=20240206; t=1716228996; v=1; b=zEBe51BHlQQLP1OTPFpPZzEysrVUP8wbFn1pS+ALv4HN/g57PlnZxFvgsXCDV8r1fiMXucT2 Eehblf5eGYrbVBWE1w9Zz+Y/SzJNfjfFL488v/La9C9uIT6RPsKUdTu3jHJBlQAXuV6KXnRdZjH JFtdWKrRShHlGAMsTjhnU3LkKJJiAQRlrViSNT3pYX5QHdkg2MfPE7r7MDrEjSXI6JNoyGhYZbd qzNNxM8IlfVK6wErbSbRr9rUkFUskOnvWdfUyV+hZfUxow+HtTn4H5vSaQSSYW3bQdJCOPjc0it L+KF9MEPXNpb5qo7dEg4EXefHS7ln/ULOU1IsLIm8l63Q== X-Received: by 127.0.0.2 with SMTP id pGk3YY7687511xuNaINUA4ib; Mon, 20 May 2024 11:16:36 -0700 X-Received: from NAM12-MW2-obe.outbound.protection.outlook.com (NAM12-MW2-obe.outbound.protection.outlook.com [40.92.23.29]) by mx.groups.io with SMTP id smtpd.web11.3877.1716228994189182244 for ; Mon, 20 May 2024 11:16:34 -0700 X-Received: from BY3PR19MB4900.namprd19.prod.outlook.com (2603:10b6:a03:354::11) by SA3PR19MB7542.namprd19.prod.outlook.com (2603:10b6:806:320::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.36; Mon, 20 May 2024 18:16:31 +0000 X-Received: from BY3PR19MB4900.namprd19.prod.outlook.com ([fe80::d8e4:8074:60ee:d3e9]) by BY3PR19MB4900.namprd19.prod.outlook.com ([fe80::d8e4:8074:60ee:d3e9%5]) with mapi id 15.20.7587.028; Mon, 20 May 2024 18:16:31 +0000 Message-ID: Date: Mon, 20 May 2024 11:16:30 -0700 User-Agent: Mozilla Thunderbird Subject: Re: [edk2-devel] [PATCH 0/9] Allocate and unblock variable runtime cache buffer in PEI To: devel@edk2.groups.io, dun.tan@intel.com Cc: Ray Ni , Liming Gao , Jiaxin Wu , Ard Biesheuvel , Leif Lindholm , Sami Mujawar , Gerd Hoffmann , Andrew Fish , Jiewen Yao References: <20240517094917.513-1-dun.tan@intel.com> From: "Sean" In-Reply-To: <20240517094917.513-1-dun.tan@intel.com> X-TMN: [5aGA/xfT5OM0omNyF64dvhxLqvNntpSIipa6JKYXXRkLasXBgKKPPjjo7C/zL33C] X-ClientProxiedBy: MW4PR03CA0215.namprd03.prod.outlook.com (2603:10b6:303:b9::10) To BY3PR19MB4900.namprd19.prod.outlook.com (2603:10b6:a03:354::11) X-Microsoft-Original-Message-ID: <50a89465-c518-4b8b-acae-05069d969aba@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BY3PR19MB4900:EE_|SA3PR19MB7542:EE_ X-MS-Office365-Filtering-Correlation-Id: 73ff6af5-e2a2-4a42-d67b-08dc78f8f91c X-Microsoft-Antispam-Message-Info: VFPbBkM4W2MjoZ5pzDvivtC04pDxPA9YIR+l/EgBD51/GLev5/wuC4rc0bd/+khxCYU+Ntzy+99T1aplGSiasC1qGsXA3BShHLloCtnsRZzzXzPxt3w+mXk34Qo243koNAQl+aI9yJNX10MpptyGdYfcWz4O5wgrsl6L9C97ei/15VxGkf3krrl+2yBgCoiOh3pd/xDOFvJHO2whD4lxkP+1utJPfZRCfqlCS7RW7yyM6XVOK14Kv42C+18AF13FD06WuyE9cXz6edpnwOi0gBHfPAdn5tmcoadSK5t6OPiJrB02V1lCjCNTwkSo653GyVHRJtWRC/6qiMHJmiSeeWEi6yYYSPx9fPeV+gxGqepZOITDvXRhrGowB0Miud3NuVDZz+TwC4lIhQfYeP3UioAzNTl6b/9Xh73IY8lkFMmIsKoKIh/AUENDHrEHuKsRblB/6Deg0By0ql6L6tTSGhHwoqyUURCtVRnFXrPUwYhIHM45AqJ1IMHi4DhqXcCiYQTyJcO1UYH3d6DF4v52OhbVjmuw7ejqMUrC32J03AUddF2enaxoO+NC7MHL5qVgVQgm3SXrU5N6ko5rTNjanVUPnGhX2IqO3cYM3zZZRFSpRc+qkamMEQxl2MVEgxbuiGi6IeBd5VnzxFy3lUTgqsF6ND8ZjJ2mGRK2IXr4SvVvzLcRy372CvKb9HSmg63TvH7GxoSvTAX486u8ehAE6A== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Y3NqTDRNZ3htWXJTZmJLUjl1VGxDak55RWF4MStUeFZYYVRPSHZZa0pHYzBl?= =?utf-8?B?STZxdzZDdVZkVG0zeG00ajF1VlgvUmFrMy9hSmRGdEJhZVMzdW0ycFJxcUFG?= =?utf-8?B?VWYyd3RxV0hRZys0OWdESUZicXNEQmVvNXVaWFVZWStZcnNNTXR0K1dHYTVU?= =?utf-8?B?eWoxQ3MrR0kva3lINFYvZmN3aVYvSzlvc0R2cE51VWJWU3BwaDlVRVdkb0Nj?= =?utf-8?B?czVvNGc5R1FIS0RWZ2JtYnVrR0xyWjdGY1pUSVdRck5MRXcvOElZR2NxM05j?= =?utf-8?B?cUR4dXhvK1AwNXFhM2l3Wk84cjFzSkNlZG5uZjJQMjIyNVFncTc0NzFsMkxR?= =?utf-8?B?TVZBQjYyZEFNaERZaklYU2JxcUE0TnFLekxpS0V4dFd2cSsyZ1FiVGlZNTFR?= =?utf-8?B?S1B1ZjZPR2d4WjNoeGFvOVZXUWZ4aDQxbmR0eG1LRndQSHl0M1B0cytyV1NE?= =?utf-8?B?Z3VITFNUMFR6d0J1T3FsZWZwSDFvMEdsWFh1TWRCUDJxMlhyYXRlaFNwS3pK?= =?utf-8?B?WCtvTE5qbWcrSTdUc3RYWFZLUmZTMFZyeVdRb3JCd2FmYy9aMzNjdVpUZDN6?= =?utf-8?B?NXFGMXBTQjJqOWdidTdyZ2JOU0t1TXdNTUtLVms4a0xFTldIMUlSVzhBQWNo?= =?utf-8?B?MUhsUll1a2plOFQ0YXYwSENzeEh0MjEyQ0FQbmtvQ2pKMHNXUzFUU3Vybkxz?= =?utf-8?B?NjBSajE2bFhSU3dQbk9kVlFmTDVrOWJpYnZIZVEyZUxNL2htUGE0amVNQUJo?= =?utf-8?B?TG4yN21CcVZIWlRxWjUxVUVPNUx4dXpOZy9uRll1TEQ0YklINlE3ZGt4L2dh?= =?utf-8?B?SUdrNnNNcVFKUnlYYWtRNHR0c25sTUU5QngrTDVvTHZ4WXJ6czkwd3hpYzh1?= =?utf-8?B?YjhtSFJSemRUenNybElRbHFkVlo1ZUJTeEZnZGVBSHFuMW91bnBxM21OL1F4?= =?utf-8?B?NXliaGFYQVdyenNORGtTU21ITnJTVTJPdHB0U29UbENQTjZwTWxpTHhOV25Q?= =?utf-8?B?RENaLy9neTZGdHhETmdpQ3E4TTVIRDRvNlFvOEQxQ2JYV0NMa0Z3LzZXRldp?= =?utf-8?B?bGxZc1NYTWdRc3VtY281OTVNNXZFZ0NFM1VZSjVIZjJFZTJlTnZVVDFwczJq?= =?utf-8?B?ODVRM3FYQzIrSHdBUUpjbHZ0S2ZsZWEwMkFaRnQrVVNWeENrbHJwdDVPMS9U?= =?utf-8?B?blFsOGRUaGdtbjFaTWxFbXlvdjBIMXJSTzllSWdXencyb0JhajBiSWk1VEFt?= =?utf-8?B?RC9hRGJyYjYycTduc1M4QWx0aWF0ajc4dWVTMGVuYWpJbnV4ZjZPZTB4L3A4?= =?utf-8?B?cFFHZFZSOU4va1FJRW0vNVlleS8wNGlZdnVsZmtUVjR6VG9YV1k0UmNXWlV0?= =?utf-8?B?ckdMMlJkT2NQcGFZcVFIT21CL1V3UXNrZTRRMUtod1hDbjRWY0d1b3loaG9n?= =?utf-8?B?a2VvMjloemYySlo0blhjZklENXJMY0Npa21qc3crY2VjLzI2cEpZODh4RWVE?= =?utf-8?B?M3ljb3ltMVZxNGpVVlR0dGlyM25MSGFVOHUyUkNOeGZiNjVHWEVKcnI5Qncy?= =?utf-8?B?V2pKR00wQ0hzcy80MnVUNCt2YmJWeXNOSjdDQU0xT1pLUlBuUHF4RmNlbUl2?= =?utf-8?B?dmVIOElsS0JRZUFsd2NBL29XM3U2bEE0a3BPRXF5WmdPamJvYmVGeExOc0NG?= =?utf-8?B?QitocVh0eWJNV2crQlZBb0pXUUtwektObC9SdUFKZFBybjJUNDNNRnFCRWRT?= =?utf-8?Q?53TvGcTPaZSY8E7EZw=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 73ff6af5-e2a2-4a42-d67b-08dc78f8f91c X-MS-Exchange-CrossTenant-AuthSource: BY3PR19MB4900.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 May 2024 18:16:31.1390 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR19MB7542 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Resent-Date: Mon, 20 May 2024 11:16:34 -0700 Resent-From: spbrogan@outlook.com Reply-To: devel@edk2.groups.io,spbrogan@outlook.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: kk465dIZknqyUtsKrn1qE5jvx7686176AA= Content-Type: multipart/alternative; boundary="------------8jX0Vx9Z2vr8TNkl0SpSmBha" Content-Language: en-US X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=zEBe51BH; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 45.79.224.7 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=outlook.com (policy=none) --------------8jX0Vx9Z2vr8TNkl0SpSmBha Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit I can't find patch 1 in the series in my email so putting a few comments here.  I really hope this patch series can wait for PRs so code comments can more easily be correlated with code change. Looking at your PR with commit: Allocate Varaible cache buffer in PEI by td36 · Pull Request #5607 · tianocore/edk2 (github.com) A few comments for now. Variable is spelled incorrectly in commit message. I would really prefer to not mix PCDs and Hobs.  It is really confusing what has to be turned on and set to what to get the different behaviors.  For a hob producer it is OK to take that info from PCDs but lets not mix in the consumer code PCDs and hob data.  The HOB definition should not reference a PCD and a HOB definition should not be focused on producer/consumer but on the data. The existence of a hob is also a good indicator that a feature is used so you may not need to have "enable" PCDs anymore. Please don't include other header files in public header files (especially for super common headers like PiPei.h.  i know over the last few years this practice has become more common but it just creates pain when debugging build errors.  The trade off is not worth it. Hobs really shouldn't use UINTN sizes.  Since hobs helps transfer config state across phases where the size of UINTN may be different this causes problems. Hobs used for cross phase sharing shouldn't have pointers for the reason. Better and more complete comments on the different field members would be helpful.  I assume the "Buffer" fields are physical addresses and the "Pages" are number of 4K pages.   I would suggest EFI_PHYSICAL_ADDRESS for addresses and UINT64 for lengths. More details on what the three cache's are would be helpful or at least reference the feature of the cache they are supporting. This hob definition file isn't perfect and I believe some of the comment in the file header belong in different places, it is at least a good template for a hob definition. edk2/MdeModulePkg/Include/Guid/VariableFlashInfo.h at 284dbac43da752ee34825c8b3f6f9e8281cb5a19 · tianocore/edk2 (github.com) Thanks Sean On 5/17/2024 2:49 AM, duntan wrote: > This patch set defines a new VARIABLE_RUNTIME_CACHE_INFO HOB. The HOB is used to store the address and size of the buffer that will be used for variable runtime service when the PcdEnableVariableRuntimeCache is TRUE. > In following patches, when PcdEnableVariableRuntimeCache is TRUE, VariablePei will install a callback of gEfiPeiMemoryDiscoveredPpiGuid to allocate the needed buffer for different type variable runtime cache and build the HOB. > Then VariableSmmRuntimeDxe driver will consume gEdkiiVariableRuntimeCacheInfoHobGuid to initialize the variable runtime cache related content. The code to allocate and unblock the runtime cache buffer in VariableSmmRuntimeDxe is also removed in this patc set. > > PR for review:https://github.com/tianocore/edk2/pull/5607 > > Cc: Ray Ni > Cc: Liming Gao > Cc: Jiaxin Wu > Cc: Ard Biesheuvel > Cc: Leif Lindholm > Cc: Sami Mujawar > Cc: Gerd Hoffmann > Cc: Andrew Fish > Cc: Jiewen Yao > > Dun Tan (9): > MdeModulePkg:Add new gEdkiiVariableRuntimeCacheInfoHobGuid > ArmVirtPkg: Add MmUnblockMemoryLib in DSC > EmulatorPkg: Add MmUnblockMemoryLib in DSC > OvmfPkg: Add MmUnblockMemoryLib in DSC > MdeModulePkg:Create gEdkiiVariableRuntimeCacheInfoHobGuid > MdeModulePkg:Remove unnecessary global variable > MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid > MdeModulePkg: Refine InitVariableCache() > MdeModulePkg:Add global variable mVariableRtCacheInfo > > ArmVirtPkg/ArmVirtCloudHv.dsc | 2 ++ > EmulatorPkg/EmulatorPkg.dsc | 1 + > MdeModulePkg/Include/Guid/VariableRuntimeCacheInfo.h | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > MdeModulePkg/MdeModulePkg.dec | 3 +++ > MdeModulePkg/Universal/Variable/Pei/Variable.c | 298 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > MdeModulePkg/Universal/Variable/Pei/Variable.h | 3 +++ > MdeModulePkg/Universal/Variable/Pei/VariablePei.inf | 8 +++++++- > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c | 293 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf | 5 +++-- > OvmfPkg/OvmfPkgIa32X64.dsc | 2 +- > 10 files changed, 506 insertions(+), 174 deletions(-) > create mode 100644 MdeModulePkg/Include/Guid/VariableRuntimeCacheInfo.h > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119089): https://edk2.groups.io/g/devel/message/119089 Mute This Topic: https://groups.io/mt/106150796/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- --------------8jX0Vx9Z2vr8TNkl0SpSmBha Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

I can't find patch 1 in the series in my email so putting a few comments here.  I really hope this patch series can wait for PRs so code comments can more easily be correlated with code change. 

Looking at your PR with commit: Allocate Varaible cache buffer in PEI by td36 · Pull Request #5607 · tianocore/edk2 (github.com)

A few comments for now.

Variable is spelled incorrectly in commit message. 

I would really prefer to not mix PCDs and Hobs.  It is really confusing what has to be turned on and set to what to get the different behaviors.  For a hob producer it is OK to take that info from PCDs but lets not mix in the consumer code PCDs and hob data.  The HOB definition should not reference a PCD and a HOB definition should not be focused on producer/consumer but on the data. 

The existence of a hob is also a good indicator that a feature is used so you may not need to have "enable" PCDs anymore. 

Please don't include other header files in public header files (especially for super common headers like PiPei.h.  i know over the last few years this practice has become more common but it just creates pain when debugging build errors.  The trade off is not worth it. 

Hobs really shouldn't use UINTN sizes.  Since hobs helps transfer config state across phases where the size of UINTN may be different this causes problems. 

Hobs used for cross phase sharing shouldn't have pointers for the reason. 

Better and more complete comments on the different field members would be helpful.  I assume the "Buffer" fields are physical addresses and the "Pages" are number of 4K pages.   I would suggest EFI_PHYSICAL_ADDRESS for addresses and UINT64 for lengths. 

More details on what the three cache's are would be helpful or at least reference the feature of the cache they are supporting. 

This hob definition file isn't perfect and I believe some of the comment in the file header belong in different places, it is at least a good template for a hob definition.

edk2/MdeModulePkg/Include/Guid/VariableFlashInfo.h at 284dbac43da752ee34825c8b3f6f9e8281cb5a19 · tianocore/edk2 (github.com)


Thanks

Sean



On 5/17/2024 2:49 AM, duntan wrote:
This patch set defines a new VARIABLE_RUNTIME_CACHE_INFO HOB. The HOB is used to store the address and size of the buffer that will be used for variable runtime service when the PcdEnableVariableRuntimeCache is TRUE.
In following patches, when PcdEnableVariableRuntimeCache is TRUE, VariablePei will install a callback of gEfiPeiMemoryDiscoveredPpiGuid to allocate the needed buffer for different type variable runtime cache and build the HOB.
Then VariableSmmRuntimeDxe driver will consume gEdkiiVariableRuntimeCacheInfoHobGuid to initialize the variable runtime cache related content. The code to allocate and unblock the runtime cache buffer in VariableSmmRuntimeDxe is also removed in this patc set.

PR for review: https://github.com/tianocore/edk2/pull/5607

Cc: Ray Ni <ray.ni@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Leif Lindholm <quic_llindhol@quicinc.com>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Andrew Fish <afish@apple.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>

Dun Tan (9):
  MdeModulePkg:Add new gEdkiiVariableRuntimeCacheInfoHobGuid
  ArmVirtPkg: Add MmUnblockMemoryLib in DSC
  EmulatorPkg: Add MmUnblockMemoryLib in DSC
  OvmfPkg: Add MmUnblockMemoryLib in DSC
  MdeModulePkg:Create gEdkiiVariableRuntimeCacheInfoHobGuid
  MdeModulePkg:Remove unnecessary global variable
  MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid
  MdeModulePkg: Refine InitVariableCache()
  MdeModulePkg:Add global variable mVariableRtCacheInfo

 ArmVirtPkg/ArmVirtCloudHv.dsc                                        |   2 ++
 EmulatorPkg/EmulatorPkg.dsc                                          |   1 +
 MdeModulePkg/Include/Guid/VariableRuntimeCacheInfo.h                 |  65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 MdeModulePkg/MdeModulePkg.dec                                        |   3 +++
 MdeModulePkg/Universal/Variable/Pei/Variable.c                       | 298 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 MdeModulePkg/Universal/Variable/Pei/Variable.h                       |   3 +++
 MdeModulePkg/Universal/Variable/Pei/VariablePei.inf                  |   8 +++++++-
 MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c   | 293 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf |   5 +++--
 OvmfPkg/OvmfPkgIa32X64.dsc                                           |   2 +-
 10 files changed, 506 insertions(+), 174 deletions(-)
 create mode 100644 MdeModulePkg/Include/Guid/VariableRuntimeCacheInfo.h

_._,_._,_

Groups.io Links:

You receive all messages sent to this group.

View/Reply Online (#119089) | | Mute This Topic | New Topic
Your Subscription | Contact Group Owner | Unsubscribe [rebecca@openfw.io]

_._,_._,_
--------------8jX0Vx9Z2vr8TNkl0SpSmBha--