From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail03.groups.io (mail03.groups.io [45.79.227.220]) by spool.mail.gandi.net (Postfix) with ESMTPS id 55E16740040 for ; Fri, 12 Apr 2024 14:34:00 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=kxN+VIiG5BECw/gIkTqgf6wG8XSp6o4cRBsEUAIvlAU=; c=relaxed/simple; d=groups.io; h=Received-SPF:Received-SPF:From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:MIME-Version:NoDisclaimer: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; s=20240206; t=1712932439; v=1; b=m6TZ5wLh/72htJ5rpYfuRE7gRhllxCtGukl8D23SPqE3a2ZMrWDXcPNi/kig0DqRJ/ndEyyx G6qHMAoov8mcbwcdCAmDNKqAU9Bq7+yN62kdTvqkJ0BSMG8hGOQTRILhneYbdF1OaOv8/MFyDot 8Li/66U+Rz0Iizyio/reKU/H2a+NmiU8i1MPR+DojoIpV56Eq6gXsINiNoQqbYHv+ZyF/wHFgfk kVfhjHMhoKu6MeXJjr0SuxckAZitpxQ/dsZmHj2UVnpEDagshlWziP6n6Z6XCZ6kLkYkAOY2klm +dpyy0jBasqEHTbB0PuU5ppVwNKSIFp69Iag0lZ0sItFg== X-Received: by 127.0.0.2 with SMTP id ohnoYY7687511x6asYTnMOWV; Fri, 12 Apr 2024 07:33:59 -0700 X-Received: from EUR05-DB8-obe.outbound.protection.outlook.com (EUR05-DB8-obe.outbound.protection.outlook.com [40.107.20.58]) by mx.groups.io with SMTP id smtpd.web11.47958.1712932430967546913 for ; Fri, 12 Apr 2024 07:33:53 -0700 X-Received: from AS4P191CA0019.EURP191.PROD.OUTLOOK.COM (2603:10a6:20b:5d9::9) by VI0PR08MB10512.eurprd08.prod.outlook.com (2603:10a6:800:203::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Fri, 12 Apr 2024 14:33:47 +0000 X-Received: from AM4PEPF00025F99.EURPRD83.prod.outlook.com (2603:10a6:20b:5d9:cafe::56) by AS4P191CA0019.outlook.office365.com (2603:10a6:20b:5d9::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.22 via Frontend Transport; Fri, 12 Apr 2024 14:33:47 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C X-Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM4PEPF00025F99.mail.protection.outlook.com (10.167.16.8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.7495.0 via Frontend Transport; Fri, 12 Apr 2024 14:33:45 +0000 X-Received: ("Tessian outbound 88c46f8f09a7:v313"); Fri, 12 Apr 2024 14:33:45 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 363df68590019e22 X-CR-MTA-TID: 64aa7808 X-Received: from 1a4ee868b354.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id A5549CAB-D859-4206-9611-0CDF32A6D45B.1; Fri, 12 Apr 2024 14:33:33 +0000 X-Received: from EUR03-DBA-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 1a4ee868b354.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 12 Apr 2024 14:33:33 +0000 X-Received: from DB7PR03CA0089.eurprd03.prod.outlook.com (2603:10a6:10:72::30) by DBBPR08MB10386.eurprd08.prod.outlook.com (2603:10a6:10:534::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.55; Fri, 12 Apr 2024 14:33:30 +0000 X-Received: from DU2PEPF00028D02.eurprd03.prod.outlook.com (2603:10a6:10:72:cafe::b4) by DB7PR03CA0089.outlook.office365.com (2603:10a6:10:72::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.26 via Frontend Transport; Fri, 12 Apr 2024 14:33:30 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; pr=C X-Received: from nebula.arm.com (40.67.248.234) by DU2PEPF00028D02.mail.protection.outlook.com (10.167.242.186) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7452.22 via Frontend Transport; Fri, 12 Apr 2024 14:33:30 +0000 X-Received: from AZ-NEU-EX02.Emea.Arm.com (10.251.26.5) by AZ-NEU-EX03.Arm.com (10.251.24.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Fri, 12 Apr 2024 14:33:27 +0000 X-Received: from AZ-NEU-EX04.Arm.com (10.251.24.32) by AZ-NEU-EX02.Emea.Arm.com (10.251.26.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Fri, 12 Apr 2024 14:33:27 +0000 X-Received: from E114225.Arm.com (10.1.196.56) by mail.arm.com (10.251.24.32) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Fri, 12 Apr 2024 14:33:26 +0000 From: "Sami Mujawar" To: CC: Sami Mujawar , , , , , , , Subject: [edk2-devel] [PATCH v2 05/45] ArmVirtPkg: ArmCcaRsiLib: Add interfaces to manage the Realm IPA state Date: Fri, 12 Apr 2024 15:32:42 +0100 Message-ID: <20240412143322.5244-6-sami.mujawar@arm.com> In-Reply-To: <20240412143322.5244-1-sami.mujawar@arm.com> References: <20240412143322.5244-1-sami.mujawar@arm.com> MIME-Version: 1.0 X-EOPAttributedMessage: 1 X-MS-TrafficTypeDiagnostic: DU2PEPF00028D02:EE_|DBBPR08MB10386:EE_|AM4PEPF00025F99:EE_|VI0PR08MB10512:EE_ X-MS-Office365-Filtering-Correlation-Id: 47051267-00c0-4fb6-26cd-08dc5afd8f44 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: coB3UAQ2VhwvxXFHUaxvJN6k4F1CwmoaU5vhrwiDHQNQqccjMMhaSCrshYPqSfrR0i2xV/fnc83mn+HKv4lPjOuGO6Di+sCopwrD3i6cMMUTlWYAFwM/+ueJ0J+SKQVns4rFfVsGuABmKGRSkDlMGe59+5mJxvhpyJJdFnskP78O5x6N1kKa1BCNg6Gn/Xr/L4mpQc82fwycbdz+Z8tHCxcLlGtIi9z9HEkK+WT30Av3RO142DHaNdflRkJTHJ4b/i2EoFvhjy1jM4kwmYI/gL8O8NOOEj4Zrz68FonBjD5jKgmdVfPun7QzJXpryRU6anrl4IADWyAoebYG74eAPzJ6o/YvOlZiUKy9Y9m4eUJNdYiZyzUOJKcqv9BKEPhDucnU4rW8AH/AecfjJmMmtvuVYzuI6o5DpCva7QG2xU+XHjtja9dyeRSzkJGYEhllxVZhFj7iYjm9GAKwX0Q9oChzMt7tjVis5TPlgGNlI2+REOsHSfXmVKGM7oIinEoQXA/QMp7VctKXUqgM3v7hV8RJNRLswafbnboet34dq5jaQDbOi84zgbt4ynPPiI30Qfd/OL0USvcO/lB4Lg81wDmP2EFiTMFChrCqvTslT9H2m0DlHA1oNXle3xaTt8QfKxirSojAPe8rL966YY45CRFY6XWVJxQPsPYWppzB0qxEVP0CWZavbsvHqN4MHlsd9XIvh/yQWvKXtHeAGLiqoHdhNtZAMjlhaajlQk3Eb+RO9jDRr5+9X0PGfMbn8Umy X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:nebula.arm.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(36860700004)(1800799015)(376005)(82310400014);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR08MB10386 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM4PEPF00025F99.EURPRD83.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: b329d07b-55e3-4a3e-5fd1-08dc5afd8634 X-Microsoft-Antispam-Message-Info: x7tebQ1E1GOfPTTZh13Zfn6rICGSLhZa2+/la+4Hm61kkYrbBmRoWjnQYbNJiigKIr/ZVFcOXpQk4lhQRDOLWEHyShBIQHIqQDZ3NLi7DHKmcX7hrf7a+r0C6OOCwrzQ6I2Bklwx4EcCmoKUAoe0AF5D6Am10zS2AGFXV9uLB++UzkfIAe8gs1SqhU5qkbIlY5XBi4TZk/FFbLMjo8NP9O2hxC+2ZuKscEaWqUG8Ts4WSbjjHfZ6LdPtKd6EH1s7i1/tBxSHrwBPXMhrbXI8HwTNJB41i0BesKlB0XkW6AJbi6HrkRNiIE4SSkVjKJv9c81VyIrvB3YGR0T/DTZfooEfjCvN7HaUKaJ0v52rf9pZX12Gpt2CjdxzPNQOyBmMZNzULZEmmYA9PEMrBoSNnKOSJxBLIueWMgl6apSbtFpDYlG+BnmlgYskxKevD5H6l+nNaTofkYMSF/KOaOvFBkjq/druf5/AAQyRsZ18Ldqmj0NnS4/FCn06ebNhJQpOGBs+lqsImxQ7qCdA8cgH8H2PFoP5Lpd1dt0wfwoQeXw4+7cWEzchCpkB4/uJfkYMwXUpTSaMLzNAQ9KRMWAw56ME9YOsCUbcn18src8AY826oKJvuz2I556QQrWRpxfTHDoMrSkBs4P7DUw/AdKd2JD2iTKrD2MXXI4JvtU8MjvNwf7bE815BFUBo1nLDxcJlsTt080dRZQvreGlb/uFocviRTRhWG6c9ARHS1yr/VHGdflM198//CCceY/3KOzt X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Apr 2024 14:33:45.5976 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 47051267-00c0-4fb6-26cd-08dc5afd8f44 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM4PEPF00025F99.EURPRD83.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR08MB10512 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: Fri, 12 Apr 2024 07:33:53 -0700 Resent-From: sami.mujawar@arm.com Reply-To: devel@edk2.groups.io,sami.mujawar@arm.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: OopTGIFbjAa7DBk2raSrRKWVx7686176AA= Content-Type: text/plain X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=m6TZ5wLh; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=arm.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 45.79.227.220 as permitted sender) smtp.mailfrom=bounce@groups.io The IPA space of a Realm is divided into two halves: Protected IPA space and Unprotected IPA space. Software in a Realm should treat the most significant bit of an IPA as a protection attribute. A Protected IPA is an address in the lower half of a Realm's IPA space. An Unprotected IPA is an address in the upper half of a Realm's IPA space. A Protected IPA has an associated Realm IPA state (RIPAS). The RIPAS values are: * EMPTY - Unused address * RAM - Private code or data owned by the Realm. Software in the Realm needs to share memory with the host to communicate with the outside world, e.g. network, disk image, etc. To share memory, the software in the Realm first transitions the RIPAS of memory region it wants to share with the host from RAM to EMPTY. The Realm software can then access the shared memory region using the Unprotected IPA address. The RMM specification defines the following Realm Service Interfaces for managing the IPA state: * RSI_IPA_STATE_GET * RSI_IPA_STATE_SET Therefore, update the ArmCcaRsiLib to add interfaces to get and set the IPA state of Realm memory pages. Cc: Ard Biesheuvel Cc: Leif Lindholm Cc: Gerd Hoffmann Signed-off-by: Sami Mujawar --- ArmVirtPkg/Include/Library/ArmCcaRsiLib.h | 50 +++++++++++ ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsi.h | 7 +- ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsiLib.c | 92 ++++++++++++++++++++ 3 files changed, 147 insertions(+), 2 deletions(-) diff --git a/ArmVirtPkg/Include/Library/ArmCcaRsiLib.h b/ArmVirtPkg/Include/Library/ArmCcaRsiLib.h index ab70240b3ab2979996f20190ddf669b53183556b..0c7f1afc78252b286a20dd8a7a81d538cf76ea8f 100644 --- a/ArmVirtPkg/Include/Library/ArmCcaRsiLib.h +++ b/ArmVirtPkg/Include/Library/ArmCcaRsiLib.h @@ -6,6 +6,7 @@ - Rsi or RSI - Realm Service Interface - IPA - Intermediate Physical Address + - RIPAS - Realm IPA state @par Reference(s): - Realm Management Monitor (RMM) Specification, version A-bet0 @@ -24,6 +25,21 @@ */ #define REALM_GRANULE_SIZE SIZE_4KB +/** + A macro defining the mask for the RSI RIPAS type. + See Section B4.4.5 RsiRipas type, RMM Specification, version A-bet0. +*/ +#define RIPAS_TYPE_MASK 0xFF + +/** An enum describing the RSI RIPAS. + See Section A5.2.2 Realm IPA state, RMM Specification, version A-bet0 +*/ +typedef enum Ripas { + RipasEmpty, ///< Unused IPA location. + RipasRam, ///< Private code or data owned by the Realm. + RipasMax ///< A valid RIPAS type value is less than RipasMax. +} RIPAS; + /** A structure describing the Realm Configuration. See Section B4.4.4 RsiRealmConfig type, RMM Specification, version A-bet0 The width of the RsiRealmConfig structure is 4096 (0x1000) bytes. @@ -35,6 +51,40 @@ typedef struct RealmConfig { UINT8 Reserved[SIZE_4KB - sizeof (UINT64)]; } REALM_CONFIG; +/** + Returns the IPA state for the page pointed by the address. + + @param [in] Address Address to retrive IPA state. + @param [out] State The RIPAS state for the address specified. + + @retval RETURN_SUCCESS Success. + @retval RETURN_INVALID_PARAMETER A parameter is invalid. +**/ +RETURN_STATUS +EFIAPI +RsiGetIpaState ( + IN UINT64 *Address, + OUT RIPAS *State + ); + +/** + Sets the IPA state for the pages pointed by the memory range. + + @param [in] Address Address to the start of the memory range. + @param [in] Size Length of the memory range. + @param [in] State The RIPAS state to be configured. + + @retval RETURN_SUCCESS Success. + @retval RETURN_INVALID_PARAMETER A parameter is invalid. +**/ +RETURN_STATUS +EFIAPI +RsiSetIpaState ( + IN UINT64 *Address, + IN UINT64 Size, + IN RIPAS State + ); + /** Read the Realm Configuration. diff --git a/ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsi.h b/ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsi.h index 90e9dbb609679c82cd8e8ee8081428fd97021f97..9cc12bc5a70b457367077d0b26011c3b91fa63c9 100644 --- a/ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsi.h +++ b/ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsi.h @@ -7,6 +7,7 @@ @par Glossary: - Rsi or RSI - Realm Service Interface - IPA - Intermediate Physical Address + - RIPAS - Realm IPA state @par Reference(s): - Realm Management Monitor (RMM) Specification, version A-bet0 @@ -17,8 +18,10 @@ #define ARM_CCA_RSI_H_ // FIDs for Realm Service Interface calls. -#define FID_RSI_REALM_CONFIG 0xC4000196 -#define FID_RSI_VERSION 0xC4000190 +#define FID_RSI_IPA_STATE_GET 0xC4000198 +#define FID_RSI_IPA_STATE_SET 0xC4000197 +#define FID_RSI_REALM_CONFIG 0xC4000196 +#define FID_RSI_VERSION 0xC4000190 /** RSI Command Return codes See Section B4.4.1, RMM Specification, version A-bet0. diff --git a/ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsiLib.c b/ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsiLib.c index 42b99fb7a71c8b38512a2f7472f9bc8a034fe1e9..546df9a94cb86533b37fef7e42fdaf7b8563052d 100644 --- a/ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsiLib.c +++ b/ArmVirtPkg/Library/ArmCcaRsiLib/ArmCcaRsiLib.c @@ -7,6 +7,7 @@ @par Glossary: - Rsi or RSI - Realm Service Interface - IPA - Intermediate Physical Address + - RIPAS - Realm IPA state @par Reference(s): - Realm Management Monitor (RMM) Specification, version A-bet0 @@ -81,6 +82,97 @@ AddrIsGranuleAligned ( return TRUE; } +/** + Returns the IPA state for the page pointed by the address. + + @param [in] Address Address to retrive IPA state. + @param [out] State The RIPAS state for the address specified. + + @retval RETURN_SUCCESS Success. + @retval RETURN_INVALID_PARAMETER A parameter is invalid. +**/ +RETURN_STATUS +EFIAPI +RsiGetIpaState ( + IN UINT64 *Address, + OUT RIPAS *State + ) +{ + RETURN_STATUS Status; + ARM_SMC_ARGS SmcCmd; + + if ((State == NULL) || (!AddrIsGranuleAligned (Address))) { + return RETURN_INVALID_PARAMETER; + } + + ZeroMem (&SmcCmd, sizeof (SmcCmd)); + SmcCmd.Arg0 = FID_RSI_IPA_STATE_GET; + SmcCmd.Arg1 = (UINTN)Address; + + ArmCallSmc (&SmcCmd); + Status = RsiCmdStatusToEfiStatus (SmcCmd.Arg0); + if (!RETURN_ERROR (Status)) { + *State = (RIPAS)(SmcCmd.Arg1 & RIPAS_TYPE_MASK); + } + + return Status; +} + +/** + Sets the IPA state for the pages pointed by the memory range. + + @param [in] Address Address to the start of the memory range. + @param [in] Size Length of the memory range. + @param [in] State The RIPAS state to be configured. + + @retval RETURN_SUCCESS Success. + @retval RETURN_INVALID_PARAMETER A parameter is invalid. +**/ +RETURN_STATUS +EFIAPI +RsiSetIpaState ( + IN UINT64 *Address, + IN UINT64 Size, + IN RIPAS State + ) +{ + RETURN_STATUS Status; + UINT64 *BaseAddress; + UINT64 *EndAddress; + ARM_SMC_ARGS SmcCmd; + + if ((Size == 0) || + ((Size & (REALM_GRANULE_SIZE - 1)) != 0) || + (!AddrIsGranuleAligned (Address))) + { + return RETURN_INVALID_PARAMETER; + } + + BaseAddress = Address; + // Divide Size by 8 for the pointer arithmetic + // to work, as we are adding to UINT64*. + EndAddress = Address + (Size >> 3); + + while (Size > 0) { + ZeroMem (&SmcCmd, sizeof (SmcCmd)); + SmcCmd.Arg0 = FID_RSI_IPA_STATE_SET; + SmcCmd.Arg1 = (UINTN)BaseAddress; + SmcCmd.Arg2 = (UINTN)Size; + SmcCmd.Arg3 = (UINTN)State; + + ArmCallSmc (&SmcCmd); + Status = RsiCmdStatusToEfiStatus (SmcCmd.Arg0); + if (RETURN_ERROR (Status)) { + break; + } + + BaseAddress = (UINT64 *)SmcCmd.Arg1; + Size = EndAddress - BaseAddress; + } // while + + return Status; +} + /** Read the Realm Configuration. -- 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117684): https://edk2.groups.io/g/devel/message/117684 Mute This Topic: https://groups.io/mt/105483423/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-