From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from userp2130.oracle.com (userp2130.oracle.com [156.151.31.86]) by mx.groups.io with SMTP id smtpd.web12.4953.1615530437937203933 for ; Thu, 11 Mar 2021 22:27:18 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@oracle.com header.s=corp-2020-01-29 header.b=b8wWNUEy; spf=pass (domain: oracle.com, ip: 156.151.31.86, mailfrom: ankur.a.arora@oracle.com) Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 12C6ACEv178525; Fri, 12 Mar 2021 06:27:15 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2020-01-29; bh=403GKhoEcxX7WidGJ/pPPepIXdVa3BzVG5cEbqee9Yw=; b=b8wWNUEypysTohT+u0zL7+3r9yGjrB5dvZNSixYgn6kQL24vfz5+XYQ37/wtqO5hibZR NK4WIZurz7BM7yCQEndcXokF9Q3hvpCsYJ3FLlaVluwbwnCjDB9EdpLVl4ckIPVqDiWO 3dmA62mz4ORF/EmnrwEiTzU2FywMM4MJeonwFa2Y81zEJE48vXRm0VoftvGPTDhBxbfH BCcTtnMi5guCHIeFt0lKIfPVZ8B9SVcZDoe7WWO+P/qTeTivWY8POSXqEOEFd7RijR3b Ap4+N4FwSszE3Mtun8NFIKv/fSP7MWatGO7T3tMbBCktY7RORmjeNcBx+HrlCFCrqBsg dg== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by userp2130.oracle.com with ESMTP id 37415rgyek-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 12 Mar 2021 06:27:15 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 12C6PApo055289; Fri, 12 Mar 2021 06:27:14 GMT Received: from nam02-dm3-obe.outbound.protection.outlook.com (mail-dm3nam07lp2049.outbound.protection.outlook.com [104.47.56.49]) by userp3020.oracle.com with ESMTP id 374kgw3bqs-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 12 Mar 2021 06:27:14 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MjtXmxi9FWne2I0JgflTvPbccquw7LTgdOSoMpXptTlpEgs63c+UWbyWXem8EJyryLWecMHm9lRkj5xnAfM+ramU2OgeIP9PeiFa8+FIMmEjZQ4lekxG5hH7i8a9bIAMdOVbUxP+c9hN19O8KFCXHnERvEmdVs8fsRI+3BLHgjfsqgGnABWtBxHQuwmJRsjPglRWSXfOS7QhmmxzG62gnNh3kUVT1tZQz2OrppDIFLFKmyVlWeNHh8pXM6o5MNBjX75GEimCI2tIq9wF+FBWvwl4GIjbgntb3uH1UFzLh0gcKsInYsbyrD4dwi1XzQLuBzKcI9UYW22kxHmEXc/PrA== 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-SenderADCheck; bh=403GKhoEcxX7WidGJ/pPPepIXdVa3BzVG5cEbqee9Yw=; b=SOLtRiOWdfjGz1BOcDJvcQRBgIe1uoaaYmyfr2SAyAMFXLDNcVhimwM2BE5Zlyu4TnWLJN2LXQFaHLbxLxxxmERAgtOdYW3ChGvgDs9r8jigI7og9Y7kR2QYwUzk6FgOrtiMCMjzArKvtJxQxjgKSuOHidIWlgloYgkuwv56rMzMgwc3E5nUYnZfe1BeeSnKyMBi1S4unMjk6jx6Fv5MR2qIyEwr63QZTIF3A+Ssa9KGq4NDmWrtIwCoV08Ya7OUSgYtRqup/7W6AfaX4mq1rdod9s7W6ukOWgB4v3OBzkCZJf4sl3Fw8sNlTOqCtSJDb9CjiPhw6f54u/Xnjjhhrw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=403GKhoEcxX7WidGJ/pPPepIXdVa3BzVG5cEbqee9Yw=; b=jdQnX2BfVyM/jdIwEdhkqt5h584/47Wz7bMaHf2IabC63iVw0uBen7klR8q09Q+7yui1gLdhW/0vKJ8Y/OYHR+OeqZRlnDU8A1gCilth/KtOMUw/HfyHTq8HA/yk9odU9xcVQAZiooU12Q5fa+2kPj5vx6o+/UtkdhovY96XzQM= Authentication-Results: edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=none action=none header.from=oracle.com; Received: from SJ0PR10MB4605.namprd10.prod.outlook.com (2603:10b6:a03:2d9::24) by BYAPR10MB3191.namprd10.prod.outlook.com (2603:10b6:a03:14f::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.24; Fri, 12 Mar 2021 06:27:12 +0000 Received: from SJ0PR10MB4605.namprd10.prod.outlook.com ([fe80::a021:790:7ce6:6f16]) by SJ0PR10MB4605.namprd10.prod.outlook.com ([fe80::a021:790:7ce6:6f16%6]) with mapi id 15.20.3912.030; Fri, 12 Mar 2021 06:27:12 +0000 From: "Ankur Arora" To: devel@edk2.groups.io Cc: lersek@redhat.com, imammedo@redhat.com, boris.ostrovsky@oracle.com, Ankur Arora , Jordan Justen , Ard Biesheuvel , Aaron Young Subject: [PATCH v9 06/10] OvmfPkg/SmmCpuFeaturesLib: init CPU ejection state Date: Thu, 11 Mar 2021 22:26:52 -0800 Message-Id: <20210312062656.2477515-7-ankur.a.arora@oracle.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210312062656.2477515-1-ankur.a.arora@oracle.com> References: <20210312062656.2477515-1-ankur.a.arora@oracle.com> X-Originating-IP: [148.87.23.12] X-ClientProxiedBy: MWHPR02CA0018.namprd02.prod.outlook.com (2603:10b6:300:4b::28) To SJ0PR10MB4605.namprd10.prod.outlook.com (2603:10b6:a03:2d9::24) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from prion.us.oracle.com (148.87.23.12) by MWHPR02CA0018.namprd02.prod.outlook.com (2603:10b6:300:4b::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3912.17 via Frontend Transport; Fri, 12 Mar 2021 06:27:11 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b4a56906-7594-4d06-55d1-08d8e51fdf46 X-MS-TrafficTypeDiagnostic: BYAPR10MB3191: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FhJ5OCA3cmI9DdolZ7VUCd92tTXB0DTRSkbdQs+6kXfGZJVMSzyN1ypfIsT+FZSalHw/5uLlvTcCkcUmnXmsm6CY0qok3r4wlrEEUo8LjAkn0L7LaYpmu+rac7BVdlp2WVQ99b0xHXWtOqqtY40XTJlUGJA6yd7B9cM/JJpuTzXv7j8Eb3wwEC0pN7C4uI45WbjiQ6FhFJBh4+4HZugZSVREahvYUbGupF3ruw7tlf548rHr3eqTDaucEvoCLUvFGy9R9lilPFJdYcRu93FtwSyBBI8PWg41RCEkYoeQ2iSHlVsmqmiPoCGeUcOyyM24vRYJ5Mkx8nx9rZS/QeDkCishww84d+iNX01fq1eanqMkr5ULbqweyIE2yIql5nne6gvPLHQZ56Fw/W9E17kF+IA6cp7hXOznms+pCOxMoWxNbqz7R2tqEBl0Z4t7zXB8+Yhphamps3bVyKzGcibeDJv8oO0O07PBFw72JjV78lBwXvWldOPSAShVMiL3HdfKjO2fNfIxuJGgMxWtVFQ7mClZeYd6oRCkw/+wX4bl5n+XlcVKzQq1D9AdrPqXFhtXAk9bYTabX0BDjEp8r5o+ao2H+v5GgxJcvrp25EFnOX8= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR10MB4605.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(346002)(39860400002)(396003)(376002)(366004)(136003)(54906003)(86362001)(4326008)(36756003)(478600001)(66556008)(66476007)(66946007)(316002)(83380400001)(5660300002)(2906002)(6916009)(103116003)(966005)(6486002)(26005)(2616005)(956004)(6666004)(186003)(107886003)(7696005)(16526019)(52116002)(1076003)(8936002)(8676002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?5tuFN4OCKGiRgbV1EPqu4DoQ5HMXwOtrQqCR4PLTlcG+bBOpasPbwtmSZAEC?= =?us-ascii?Q?F56srpnYxh7x/obLiTcEWkbthsZGzNpGXTFucXd3ulzHS5WQ1WoZAZ1d2GTV?= =?us-ascii?Q?KbpumQ8SnUrdI43GwvwwIC/wEv6Wa6NPforSryo0DdBTD3nrHKIa1IdJkx5B?= =?us-ascii?Q?jkdBDuHbjoYykyj8xkVfMtfR45ojGdkkJxhe7ChDDiwgPjQEBZajxVliXSDq?= =?us-ascii?Q?berWKD9cy1XU+L68k2tAoPIBTVRBjmKIe2X5V0+plOcZu4tnvhSe4XC69VhU?= =?us-ascii?Q?h7It9tJsWXUHBOSbtVYkjWSZ2NvPWhVCXdF+uXKfD5CWKrU3nPTeGvc+Q3dh?= =?us-ascii?Q?PTnJ4tW7OeVOK4VXe+R/4EGR0eJP4CuowP+GsnEmF1vO60kwFORDZFwgEGrz?= =?us-ascii?Q?6U+yrBaQj7+xJkT9DZWmSUkr8GY4HF5wgpFFRXyA7YV4VHHghaD85iCvZSWj?= =?us-ascii?Q?XA2HQs2Rfi6UgUo2lcziWC8SiM4h6VNkHqLvamkDemr1xEE5Xq+udn1QEPXU?= =?us-ascii?Q?8LmiR0DUM6hAwDr1gH55qOYg3bBsdJ3kdgnhm/jDX9Z/NnQaf1ZjUtg6IjjQ?= =?us-ascii?Q?k9DKA19i5XExP3nOrWTeR6UVM0vRxZFFlCkhSXdzQN0Dyd9vD+XH3t5y6hmK?= =?us-ascii?Q?h+jl+H8Wtepep2Fh+5x9GataKJ+QDX45JqmJhaJldO2Koc8E7niY8iMQrjPp?= =?us-ascii?Q?Qwc71J5uob/tLeejedMLarG9tpaLWmqsR8oDmQUladKTO4qjrRXXk+HwoGyd?= =?us-ascii?Q?wwFJmy7pLC5YRF3NPJJbae3jqlb6QzDbQAqBXyJLwKXJvk51E+tMlOQEUUv1?= =?us-ascii?Q?NnBz4N9ULO5Ar8RfNfdCWNEm6NS1+mvuxyBuhevbCBXBBaXC7BfslpVmQIye?= =?us-ascii?Q?Xkv07zob6L4Y9gkHyhTaB6TWx2aQaozBzYHouoytxgJyOugnD7SAEFKpmpYJ?= =?us-ascii?Q?UWkWmpviXZsTzF0k6kwBViiM82fbO//xD+P95z0kXtDKb6wtm2bpCQZE0HsN?= =?us-ascii?Q?Qhat5UNhzM/Ga03ukZyGI1RX2gSOk1y3oie9A33VhrWSjRL1OIcWHGu1c5cS?= =?us-ascii?Q?yyJfujDs1SyTJDKvtVem8rSYWUXbpC2FJYxexwVClq1k+36gT+1sjzA0BI9G?= =?us-ascii?Q?birXjYFmDdIo6qsgAxg/llyJnDMqDkfSFoiDqqO0vn6nQG+Db5yXTRJUq9zp?= =?us-ascii?Q?2sT39TsJ54e4IjJg8YGrzDabqNA5taEJKimiKiKxO9J55REVXtNaK7odVmAW?= =?us-ascii?Q?yEznxOhDC7VW7FC7wGTcFUWCaet3/NjJLuw77n+gyUDje7wF5KW7goFOBnPD?= =?us-ascii?Q?+m9MjGMtlXJameeka3SgF9y0?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: b4a56906-7594-4d06-55d1-08d8e51fdf46 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR10MB4605.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Mar 2021 06:27:12.7751 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 11zJSz0bRH14k3MnS5zHtotRgcT0s+CVz/ighLZZpuVhMO7EqtJV+vlS1/s/K6Eo/lXEjC5kE3Pmr2JDlrw31FQUfwZIb4+Uu+FGlskm6eg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR10MB3191 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9920 signatures=668683 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 adultscore=0 malwarescore=0 bulkscore=0 suspectscore=0 mlxscore=0 mlxlogscore=999 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2009150000 definitions=main-2103120044 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9920 signatures=668683 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 lowpriorityscore=0 impostorscore=0 mlxlogscore=999 malwarescore=0 suspectscore=0 adultscore=0 phishscore=0 spamscore=0 priorityscore=1501 bulkscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2009150000 definitions=main-2103120043 Content-Transfer-Encoding: 8bit Content-Type: text/plain Init CPU_HOT_EJECT_DATA, which will be used to share CPU ejection state between SmmCpuFeaturesLib (via PiSmmCpuDxeSmm) and CpuHotPlugSmm. The init happens via SmmCpuFeaturesSmmRelocationComplete(), and so it will run as part of the PiSmmCpuDxeSmm entry point function, PiCpuSmmEntry(). Once inited, CPU_HOT_EJECT_DATA is exposed via PcdCpuHotEjectDataAddress. The CPU hot-eject handler (CPU_HOT_EJECT_DATA->Handler) is setup when there is an ejection request via CpuHotplugSmm. Cc: Laszlo Ersek Cc: Jordan Justen Cc: Ard Biesheuvel Cc: Igor Mammedov Cc: Boris Ostrovsky Cc: Aaron Young Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3132 Signed-off-by: Ankur Arora --- Notes: Addresses the following comments from v8: (1) Remove line before the "if (MaxNumberofCpus == 1)" check. (3) Fixup the space around "||". (2,6) Simplify the three SafeInt multiplication into the ones suggested by Laszlo. (4) Get rid of the mixed sizeof(mCpuHotEjectData->QemuSelectorMap[0]) and sizeof(UINT64) in favour of UINT64 everywhere. I was planning to use the first, but describing the alignment needed is easier in terms of the second. Also, as Laszlo's comments on v8-patch-9 mention, we don't really need this alignment for correctness reasons. This patch retains it, so we don't pay access penalty for unaligned access. (5) Change alignment from UINT64 to UINT64-1. (7) Use the more idiomatic ALIGN_POINTER instead of ALIGN_VALUE. (8) RETURN_ERROR -> ASSERT_RETURN_ERROR. .../SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf | 4 ++ .../Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 77 ++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf index 97a10afb6e27..8a426a4c10fb 100644 --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf @@ -30,9 +30,13 @@ [LibraryClasses] BaseMemoryLib DebugLib MemEncryptSevLib + MemoryAllocationLib PcdLib + SafeIntLib SmmServicesTableLib UefiBootServicesTableLib [Pcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber + gUefiOvmfPkgTokenSpaceGuid.PcdCpuHotEjectDataAddress gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c index 7ef7ed98342e..5c025bc717c3 100644 --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c @@ -11,10 +11,13 @@ #include #include #include +#include #include +#include #include #include #include +#include #include #include #include @@ -171,6 +174,77 @@ SmmCpuFeaturesHookReturnFromSmm ( return OriginalInstructionPointer; } +STATIC CPU_HOT_EJECT_DATA *mCpuHotEjectData = NULL; + +/** + Initialize mCpuHotEjectData if PcdCpuMaxLogicalProcessorNumber > 1. + + Also setup the corresponding PcdCpuHotEjectDataAddress. +**/ +STATIC +VOID +InitCpuHotEjectData ( + VOID + ) +{ + UINTN Size; + UINT32 Idx; + UINT32 MaxNumberOfCpus; + RETURN_STATUS PcdStatus; + + MaxNumberOfCpus = PcdGet32 (PcdCpuMaxLogicalProcessorNumber); + if (MaxNumberOfCpus == 1) { + return; + } + + // + // We allocate CPU_HOT_EJECT_DATA and CPU_HOT_EJECT_DATA->QemuSelectorMap[] + // in a single allocation, and explicitly align the QemuSelectorMap[] (which + // is a UINT64 array) at its natural boundary. + // Accordingly, allocate: + // sizeof(*mCpuHotEjectData) + (MaxNumberOfCpus * sizeof(UINT64)) + // and, add sizeof(UINT64) - 1 to use as padding if needed. + // + + if (RETURN_ERROR (SafeUintnMult (MaxNumberOfCpus, sizeof (UINT64), &Size)) || + RETURN_ERROR (SafeUintnAdd (Size, sizeof (*mCpuHotEjectData), &Size)) || + RETURN_ERROR (SafeUintnAdd (Size, sizeof (UINT64) - 1, &Size))) { + DEBUG ((DEBUG_ERROR, "%a: invalid CPU_HOT_EJECT_DATA\n", __FUNCTION__)); + goto Fatal; + } + + mCpuHotEjectData = AllocatePool (Size); + if (mCpuHotEjectData == NULL) { + ASSERT (mCpuHotEjectData != NULL); + goto Fatal; + } + + mCpuHotEjectData->Handler = NULL; + mCpuHotEjectData->ArrayLength = MaxNumberOfCpus; + + mCpuHotEjectData->QemuSelectorMap = ALIGN_POINTER (mCpuHotEjectData + 1, + sizeof (UINT64)); + // + // We use mCpuHotEjectData->QemuSelectorMap to map + // ProcessorNum -> QemuSelector. Initialize to invalid values. + // + for (Idx = 0; Idx < mCpuHotEjectData->ArrayLength; Idx++) { + mCpuHotEjectData->QemuSelectorMap[Idx] = CPU_EJECT_QEMU_SELECTOR_INVALID; + } + + // + // Expose address of CPU Hot eject Data structure + // + PcdStatus = PcdSet64S (PcdCpuHotEjectDataAddress, + (UINTN)(VOID *)mCpuHotEjectData); + ASSERT_RETURN_ERROR (PcdStatus); + + return; + +Fatal: + CpuDeadLoop (); +} + /** Hook point in normal execution mode that allows the one CPU that was elected as monarch during System Management Mode initialization to perform additional @@ -188,6 +262,9 @@ SmmCpuFeaturesSmmRelocationComplete ( UINTN MapPagesBase; UINTN MapPagesCount; + + InitCpuHotEjectData (); + if (!MemEncryptSevIsEnabled ()) { return; } -- 2.9.3