From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (NAM10-DM6-obe.outbound.protection.outlook.com [40.107.93.72]) by mx.groups.io with SMTP id smtpd.web10.2716.1681802169717450195 for ; Tue, 18 Apr 2023 00:16:09 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@amd.com header.s=selector1 header.b=VeBXrZHv; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.93.72, mailfrom: abner.chang@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WKp4+EMRxIt3O4/YeK22mWIxUi0pmm9ZvHwiWSNWTVLga6ERKzTFDIC/q2BD0ibWO3GjDC32jAPdWXLBo39BjwOMdp7402l1DhsRe9viuY2PGTpilksz76dkUnA6xbAnrpYpYCxwq6TzwGMvM+7hnm7CXAqAohvHby+gDTyNEcW8Ua8Mm9bIKepYNx0b4EXJjCs4QcAq8CYDcY31st+6RH0DH/jApStbCKTBgU+ZR4rQVHtT32SqZ8QEsTgmPE1eDGkL44IeWA44bJyAd2NT1d6KxPxuRw+VdNiXQ3EfF2wZDnSH5Sc4iU3NBA+7ueOpQnhNR3GGRDbnUYWHILPXEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=UDKjpVNwKrusAYf5KxkSOXjKif4W8Q/+S81ZbejHsDc=; b=EQoG9TfHDC7wE2wxoHfSBZ6xl6QEGg1rzquB7BU91pqNkNGhPy1RsttZD7wOaRtmKOwPvl7M7jtgTr+uq4zw7K0xlLpoOWHqDrnwpF+phytAYApsHGu6YEZuawvepxBHBZNFWDrYAH0TvI9EqyFkAW7/3/V68obkHjt2LOJEnHDFkNAGP5yI6JAkLUZxH7/jDMFDy+A3z8rht4zXJ8lK1sOYUvymVpRq6udOumzlssFBTqKrRvZEyuX56tnTZPZbv/E+YWFN3bf+affpe/YGE4erJaAJ9Fyl2+BEvPNCS6ea1CBM0/9+WedCtIbed7MsdFL8PM7/ifAA4tfhL/g2qQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UDKjpVNwKrusAYf5KxkSOXjKif4W8Q/+S81ZbejHsDc=; b=VeBXrZHvznZ9vlN14Yf8h005gQfcy6M0TwxpGKo7+dIhwz7Wl+bAv3ehNI8bw93o8VCb3PzHztNhXckQdVoMu23GrpRholK1aD7m6dimTHRYMxXlqexmf0Bv1+r/E+hkDEarH6NR2c4Wm73p1iQYHDYyKI+pCfMry1d1RazDMxg= Received: from DM6PR01CA0004.prod.exchangelabs.com (2603:10b6:5:296::9) by PH7PR12MB5879.namprd12.prod.outlook.com (2603:10b6:510:1d7::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.45; Tue, 18 Apr 2023 07:16:07 +0000 Received: from DM6NAM11FT029.eop-nam11.prod.protection.outlook.com (2603:10b6:5:296:cafe::a6) by DM6PR01CA0004.outlook.office365.com (2603:10b6:5:296::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.47 via Frontend Transport; Tue, 18 Apr 2023 07:16:07 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by DM6NAM11FT029.mail.protection.outlook.com (10.13.173.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6319.20 via Frontend Transport; Tue, 18 Apr 2023 07:16:07 +0000 Received: from TPE-L1-ABNCHANG.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Tue, 18 Apr 2023 02:16:03 -0500 From: "Chang, Abner" To: CC: Isaac Oram , Abdul Lateef Attar , Nickle Wang , Igor Kulchytskyy Subject: [edk2-platforms][PATCH V2 01/14] ManageabilityPkg: Add more helper functions Date: Tue, 18 Apr 2023 15:15:30 +0800 Message-ID: <20230418071543.1951-2-abner.chang@amd.com> X-Mailer: git-send-email 2.37.1.windows.1 In-Reply-To: <20230418071543.1951-1-abner.chang@amd.com> References: <20230418071543.1951-1-abner.chang@amd.com> MIME-Version: 1.0 Return-Path: Abner.Chang@amd.com X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6NAM11FT029:EE_|PH7PR12MB5879:EE_ X-MS-Office365-Filtering-Correlation-Id: 3e0652de-5841-4b68-9b29-08db3fdcc739 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4b8A9WMxJnImt+QhIYUjoHVYa191/Farzn6NoPsSkTMmi2PWgBPOoUSFwkXG6S9Hi/H0HUYQDlH5POTPYCzFojkjXozO3+jkHP8sEGHbnUIZZxwqRMNjyAmLHAGLh0pwsVTgWrXm3e5frlor/YprNQ8uzmuS0r9mPUfss2W3KJzNnbpLoJtXbDQDDGw0TvuL1GZ6J5yqWs4SdGbqdBdl+DdsbwjJ3oldOitv2mX1y2bu55518aRWUglUdotwei+O3AOcIEsrJ5KE8f0b852JUBBRKAnwKfBkpjTjSw03Oi7vehP4Cm5zUFJXDUrbxFMtG2oUS5zea5KKb2lYhmd3ROgw9TykM23tEKjnTf8jmYmRtlMc3Im8wffDnggqEUm9YTiedhVB1khfKMSpeqbnVXFpmUFKhVgnaX9CaJLoG29R6ni9zx16noZ8C2l9B/MJIUBk8NvdRu1RXb6BOQuKMq+I3h/mk6iePSRk3HPEgIqafuIMtpYSQmlzCTLEEzdcHLKbxD8YSMQ555y1TejmhcBuQJX00IQX42MVPauS0K7ZnClZHdPwYpjP/RNiYS7/k1+B7CCd62RzvXt3tFhLIEiiaL8+3bZ4+9/9EarlxeAFJEkOxoCvuHssZKd4A/nfxtrbKzBPImHyGZOM+2yHSi0MaFGs9duy+0spKCAvTQLKNIr2uLmSdb9jhWoX+oWT5C7yS0ELBZL87dMTEDv7Uvq+Exk7ULV96Oq0bhpspME= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230028)(4636009)(346002)(136003)(396003)(39860400002)(376002)(451199021)(36840700001)(46966006)(40470700004)(83380400001)(47076005)(426003)(336012)(36756003)(82310400005)(82740400003)(8936002)(41300700001)(81166007)(36860700001)(54906003)(478600001)(2616005)(16526019)(186003)(4326008)(6916009)(8676002)(40480700001)(1076003)(26005)(70206006)(70586007)(30864003)(5660300002)(6666004)(7696005)(86362001)(2906002)(356005)(40460700003)(2876002)(316002)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Apr 2023 07:16:07.0072 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3e0652de-5841-4b68-9b29-08db3fdcc739 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: DM6NAM11FT029.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5879 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain From: Abner Chang 1. Add a helper function to output payload binary to debug output device. 2. Add a helper function to split payload into packages according to maximum transfer unit of transport interface. 3. Add a helper function to generate CRC8. Signed-off-by: Abner Chang Cc: Isaac Oram Cc: Abdul Lateef Attar Cc: Nickle Wang Cc: Igor Kulchytskyy --- .../BaseManageabilityTransportHelper.inf | 1 + .../Library/ManageabilityTransportHelperLib.h | 98 ++++++++ .../BaseManageabilityTransportHelper.c | 225 +++++++++++++++++- 3 files changed, 314 insertions(+), 10 deletions(-) diff --git a/Features/ManageabilityPkg/Library/BaseManageabilityTransportHe= lperLib/BaseManageabilityTransportHelper.inf b/Features/ManageabilityPkg/Li= brary/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.= inf index 5447954144..c9e5eaef60 100644 --- a/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib= /BaseManageabilityTransportHelper.inf +++ b/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib= /BaseManageabilityTransportHelper.inf @@ -25,6 +25,7 @@ [LibraryClasses] BaseMemoryLib DebugLib + MemoryAllocationLib =20 [Packages] ManageabilityPkg/ManageabilityPkg.dec diff --git a/Features/ManageabilityPkg/Include/Library/ManageabilityTranspo= rtHelperLib.h b/Features/ManageabilityPkg/Include/Library/ManageabilityTran= sportHelperLib.h index 718ac34a1f..0dbf5ccb3c 100644 --- a/Features/ManageabilityPkg/Include/Library/ManageabilityTransportHelpe= rLib.h +++ b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportHelpe= rLib.h @@ -11,8 +11,24 @@ =20 #include =20 +#define DEBUG_MANAGEABILITY_INFO DEBUG_INFO + typedef struct _MANAGEABILITY_PROTOCOL_NAME MANAGEABILITY_PROTOCOL_NAME; =20 +typedef struct { + UINT8 *PayloadPointer; + UINT32 PayloadSize; +} MANAGEABILITY_TRANSMISSION_PACKAGE_ATTR; + +// +// The information of multi portions of payload it is +// splitted according to transport interface Maximum +// Transfer Unit. +typedef struct { + UINT16 NumberOfPackages; ///< Number= of packages in MultiPackages. + MANAGEABILITY_TRANSMISSION_PACKAGE_ATTR MultiPackages[]; +} MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES; + /** Helper function returns the human readable name of Manageability specifi= cation. =20 @@ -90,4 +106,86 @@ HelperInitManageabilityTransport ( OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalSt= atus OPTIONAL ); =20 +/** + This function splits payload into multiple packages according to + the given transport interface Maximum Transfer Unit (MTU). + + @param[in] PreambleSize The additional data size precedes + each package. + @param[in] PostambleSize The additional data size succeeds + each package. + @param[in] Payload Pointer to payload. + @param[in] PayloadSize Payload size in byte. + @param[in] MaximumTransferUnit MTU of transport interface. + @param[out] MultiplePackages Pointer to receive + MANAGEABILITY_TRANSMISSION_MULTI_PACKAG= ES + structure. Caller has to free the memor= y + allocated for MANAGEABILITY_TRANSMISSIO= N_MULTI_PACKAGES. + + @retval EFI_SUCCESS MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES= structure + is returned successfully. + @retval EFI_OUT_OF_RESOURCE Not enough resource to create + MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES= structure. +**/ +EFI_STATUS +HelperManageabilitySplitPayload ( + IN UINT16 PreambleSize, + IN UINT16 PostambleSize, + IN UINT8 *Payload, + IN UINT32 PayloadSize, + IN UINT32 MaximumTransferUnit, + OUT MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES **MultiplePackages + ); + +/** + This function generates CRC8 with given polynomial. + + @param[in] Polynomial Polynomial in 8-bit. + @param[in] CrcInitialValue CRC initial value. + @param[in] BufferStart Pointer to buffer starts the CRC calculatio= n. + @param[in] BufferSize Size of buffer. + + @retval UINT8 CRC value. +**/ +UINT8 +HelperManageabilityGenerateCrc8 ( + IN UINT8 Polynomial, + IN UINT8 CrcInitialValue, + IN UINT8 *BufferStart, + IN UINT32 BufferSize + ); + +/** + Print out manageability transmit payload to the debug output device. + + @param[in] Payload Payload to print. + @param[in] PayloadSize Payload size. + +**/ +VOID +EFIAPI +HelperManageabilityPayLoadDebugPrint ( + IN VOID *Payload, + IN UINT32 PayloadSize + ); + +/** + Prints a debug message and manageability payload to the debug output dev= ice. + + @param[in] Payload Payload to print. + @param[in] PayloadSize Payload size. + @param[in] Format The format string for the debug message to prin= t. + @param[in] ... The variable argument list whose contents are a= ccessed + based on the format string specified by Format. + +**/ +VOID +EFIAPI +HelperManageabilityDebugPrint ( + IN VOID *Payload, + IN UINT32 PayloadSize, + IN CONST CHAR8 *Format, + ... + ); + #endif diff --git a/Features/ManageabilityPkg/Library/BaseManageabilityTransportHe= lperLib/BaseManageabilityTransportHelper.c b/Features/ManageabilityPkg/Libr= ary/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.c index c3f35b7beb..0e241ca3fd 100644 --- a/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib= /BaseManageabilityTransportHelper.c +++ b/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib= /BaseManageabilityTransportHelper.c @@ -8,11 +8,12 @@ #include #include #include +#include #include =20 // // BaseManageabilityTransportHelper is used by PEI, DXE and SMM. -// Make sure the global variables added here should be unchangable. +// Make sure the global variables added here should be unchangeable. // MANAGEABILITY_SPECIFICATION_NAME ManageabilitySpecNameTable[] =3D { { &gManageabilityTransportKcsGuid, L"KCS" }, @@ -47,8 +48,8 @@ HelperManageabilitySpecName ( return NULL; } =20 - if (SpecificationGuid =3D=3D NULL || IsZeroGuid (SpecificationGuid)) { - DEBUG((DEBUG_ERROR, "%a: Improper input GUIDs, could be NULL or zero G= UID.\n", __FUNCTION__)); + if ((SpecificationGuid =3D=3D NULL) || IsZeroGuid (SpecificationGuid)) { + DEBUG ((DEBUG_ERROR, "%a: Improper input GUIDs, could be NULL or zero = GUID.\n", __FUNCTION__)); return NULL; } =20 @@ -99,12 +100,13 @@ HelperManageabilityCheckSupportedSpec ( return EFI_INVALID_PARAMETER; } =20 - if (TransportGuid =3D=3D NULL || + if ((TransportGuid =3D=3D NULL) || IsZeroGuid (TransportGuid) || - ManageabilityProtocolToCheck =3D=3D NULL || + (ManageabilityProtocolToCheck =3D=3D NULL) || IsZeroGuid (ManageabilityProtocolToCheck) - ) { - DEBUG((DEBUG_ERROR, "%a: Improper input GUIDs, could be NULL or zero= GUID.\n", __FUNCTION__)); + ) + { + DEBUG ((DEBUG_ERROR, "%a: Improper input GUIDs, could be NULL or zero = GUID.\n", __FUNCTION__)); return EFI_INVALID_PARAMETER; } =20 @@ -116,7 +118,7 @@ HelperManageabilityCheckSupportedSpec ( )) { DEBUG (( - DEBUG_VERBOSE, + DEBUG_MANAGEABILITY_INFO, "%a: Transport interface %s supports %s manageability specificatio= n.\n", __FUNCTION__, HelperManageabilitySpecName (TransportGuid), @@ -174,7 +176,7 @@ HelperAcquireManageabilityTransport ( return EFI_UNSUPPORTED; } =20 - DEBUG ((DEBUG_INFO, " Manageability protocol %s is going to acquire tra= nsport interface token...\n", ManageabilityProtocolName)); + DEBUG ((DEBUG_MANAGEABILITY_INFO, " Manageability protocol %s is going = to acquire transport interface token...\n", ManageabilityProtocolName)); =20 Status =3D AcquireTransportSession (ManageabilityProtocolSpec, Transport= Token); if (Status =3D=3D EFI_UNSUPPORTED) { @@ -199,7 +201,7 @@ HelperAcquireManageabilityTransport ( return EFI_UNSUPPORTED; } =20 - DEBUG ((DEBUG_INFO, "%a: This is the transfer session for %s over %s\n",= __FUNCTION__, ManageabilityProtocolName, ManageabilityTransportName)); + DEBUG ((DEBUG_MANAGEABILITY_INFO, "%a: This is the transfer session for = %s over %s\n", __FUNCTION__, ManageabilityProtocolName, ManageabilityTransp= ortName)); return Status; } =20 @@ -259,3 +261,206 @@ HelperInitManageabilityTransport ( =20 return Status; } + +/** + This function generates CRC8 with given polynomial. + + @param[in] Polynomial Polynomial in 8-bit. + @param[in] CrcInitialValue CRC initial value. + @param[in] BufferStart Pointer to buffer starts the CRC calculatio= n. + @param[in] BufferSize Size of buffer. + + @retval UINT8 CRC value. +**/ +UINT8 +HelperManageabilityGenerateCrc8 ( + IN UINT8 Polynomial, + IN UINT8 CrcInitialValue, + IN UINT8 *BufferStart, + IN UINT32 BufferSize + ) +{ + UINT8 BitIndex; + UINT32 BufferIndex; + + BufferIndex =3D 0; + while (BufferIndex < BufferSize) { + CrcInitialValue =3D CrcInitialValue ^ *(BufferStart + BufferIndex); + BufferIndex++; + + for (BitIndex =3D 0; BitIndex < 8; BitIndex++) { + if ((CrcInitialValue & 0x80) !=3D 0) { + CrcInitialValue =3D (CrcInitialValue << 1) ^ Polynomial; + } else { + CrcInitialValue <<=3D 1; + } + } + } + + return CrcInitialValue; +} + +/** + This function splits payload into multiple packages according to + the given transport interface Maximum Transfer Unit (MTU). + + + @param[in] PreambleSize The additional data size precedes + each package. + @param[in] PostambleSize The additional data size succeeds + each package. + @param[in] Payload Pointer to payload. + @param[in] PayloadSize Payload size in byte. + @param[in] MaximumTransferUnit MTU of transport interface. + @param[out] MultiplePackages Pointer to receive + MANAGEABILITY_TRANSMISSION_MULTI_PACKAG= ES + structure. Caller has to free the memor= y + allocated for MANAGEABILITY_TRANSMISSIO= N_MULTI_PACKAGES. + + @retval EFI_SUCCESS MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES= structure + is returned successfully. + @retval EFI_OUT_OF_RESOURCE Not enough resource to create + MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES= structure. +**/ +EFI_STATUS +HelperManageabilitySplitPayload ( + IN UINT16 PreambleSize, + IN UINT16 PostambleSize, + IN UINT8 *Payload, + IN UINT32 PayloadSize, + IN UINT32 MaximumTransferUnit, + OUT MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES **MultiplePackages + ) +{ + UINT16 NumberOfPackages; + UINT16 IndexOfPackage; + UINT32 PackagePayloadSize; + UINT32 TotalPayloadRemaining; + MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES *ThisMultiplePackages; + MANAGEABILITY_TRANSMISSION_PACKAGE_ATTR *ThisPackage; + + if ((INT16)(MaximumTransferUnit - PreambleSize - PostambleSize) < 0) { + DEBUG (( + DEBUG_ERROR, + "%a: (Preamble 0x%x + PostambleSize 0x%x) is greater than MaximumTra= nsferUnit 0x%x.\n", + __FUNCTION__, + PreambleSize, + PostambleSize, + MaximumTransferUnit + )); + return EFI_INVALID_PARAMETER; + } + + PackagePayloadSize =3D MaximumTransferUnit -PreambleSize - PostambleSi= ze; + NumberOfPackages =3D (UINT16)((PayloadSize + (PackagePayloadSize - 1= )) / PackagePayloadSize); + ThisMultiplePackages =3D (MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES *)Al= locateZeroPool ( + si= zeof (MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES) + + si= zeof (MANAGEABILITY_TRANSMISSION_PACKAGE_ATTR) * NumberOfPackages + ); + if (ThisMultiplePackages =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "%a: Not enough memory for MANAGEABILITY_TRANSMIS= SION_MULTI_PACKAGES\n")); + return EFI_INVALID_PARAMETER; + } + + ThisMultiplePackages->NumberOfPackages =3D NumberOfPackages; + ThisPackage =3D (MANAGEABILITY_TRANSMISSION_P= ACKAGE_ATTR *)(ThisMultiplePackages + 1); + TotalPayloadRemaining =3D PayloadSize; + for (IndexOfPackage =3D 0; IndexOfPackage < NumberOfPackages; IndexOfPac= kage++) { + ThisPackage->PayloadPointer =3D Payload + (IndexOfPackage * PackagePay= loadSize); + ThisPackage->PayloadSize =3D MIN (TotalPayloadRemaining, PackagePay= loadSize); + TotalPayloadRemaining -=3D ThisPackage->PayloadSize; + ThisPackage++; + } + + if (TotalPayloadRemaining !=3D 0) { + DEBUG ((DEBUG_ERROR, "%a: Error processing multiple packages (TotalPay= loadRemaining !=3D 0)\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + *MultiplePackages =3D ThisMultiplePackages; + return EFI_SUCCESS; +} + +/** + Print out manageability transmit payload to the debug output device. + + @param[in] Payload Payload to print. + @param[in] PayloadSize Payload size. + +**/ +VOID +EFIAPI +HelperManageabilityPayLoadDebugPrint ( + IN VOID *Payload, + IN UINT32 PayloadSize + ) +{ + UINT16 Page256; + UINT16 Row16; + UINT16 Column16; + UINT32 RemainingBytes; + UINT32 TotalBytePrinted; + + RemainingBytes =3D PayloadSize; + TotalBytePrinted =3D 0; + while (TRUE) { + if (TotalBytePrinted % 256 =3D=3D 0) { + Page256 =3D (UINT16)TotalBytePrinted / 256; + DEBUG ((DEBUG_MANAGEABILITY_INFO, "=3D=3D=3D=3D=3D=3D=3D=3D Manageab= ility Payload %04xH - %04xH =3D=3D=3D=3D=3D=3D=3D=3D=3D\n", Page256 * 256, = Page256 * 256 + MIN (RemainingBytes, 256) - 1)); + DEBUG ((DEBUG_MANAGEABILITY_INFO, " ")); + for (Column16 =3D 0; Column16 < 16; Column16++) { + DEBUG ((DEBUG_MANAGEABILITY_INFO, "%02x ", Column16)); + } + + DEBUG ((DEBUG_MANAGEABILITY_INFO, "\n ------------------------= -----------------------\n")); + } + + for (Row16 =3D 0; Row16 < 16; Row16++) { + DEBUG ((DEBUG_MANAGEABILITY_INFO, "%04x | ", Page256 * 256 + Row16 *= 16)); + for (Column16 =3D 0; Column16 < MIN (RemainingBytes, 16); Column16++= ) { + DEBUG ((DEBUG_MANAGEABILITY_INFO, "%02x ", *((UINT8 *)Payload + Pa= ge256 * 256 + Row16 * 16 + Column16))); + } + + RemainingBytes -=3D Column16; + TotalBytePrinted +=3D Column16; + if (RemainingBytes =3D=3D 0) { + DEBUG ((DEBUG_MANAGEABILITY_INFO, "\n\n")); + return; + } + + DEBUG ((DEBUG_MANAGEABILITY_INFO, "\n")); + } + + DEBUG ((DEBUG_MANAGEABILITY_INFO, "\n")); + } + + DEBUG ((DEBUG_MANAGEABILITY_INFO, "\n\n")); +} + +/** + Prints a debug message and manageability payload to the debug output dev= ice. + + @param[in] Payload Payload to print. + @param[in] PayloadSize Payload size. + @param[in] Format The format string for the debug message to prin= t. + @param[in] ... The variable argument list whose contents are a= ccessed + based on the format string specified by Format. + +**/ +VOID +EFIAPI +HelperManageabilityDebugPrint ( + IN VOID *Payload, + IN UINT32 PayloadSize, + IN CONST CHAR8 *Format, + ... + ) +{ + VA_LIST Marker; + + VA_START (Marker, Format); + DEBUG ((DEBUG_MANAGEABILITY_INFO, "Manageability Transmission: ")); + DebugVPrint ((UINTN)DEBUG_MANAGEABILITY_INFO, Format, Marker); + HelperManageabilityPayLoadDebugPrint (Payload, PayloadSize); + VA_END (Marker); +} --=20 2.37.1.windows.1