From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (NAM11-BN8-obe.outbound.protection.outlook.com [40.107.236.40]) by mx.groups.io with SMTP id smtpd.web08.4456.1662638553417298915 for ; Thu, 08 Sep 2022 05:02:33 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@amd.com header.s=selector1 header.b=oLGbG3Y1; 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.236.40, mailfrom: abner.chang@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YDAndzL2JOWUxeD5QqB7N4wyhlHRzQUVIGTlSZfhhy7Ghvt8YCBmtTnkWcilN1S8BUQwdeRUT8gngis64WcBy4/55IYSd0m7hU0Me5NxgZovplJ7IygxKOqlMdV/JKlUEYQkZgz4/OFg/lvTj6J/m8kAP6auBl2XWZbSc6pvtnU2+busy+2zjmwn95BC0PRKRGo+pGGyjYOzGRisKKuSglHQ6QZ1bLh4xkMvaiDFHmy2UJVlYO0+rlrIa/3aSrOiDQHR4+Z8B9bkGhRTFJe4pTafUI74vHrH/JdnV/baS2WWtSMFR8Casi2PZo7uPtTC7Q/liRNUqgWZ3Rbw6xwhIg== 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=pV2ptftzVQJwn3ODDx2ahYeqx1uuUOZHob9kE5rMk9E=; b=eQvB471yLBwSyJ1zfhbrtqeQkOECRjKsloaWrIoD/S2cENfSt0W5UNwEGUWdY+hUv8QiijmjyNO08qnv9a2zXfEBoHZ1/7KxE/yFRLfpru9xhYgIIs619cJ83396ndKA552AG34EpQKvc1n1wiSPsjI49M9WaluclLx0r4UspkuQ1dDRkhqL+7EimBRL4LhEFngszRw0qapEvRnaJLepg7W3yv4wwLzdBdlbuj6P4NiopJg/8aqnF8AOY04JafgecQvn3YEdWOQP5nh0dHRofYAaek/RLveX4NlXXsftmZPQDhJB+MLECZxwqRCj7geUyWJGlgJcyCxISEav7aorxA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; 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=pV2ptftzVQJwn3ODDx2ahYeqx1uuUOZHob9kE5rMk9E=; b=oLGbG3Y1RHjW3wgBnCo1W4E9WiWOlbfw63tmgj9t6fjSe58aaIvimwKz3b2B16PVTAPT0vbQBkGix6lSEfDoGnFNm6WYnQ1B7lLwiZm3afjKAORBJi/bDweClNU42ZbK85XuLgR7iyrrwotoiXDSZwPUvTsD8QKmEw6YTwpDTXs= Received: from MN2PR12MB3966.namprd12.prod.outlook.com (2603:10b6:208:165::18) by CH0PR12MB5186.namprd12.prod.outlook.com (2603:10b6:610:b9::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.19; Thu, 8 Sep 2022 12:02:30 +0000 Received: from MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::9c44:17db:7f29:1fa8]) by MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::9c44:17db:7f29:1fa8%7]) with mapi id 15.20.5612.018; Thu, 8 Sep 2022 12:02:30 +0000 From: "Chang, Abner" To: Sunil V L CC: "devel@edk2.groups.io" , Jian J Wang , Liming Gao , Eric Dong , Ray Ni , Rahul Kumar , Debkumar De , Catharine West , Daniel Schaefer , Leif Lindholm , Ard Biesheuvel , Heinrich Schuchardt , Anup Patel Subject: Re: [RFC PATCH 16/17] UefiCpuPkg/CpuDxe: Add RISC-V support in CpuDxe module Thread-Topic: [RFC PATCH 16/17] UefiCpuPkg/CpuDxe: Add RISC-V support in CpuDxe module Thread-Index: AQHYwhOEM4tOyeKwVkOhYP930mqeB63Tqn+ggAApdYCAABLjUIABd24AgAAS0DA= Date: Thu, 8 Sep 2022 12:02:30 +0000 Message-ID: References: <20220906170837.491525-1-sunilvl@ventanamicro.com> <20220906170837.491525-17-sunilvl@ventanamicro.com> <20220907112203.GA43296@sunil-laptop> <20220908105322.GA103934@sunil-laptop> In-Reply-To: <20220908105322.GA103934@sunil-laptop> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Enabled=true; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SetDate=2022-09-08T12:02:25Z; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Method=Standard; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Name=General; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SiteId=3dd8961f-e488-4e60-8e11-a82d994e183d; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ActionId=858dff9a-2e84-4d24-b39d-ad99b1d5ce26; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ContentBits=1 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MN2PR12MB3966:EE_|CH0PR12MB5186:EE_ x-ms-office365-filtering-correlation-id: 6aed093f-428a-492e-3384-08da91920183 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: EbUbjsWJxWHg3FoOD2pG3o1QWtkVuFV3P8NSxWhQTq8Q1pra5yMXopA0LRcuFUVOK/A+eTAbdEOSj+8wf5m2S7Z9tbxBUpo02ghgxerpFyRGxhlY31WpaJhrKJBcEXePaORhu3bJlnq8WoyAJ5fvUl+69t3sIoGp6tIluHx3GfgD2av6hmG7PmVGP2c82Ac8DcfVLWBZcHlbGXIgonOQVCbC9A6DO6Fd4CtgflwMTLhGd93sQGRCPYAC8sD78A+hFyXhOQ2CHVco3kdCg/sAESx/xqTghyAnN2IR/rRg3OcyYLJOYGvgG9IeyJEQWPwNTZ8e8V8tUVKTmJjB0ezb4rxNSsvdT8KsG5mFxcW+kAnsxlhGSScQMXrP0/iNDYnun6h6JBE8YyI61kut2vOTG6576uOxGtbnoFzX5JDx99Chuy448gxIN2VGzcE0UBysTqLwuDR4stTskj3IMM9dK9L+KsGyr9BnpgUal+GTK0xlY9IISHLgvMKfUMvyD7U/Mrh7JONTHhje9X6dtBobRd4Kdt0d488537EXOqRu3MLHpAAuW6LVHu+/QawU6frkhUYgKpMSHgwp650Kg0hR/ryPLwbDKGW40gjP38UXp+BP8lMXbCGPiOCv9PDcYXyWm0tENKUqLzYiPK5eVakbRIwLqoM+3QZIlzR95dGRXj9lzpOFE5slIM97ucjLbBwqkMIP0SQ0jW78MO880B3MKqAUzRuDkPoVfEzf8LnanGJ0igSXzNkxLVZH52u1XIkkhhkZa7AA0+uJ4ep67OHJ/wmodZlDu5uC1LXv7GyQD0wKPq3UVVLT8tAEobVGwcEN x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR12MB3966.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(396003)(376002)(136003)(346002)(39860400002)(366004)(83380400001)(966005)(38070700005)(30864003)(52536014)(45080400002)(19627235002)(478600001)(7416002)(86362001)(2906002)(8936002)(76116006)(66946007)(64756008)(8676002)(66476007)(66556008)(316002)(6916009)(66446008)(4326008)(55016003)(122000001)(5660300002)(38100700002)(54906003)(53546011)(9686003)(7696005)(6506007)(26005)(41300700001)(186003)(33656002)(71200400001)(579004)(559001)(44824005);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?8bEoYp0pdglknC83k8i6OJ9k4QVJ+gCmOKByV7vEBNMB5UEQgwED9Z16P2Fo?= =?us-ascii?Q?XOp/eoPq19xqUOSGmb0ZGyxMtDefGdORPlIB+GxjQzQVZSOBam/KqTLqpXa7?= =?us-ascii?Q?6IzXO4haljUBBxPST4LCIY24KS+SUL4NLbjN53k+oEkrMTM9HcSiGVyx7T2V?= =?us-ascii?Q?Xjbrl4waiGBANjN7g6SEebqefjizvTZALBVU0b/hyMuCqindyLQkyox7Ey/9?= =?us-ascii?Q?rpLuZ8qafvvCbRF0elEGtPLRHGAibKzHHMOZYMl8hFWO9D/GbSb+i5/k6ZTO?= =?us-ascii?Q?VXTZc6j1o/oNHskq/U9nhDvA8R0jhLRtiKCLJQkXgT8zF+CzxnFNLGCl+fYt?= =?us-ascii?Q?fQDeFZTvFUDAn5UedDrlP/W3uP55pZBA+YmrILIpejQh/JfHGZOUKvtmELRS?= =?us-ascii?Q?giwxeK4qNR+olExnULjfM40AnVI+gxUvGraDdKl81a4UUNQuN11W3/v0/DUP?= =?us-ascii?Q?yuPyG3lHHAACURcSbvAfRhSW4Tw0v6/amL3OHSQkxqvnSEXY8xqgiY0J4eNh?= =?us-ascii?Q?VpWKy1faXUxJ2U+AAgbMMoyoHC7xT1oMxmLghhtld7Lmsp0SY+pHji4QWo1E?= =?us-ascii?Q?Pa858+kcV+s5HKWj1v3gZGxXr2gw5lolGYMnMBNs0k3jJzjfH3MNTrAbLZF4?= =?us-ascii?Q?m6yapGPQmn9Hua3jF5teFYS3XOge+r3p2p6+0mzdAmgVPhY+Un/kSsmivomC?= =?us-ascii?Q?J8M109bJKa21usznpU8a4huO7/EKSp1fGC+6EygbuMvotz7DGyTcVYsHjSxO?= =?us-ascii?Q?2Q5e3E00onEWOnVqawnRw+/jPb1BNwek61+m7ElNzLMtqQD4CcyHev3IIzY8?= =?us-ascii?Q?IPF9xCi8hyYQH0WXvqwpOb4JHk7ILU1VQzH2lPHf4l+kh3nJFT3N87Kl0aPz?= =?us-ascii?Q?cGSBun+lOFnj938UlaNwRqgL9zRV1qANfypUlNYw4XXEsKadj2+vV+ix/ZTw?= =?us-ascii?Q?6KXRPiyg554bzHGBHIoHCpKvFh8n7ey59G0nAfRDNWnpg+5gzbbLv/E58h2K?= =?us-ascii?Q?KkwSsYyOQtaHEOXep5GRY/Ke1J3TNVpyKCy0Tne07Lbcrx/wNJkjoSKviw8R?= =?us-ascii?Q?57ca0hdaKsFMQwoPlI9YPUII20uZpWOQW4fbs9uEm0wb5qynGdN814oNSCoI?= =?us-ascii?Q?OEeD8Zn/NN+E411uFc7d421Bu+W15Mm1Rcn1uQGrYVYCUASYDlS6hZ1Bu9Nl?= =?us-ascii?Q?9K2U39lK/7O9Nfk+RkKXZ9qYrlv/HtLVmNLH2Q+2XhOze9hG15KOxVGaPXjM?= =?us-ascii?Q?WAIzEk8EI11d3hR9zerDhN0rDlG4bMobxqo4YjmgHFNr2mPXXBecBFjoFECf?= =?us-ascii?Q?GGWnZ2hHbc3LoBw0ngdxBoBOhyDpvqKGfI986zctXG/9VeBxGITkfUyNhn1m?= =?us-ascii?Q?lgIa+mr7eDI5a2A6JeR1wk0GEdmhUPjNTYawrdVv68NYS3HkAqIxIoTR+/09?= =?us-ascii?Q?CAZ+8jzUXY88+gjJBS6I3mnskApLLJ3hZULS7xcDl/iim11S0sKS6tZPMC3W?= =?us-ascii?Q?Lz+iqx0MvrixWLTJRiDxKey58yswyDDaoKJguhgqiJHGunzwAZOGgcYCYsYu?= =?us-ascii?Q?9Ap5vPmOl4sMtiMhe24nyN86XPGE4RBcaSy6FP9N?= MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3966.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6aed093f-428a-492e-3384-08da91920183 X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Sep 2022 12:02:30.2506 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: pcsPvbtzUAkyiSSXx2ABHWcx6IN+HH1KUystlOxdig4+tsKOV8p94WNr6I43/srNZu+RL9m1duKgy/bEOux56w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB5186 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable [AMD Official Use Only - General] > -----Original Message----- > From: Sunil V L > Sent: Thursday, September 8, 2022 6:53 PM > To: Chang, Abner > Cc: devel@edk2.groups.io; Jian J Wang ; Liming Gao > ; Eric Dong ; Ray Ni > ; Rahul Kumar ; Debkumar De > ; Catharine West ; > Daniel Schaefer ; Leif Lindholm > ; Ard Biesheuvel ; Heinrich > Schuchardt ; Anup Patel > > Subject: Re: [RFC PATCH 16/17] UefiCpuPkg/CpuDxe: Add RISC-V support in > CpuDxe module >=20 > [CAUTION: External Email] >=20 > On Wed, Sep 07, 2022 at 12:46:59PM +0000, Chang, Abner wrote: > > [AMD Official Use Only - General] > > > > > > > > > -----Original Message----- > > > From: Sunil V L > > > Sent: Wednesday, September 7, 2022 7:22 PM > > > To: Chang, Abner > > > Cc: devel@edk2.groups.io; Jian J Wang ; > > > Liming Gao ; Eric Dong > > > ; Ray Ni ; Rahul Kumar > > > ; Debkumar De ; > > > Catharine West ; Daniel Schaefer > > > ; Leif Lindholm ; > > > Ard Biesheuvel ; Heinrich Schuchardt > > > ; Anup Patel > > > > > > Subject: Re: [RFC PATCH 16/17] UefiCpuPkg/CpuDxe: Add RISC-V support > > > in CpuDxe module > > > > > > [CAUTION: External Email] > > > > > > On Wed, Sep 07, 2022 at 09:32:12AM +0000, Chang, Abner wrote: > > > > [AMD Official Use Only - General] > > > > > > > > Hi Sunil and UefiCpuPkg maintainers, For CpuDxe case, I think we > > > > should abstract CpuDxe to accommodate all > > > processor architectures instead of having copy for each archs. > > > CpuDxeCommon.c can have the generic protocol structure and the > > > installation functions, and CpuDxeCommon.h has the general > > > definitions. So does CpuMp related files. Move processor > > > architecture dependent files to under arch folders. AMD may have > > > some differences with Intel so we will have CpuDxeAmd.inf under > > > CpuDxe\. AMD is revising SmmFeatureCpuLib base on the similar > > > concept. I think this makes the module looks simple and > > > architectural. Furthermore, the similar concept should apply to all > > > modules (if > > > necessary) under UefiCpuPkg. > > > > I think we should revise CpuDxe before adding new arch such as > > > > RISC-V > > > and Loongson64 to this module. > > > Thanks Abner!. I have sent V2 in the current form itself since I had > > > to move DSC to OvmfPkg instead of edk2-platforms. > > > > > > I am not sure whether we really need this level of restructuring > > > since I didn't find much to share between architectures. Thats why, > > > I just made current sources as x86 speicifc and added RISC-V sources. > > > Anyway, let me wait for maintainers feedback. > > I was also struggled with UefiCpuPkg when I tried to move RISC-V stuff > over here. Some modules are easy to be abstracted but some are not. Some > as you mentioned have not much to share among processor archs. For these > cases we can use folder or a separate module for the abstraction. Having = X86 > source code on the module root and other processor archs in the folder lo= ok > weird though. > > > > >Do you have a patch already > > > for this restructuring? If so, I can rebase RISC-V changes on top of > > >it if maintainers accept the approach. > > No, I don't have that yet. But I am willing to help on restructuring t= his > module and others if maintainers agree with this. > That's great!. Could you please take care of refactoring > DxeCpuExceptionHandlerLib also in UefiCpuPkg along with CpuDxe as soon > as maintainers agree? That would be very helful. Yes, I can do it together. Abner >=20 > Thanks > Sunil > > Thanks > > Abner > > > > > > Thanks > > > Sunil > > > > > > > > Here is a BZ for UefiCpuPkg rearchitecture, > > > > > > > > https://nam11.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fbu > > > gz > > > > > > > > illa.tianocore.org%2Fshow_bug.cgi%3Fid%3D3860&data=3D05%7C01%7CA > > > bner > > > > > .Chang%40amd.com%7Cc9bca42bd85c489c38ff08da90c33618%7C3dd8961fe > > > 4884e60 > > > > > > > > 8e11a82d994e183d%7C0%7C0%7C637981465382450232%7CUnknown%7CTW > > > FpbGZsb3d8 > > > > > > > > eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3 > > > D%7C3 > > > > > > > > 000%7C%7C%7C&sdata=3DiDjOPZCMAH6BSBhR2kx567ibVHza2ZfhjzLHC77 > > > cfI8%3D& > > > > amp;reserved=3D0 > > > > > > > > Abner > > > > > > > > Something looks like below, > > > > CpuDxe\X86\Ia32\ > > > > \IA32\CpuAsm.asm > > > > \IA32\PageAttribute.c > > > > \X86\X64\ > > > > \X64\CpuAsm.asm > > > > \X64\PageAttribute.c > > > > \X86\CpuGdt.c > > > > \CpuGdt.h > > > > \CpuPageTable.C > > > > \CpuPageTableh.h > > > > \CpuDxe.c > > > > \RISCV\RISCV64\ > > > > \RISCV64\CpuDxe.h > > > > \CpuDxe.c > > > > \ARM\ARM\ > > > > \AARCH64\ > > > > \CpuDxe.c > > > > \CpuDxeCommon.c > > > > \CpuMpCommon.c > > > > \CpuDxeCommon.h > > > > \CpuMpCommon.h > > > > \CpuDxe.inf > > > > > > > > > > > > > -----Original Message----- > > > > > From: Sunil V L > > > > > Sent: Wednesday, September 7, 2022 1:09 AM > > > > > To: devel@edk2.groups.io > > > > > Cc: Jian J Wang ; Liming Gao > > > > > ; Eric Dong ; Ray > > > > > Ni ; Rahul Kumar ; > > > > > Debkumar De ; Catharine West > > > > > ; Daniel Schaefer > > > > > ; Chang, Abner ; > > > > > Leif Lindholm ; Ard Biesheuvel > > > > > ; Heinrich Schuchardt > > > > > ; Anup Patel > > > > > ; Sunil V L > > > > > Subject: [RFC PATCH 16/17] UefiCpuPkg/CpuDxe: Add RISC-V support > > > > > in CpuDxe module > > > > > > > > > > [CAUTION: External Email] > > > > > > > > > > This DXE module initializes the RISC-V CPU by installing the CPU > > > > > specific ARCH protocol handlers. This also initializes the > > > > > RISCV_EFI_BOOT_PROTOCOL which is required on RISC-V platforms. > > > > > > > > > > Signed-off-by: Sunil V L > > > > > --- > > > > > UefiCpuPkg/CpuDxe/CpuDxe.inf | 16 +- > > > > > UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c | 337 > > > > > +++++++++++++++++++++++++++++ > > > > > UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h | 200 +++++++++++++++++ > > > > > 3 files changed, 552 insertions(+), 1 deletion(-) create mode > > > > > 100644 UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c > > > > > create mode 100644 UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h > > > > > > > > > > diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf > > > > > b/UefiCpuPkg/CpuDxe/CpuDxe.inf index 4f2ea42f16..17cf2b1ecd > > > > > 100644 > > > > > --- a/UefiCpuPkg/CpuDxe/CpuDxe.inf > > > > > +++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf > > > > > @@ -1,8 +1,12 @@ > > > > > ## @file > > > > > > > > > > -# CPU driver installs CPU Architecture Protocol and CPU MP prot= ocol. > > > > > > > > > > +# On X86, CPU driver installs CPU Architecture Protocol and > > > > > +CPU MP > > > > > protocol. > > > > > > > > > > +# > > > > > > > > > > +# On RISC-V, CPU driver installs CPU Architecture Protocol and > > > > > +RISC-V boot > > > > > > > > > > +# protocol > > > > > > > > > > # > > > > > > > > > > # Copyright (c) 2008 - 2019, Intel Corporation. All rights > > > > > reserved.
> > > > > > > > > > # Copyright (c) 2017, AMD Incorporated. All rights > > > > > reserved.
> > > > > > > > > > +# Copyright (c) 2022, Ventana Micro Systems Inc. All rights > > > > > +reserved.
> > > > > > > > > > # > > > > > > > > > > # SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > > > > > # > > > > > > > > > > @@ -44,6 +48,9 @@ > > > > > MtrrLib > > > > > > > > > > UefiCpuLib > > > > > > > > > > > > > > > > > > > > +[LibraryClasses.RISCV64] > > > > > > > > > > + RiscVSbiLib > > > > > > > > > > + > > > > > > > > > > [Sources.IA32, Sources.X64] > > > > > > > > > > CpuDxe.c > > > > > > > > > > CpuDxe.h > > > > > > > > > > @@ -62,11 +69,18 @@ > > > > > X64/CpuAsm.nasm > > > > > > > > > > X64/PagingAttribute.c > > > > > > > > > > > > > > > > > > > > +[Sources.RISCV64] > > > > > > > > > > + RiscV64/CpuDxe.c > > > > > > > > > > + RiscV64/CpuDxe.h > > > > > > > > > > + > > > > > > > > > > [Protocols] > > > > > > > > > > gEfiCpuArchProtocolGuid ## PRODUCES > > > > > > > > > > gEfiMpServiceProtocolGuid ## PRODUCES > > > > > > > > > > gEfiSmmBase2ProtocolGuid ## SOMETIMES_CON= SUMES > > > > > > > > > > > > > > > > > > > > +[Protocols.RISCV64] > > > > > > > > > > + gRiscVEfiBootProtocolGuid ## PRODUCES > > > > > > > > > > + > > > > > > > > > > [Guids] > > > > > > > > > > gIdleLoopEventGuid ## CONSUMES = ## Event > > > > > > > > > > gEfiVectorHandoffTableGuid ## SOMETIMES_CON= SUMES > ## > > > > > SystemTable > > > > > > > > > > diff --git a/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c > > > > > b/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c > > > > > new file mode 100644 > > > > > index 0000000000..4112b6b8c6 > > > > > --- /dev/null > > > > > +++ b/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c > > > > > @@ -0,0 +1,337 @@ > > > > > +/** @file > > > > > > > > > > + RISC-V CPU DXE driver. > > > > > > > > > > + > > > > > > > > > > + Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Developm= ent > LP. > > > > > + All rights reserved.
> > > > > > > > > > + Copyright (c) 2022, Ventana Micro Systems Inc. All rights > > > > > + reserved.
> > > > > > > > > > + > > > > > > > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > + > > > > > > > > > > +#include > > > > > > > > > > +#include > > > > > > > > > > +#include "CpuDxe.h" > > > > > > > > > > + > > > > > > > > > > +// > > > > > > > > > > +// Global Variables > > > > > > > > > > +// > > > > > > > > > > +STATIC BOOLEAN mInterruptState =3D FALSE; > > > > > > > > > > +STATIC EFI_HANDLE mCpuHandle =3D NULL; > > > > > > > > > > +STATIC UINTN mBootHartId; > > > > > > > > > > +RISCV_EFI_BOOT_PROTOCOL gRiscvBootProtocol; > > > > > > > > > > + > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +RiscvGetBootHartId ( > > > > > > > > > > + IN RISCV_EFI_BOOT_PROTOCOL *This, > > > > > > > > > > + OUT UINTN *BootHartId > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + if((This !=3D &gRiscvBootProtocol) || (BootHartId =3D=3D NULL)= ) { > > > > > > > > > > + return EFI_INVALID_PARAMETER; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + *BootHartId =3D mBootHartId; > > > > > > > > > > + return EFI_SUCCESS; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +RISCV_EFI_BOOT_PROTOCOL gRiscvBootProtocol =3D { > > > > > > > > > > + RISCV_EFI_BOOT_PROTOCOL_LATEST_VERSION, > > > > > > > > > > + RiscvGetBootHartId > > > > > > > > > > +}; > > > > > > > > > > + > > > > > > > > > > +EFI_CPU_ARCH_PROTOCOL gCpu =3D { > > > > > > > > > > + CpuFlushCpuDataCache, > > > > > > > > > > + CpuEnableInterrupt, > > > > > > > > > > + CpuDisableInterrupt, > > > > > > > > > > + CpuGetInterruptState, > > > > > > > > > > + CpuInit, > > > > > > > > > > + CpuRegisterInterruptHandler, > > > > > > > > > > + CpuGetTimerValue, > > > > > > > > > > + CpuSetMemoryAttributes, > > > > > > > > > > + 1, // NumberOfTimers > > > > > > > > > > + 4 // DmaBufferAlignment > > > > > > > > > > +}; > > > > > > > > > > + > > > > > > > > > > +// > > > > > > > > > > +// CPU Arch Protocol Functions > > > > > > > > > > +// > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Flush CPU data cache. If the instruction cache is fully > > > > > + coherent > > > > > > > > > > + with all DMA operations then function can just return EFI_SUCC= ESS. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param Start Physical address to start flushing f= rom. > > > > > > > > > > + @param Length Number of bytes to flush. Round up t= o > chipset > > > > > > > > > > + granularity. > > > > > > > > > > + @param FlushType Specifies the type of flush operatio= n to > > > perform. > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If cache was flushed > > > > > > > > > > + @retval EFI_UNSUPPORTED If flush type is not supported. > > > > > > > > > > + @retval EFI_DEVICE_ERROR If requested range could not be > flushed. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuFlushCpuDataCache ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN EFI_PHYSICAL_ADDRESS Start, > > > > > > > > > > + IN UINT64 Length, > > > > > > > > > > + IN EFI_CPU_FLUSH_TYPE FlushType > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + return EFI_SUCCESS; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Enables CPU interrupts. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If interrupts were enabled in the CP= U > > > > > > > > > > + @retval EFI_DEVICE_ERROR If interrupts could not be enabled > > > > > + on the > > > CPU. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuEnableInterrupt ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + EnableInterrupts (); > > > > > > > > > > + mInterruptState =3D TRUE; > > > > > > > > > > + return EFI_SUCCESS; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Disables CPU interrupts. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If interrupts were disabled in the C= PU. > > > > > > > > > > + @retval EFI_DEVICE_ERROR If interrupts could not be disabled > > > > > + on the > > > CPU. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuDisableInterrupt ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + DisableInterrupts (); > > > > > > > > > > + mInterruptState =3D FALSE; > > > > > > > > > > + return EFI_SUCCESS; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Return the state of interrupts. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param State Pointer to the CPU's current in= terrupt state > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If interrupts were disabled in = the CPU. > > > > > > > > > > + @retval EFI_INVALID_PARAMETER State is NULL. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuGetInterruptState ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + OUT BOOLEAN *State > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + if (State =3D=3D NULL) { > > > > > > > > > > + return EFI_INVALID_PARAMETER; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + *State =3D mInterruptState; > > > > > > > > > > + return EFI_SUCCESS; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Generates an INIT to the CPU. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param InitType Type of CPU INIT to perform > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If CPU INIT occurred. This value sho= uld > never > > > be > > > > > > > > > > + seen. > > > > > > > > > > + @retval EFI_DEVICE_ERROR If CPU INIT failed. > > > > > > > > > > + @retval EFI_UNSUPPORTED Requested type of CPU INIT not > > > supported. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuInit ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN EFI_CPU_INIT_TYPE InitType > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + return EFI_UNSUPPORTED; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Registers a function to be called from the CPU interrupt handl= er. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param InterruptType Defines which interrupt to hook= . IA-32 > > > > > > > > > > + valid range is 0x00 through > > > > > + 0xFF > > > > > > > > > > + @param InterruptHandler A pointer to a function of type > > > > > > > > > > + EFI_CPU_INTERRUPT_HANDLER that > > > > > + is called > > > > > > > > > > + when a processor interrupt occu= rs. > > > > > + A null > > > > > > > > > > + pointer is an error condition. > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If handler installed or uninsta= lled. > > > > > > > > > > + @retval EFI_ALREADY_STARTED InterruptHandler is not NULL, a= nd > a > > > > > handler > > > > > > > > > > + for InterruptType was previousl= y installed. > > > > > > > > > > + @retval EFI_INVALID_PARAMETER InterruptHandler is NULL, and > > > > > + a handler for > > > > > > > > > > + InterruptType was not previousl= y installed. > > > > > > > > > > + @retval EFI_UNSUPPORTED The interrupt specified by > > > InterruptType > > > > > > > > > > + is not supported. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuRegisterInterruptHandler ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN EFI_EXCEPTION_TYPE InterruptType, > > > > > > > > > > + IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + return RegisterCpuInterruptHandler (InterruptType, > > > > > + InterruptHandler); > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Returns a timer value from one of the CPU's internal timers. > > > > > + There is no > > > > > > > > > > + inherent time interval between ticks but is a function of the > > > > > + CPU > > > > > frequency. > > > > > > > > > > + > > > > > > > > > > + @param This - Protocol instance structure. > > > > > > > > > > + @param TimerIndex - Specifies which CPU timer is req= uested. > > > > > > > > > > + @param TimerValue - Pointer to the returned timer va= lue. > > > > > > > > > > + @param TimerPeriod - A pointer to the amount of time = that > > > passes > > > > > > > > > > + in femtoseconds (10-15) for > > > > > + each increment > > > > > > > > > > + of TimerValue. If TimerValue > > > > > + does not > > > > > > > > > > + increment at a predictable > > > > > + rate, then 0 is > > > > > > > > > > + returned. The amount of time > > > > > + that has > > > > > > > > > > + passed between two calls to > > > > > + GetTimerValue() > > > > > > > > > > + can be calculated with the > > > > > + formula > > > > > > > > > > + (TimerValue2 - TimerValue1) * Ti= merPeriod. > > > > > > > > > > + This parameter is optional and m= ay be NULL. > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS - If the CPU timer count was ret= urned. > > > > > > > > > > + @retval EFI_UNSUPPORTED - If the CPU does not have any > readable > > > > > timers. > > > > > > > > > > + @retval EFI_DEVICE_ERROR - If an error occurred while rea= ding > the > > > > > timer. > > > > > > > > > > + @retval EFI_INVALID_PARAMETER - TimerIndex is not valid or > > > > > + TimerValue > > > > > is NULL. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuGetTimerValue ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN UINT32 TimerIndex, > > > > > > > > > > + OUT UINT64 *TimerValue, > > > > > > > > > > + OUT UINT64 *TimerPeriod OPTIONAL > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + return EFI_UNSUPPORTED; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Implementation of SetMemoryAttributes() service of CPU > > > > > + Architecture > > > > > Protocol. > > > > > > > > > > + > > > > > > > > > > + This function modifies the attributes for the memory region > > > > > + specified by BaseAddress and > > > > > > > > > > + Length from their current attributes to the attributes > > > > > + specified by > > > > > Attributes. > > > > > > > > > > + > > > > > > > > > > + @param This The EFI_CPU_ARCH_PROTOCOL instance. > > > > > > > > > > + @param BaseAddress The physical address that is the star= t > address > > > of a > > > > > memory region. > > > > > > > > > > + @param Length The size in bytes of the memory regio= n. > > > > > > > > > > + @param Attributes The bit mask of attributes to set for= the > > > memory > > > > > region. > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS The attributes were set for the = memory > > > region. > > > > > > > > > > + @retval EFI_ACCESS_DENIED The attributes for the memory > > > resource > > > > > range specified by > > > > > > > > > > + BaseAddress and Length cannot be= modified. > > > > > > > > > > + @retval EFI_INVALID_PARAMETER Length is zero. > > > > > > > > > > + Attributes specified an illegal > > > > > + combination of attributes that > > > > > > > > > > + cannot be set together. > > > > > > > > > > + @retval EFI_OUT_OF_RESOURCES There are not enough system > > > > > resources > > > > > + to modify the attributes of > > > > > > > > > > + the memory resource range. > > > > > > > > > > + @retval EFI_UNSUPPORTED The processor does not support > one or > > > > > more bytes of the memory > > > > > > > > > > + resource range specified by Base= Address and Length. > > > > > > > > > > + The bit mask of attributes is > > > > > + not support for the memory resource > > > > > > > > > > + range specified by BaseAddress a= nd Length. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuSetMemoryAttributes ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > > > > > > > > > > + IN UINT64 Length, > > > > > > > > > > + IN UINT64 Attributes > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + DEBUG ((DEBUG_INFO, "%a: Set memory attributes not supported > > > > > + yet\n", __FUNCTION__)); > > > > > > > > > > + return EFI_SUCCESS; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Initialize the state information for the CPU Architectural Pro= tocol. > > > > > > > > > > + > > > > > > > > > > + @param ImageHandle Image handle this driver. > > > > > > > > > > + @param SystemTable Pointer to the System Table. > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS Thread can be successfully creat= ed > > > > > > > > > > + @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data > > > > > + structure > > > > > > > > > > + @retval EFI_DEVICE_ERROR Cannot create the thread > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +InitializeCpu ( > > > > > > > > > > + IN EFI_HANDLE ImageHandle, > > > > > > > > > > + IN EFI_SYSTEM_TABLE *SystemTable > > > > > > > > > > + ) > > > > > > > > > > +{ > > > > > > > > > > + EFI_STATUS Status; > > > > > > > > > > + EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext; > > > > > > > > > > + > > > > > > > > > > + GetFirmwareContextPointer (&FirmwareContext); > > > > > > > > > > + ASSERT (FirmwareContext !=3D NULL); > > > > > > > > > > + if (FirmwareContext =3D=3D NULL) { > > > > > > > > > > + DEBUG ((DEBUG_ERROR, "Failed to get the pointer of > > > > > + EFI_RISCV_FIRMWARE_CONTEXT\n")); > > > > > > > > > > + return EFI_NOT_FOUND; > > > > > > > > > > + } > > > > > > > > > > + DEBUG ((DEBUG_INFO, " %a: Firmware Context is at 0x%x.\n", > > > > > + __FUNCTION__, FirmwareContext)); > > > > > > > > > > + > > > > > > > > > > + mBootHartId =3D FirmwareContext->BootHartId; > > > > > > > > > > + DEBUG ((DEBUG_INFO, " %a: mBootHartId =3D 0x%x.\n", > > > __FUNCTION__, > > > > > + mBootHartId)); > > > > > > > > > > + > > > > > > > > > > + > > > > > > > > > > + InitializeCpuExceptionHandlers(NULL); > > > > > > > > > > + > > > > > > > > > > + // > > > > > > > > > > + // Make sure interrupts are disabled > > > > > > > > > > + // > > > > > > > > > > + DisableInterrupts (); > > > > > > > > > > + > > > > > > > > > > + Status =3D gBS->InstallProtocolInterface (&ImageHandle, > > > > > > > > > > + > > > > > + &gRiscVEfiBootProtocolGuid, > > > > > > > > > > + EFI_NATIVE_INTERFACE, > > > > > > > > > > + &gRiscvBootProtocol > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > + ASSERT_EFI_ERROR (Status); > > > > > > > > > > + > > > > > > > > > > + // > > > > > > > > > > + // Install CPU Architectural Protocol > > > > > > > > > > + // > > > > > > > > > > + Status =3D gBS->InstallMultipleProtocolInterfaces ( > > > > > > > > > > + &mCpuHandle, > > > > > > > > > > + &gEfiCpuArchProtocolGuid, > > > > > > > > > > + &gCpu, > > > > > > > > > > + NULL > > > > > > > > > > + ); > > > > > > > > > > + ASSERT_EFI_ERROR (Status); > > > > > > > > > > + return Status; > > > > > > > > > > +} > > > > > > > > > > diff --git a/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h > > > > > b/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h > > > > > new file mode 100644 > > > > > index 0000000000..f039759dbd > > > > > --- /dev/null > > > > > +++ b/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h > > > > > @@ -0,0 +1,200 @@ > > > > > +/** @file > > > > > > > > > > + RISC-V CPU DXE module header file. > > > > > > > > > > + > > > > > > > > > > + Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Developm= ent > LP. > > > > > + All rights reserved.
> > > > > > > > > > + Copyright (c) 2022, Ventana Micro Systems Inc. All rights > > > > > + reserved.
> > > > > > > > > > + > > > > > > > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > + > > > > > > > > > > +#ifndef CPU_DXE_H_ > > > > > > > > > > +#define CPU_DXE_H_ > > > > > > > > > > + > > > > > > > > > > +#include > > > > > > > > > > + > > > > > > > > > > +#include > > > > > > > > > > +#include > > > > > > > > > > +#include > > > > > > > > > > +#include > > > > > > > > > > +#include > > > > > > > > > > +#include > > > > > > > > > > +#include > > > > > > > > > > +#include > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Flush CPU data cache. If the instruction cache is fully > > > > > + coherent > > > > > > > > > > + with all DMA operations then function can just return EFI_SUCC= ESS. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param Start Physical address to start flushing f= rom. > > > > > > > > > > + @param Length Number of bytes to flush. Round up t= o > chipset > > > > > > > > > > + granularity. > > > > > > > > > > + @param FlushType Specifies the type of flush operatio= n to > > > perform. > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If cache was flushed > > > > > > > > > > + @retval EFI_UNSUPPORTED If flush type is not supported. > > > > > > > > > > + @retval EFI_DEVICE_ERROR If requested range could not be > flushed. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuFlushCpuDataCache ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN EFI_PHYSICAL_ADDRESS Start, > > > > > > > > > > + IN UINT64 Length, > > > > > > > > > > + IN EFI_CPU_FLUSH_TYPE FlushType > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Enables CPU interrupts. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If interrupts were enabled in the CP= U > > > > > > > > > > + @retval EFI_DEVICE_ERROR If interrupts could not be enabled > > > > > + on the > > > CPU. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuEnableInterrupt ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Disables CPU interrupts. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If interrupts were disabled in the C= PU. > > > > > > > > > > + @retval EFI_DEVICE_ERROR If interrupts could not be disabled > > > > > + on the > > > CPU. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuDisableInterrupt ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Return the state of interrupts. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param State Pointer to the CPU's current in= terrupt state > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If interrupts were disabled in = the CPU. > > > > > > > > > > + @retval EFI_INVALID_PARAMETER State is NULL. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuGetInterruptState ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + OUT BOOLEAN *State > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Generates an INIT to the CPU. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param InitType Type of CPU INIT to perform > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If CPU INIT occurred. This value sho= uld > never > > > be > > > > > > > > > > + seen. > > > > > > > > > > + @retval EFI_DEVICE_ERROR If CPU INIT failed. > > > > > > > > > > + @retval EFI_UNSUPPORTED Requested type of CPU INIT not > > > supported. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuInit ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN EFI_CPU_INIT_TYPE InitType > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Registers a function to be called from the CPU interrupt handl= er. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param InterruptType Defines which interrupt to hook= . IA-32 > > > > > > > > > > + valid range is 0x00 through > > > > > + 0xFF > > > > > > > > > > + @param InterruptHandler A pointer to a function of type > > > > > > > > > > + EFI_CPU_INTERRUPT_HANDLER that > > > > > + is called > > > > > > > > > > + when a processor interrupt occu= rs. > > > > > + A null > > > > > > > > > > + pointer is an error condition. > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If handler installed or uninsta= lled. > > > > > > > > > > + @retval EFI_ALREADY_STARTED InterruptHandler is not NULL, a= nd > a > > > > > handler > > > > > > > > > > + for InterruptType was previousl= y installed. > > > > > > > > > > + @retval EFI_INVALID_PARAMETER InterruptHandler is NULL, and > > > > > + a handler for > > > > > > > > > > + InterruptType was not previousl= y installed. > > > > > > > > > > + @retval EFI_UNSUPPORTED The interrupt specified by > > > InterruptType > > > > > > > > > > + is not supported. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuRegisterInterruptHandler ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN EFI_EXCEPTION_TYPE InterruptType, > > > > > > > > > > + IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Returns a timer value from one of the CPU's internal timers. > > > > > + There is no > > > > > > > > > > + inherent time interval between ticks but is a function of the > > > > > + CPU > > > > > frequency. > > > > > > > > > > + > > > > > > > > > > + @param This - Protocol instance structure. > > > > > > > > > > + @param TimerIndex - Specifies which CPU timer is req= uested. > > > > > > > > > > + @param TimerValue - Pointer to the returned timer va= lue. > > > > > > > > > > + @param TimerPeriod - A pointer to the amount of time = that > > > passes > > > > > > > > > > + in femtoseconds (10-15) for > > > > > + each increment > > > > > > > > > > + of TimerValue. If TimerValue > > > > > + does not > > > > > > > > > > + increment at a predictable > > > > > + rate, then 0 is > > > > > > > > > > + returned. The amount of time > > > > > + that has > > > > > > > > > > + passed between two calls to > > > > > + GetTimerValue() > > > > > > > > > > + can be calculated with the > > > > > + formula > > > > > > > > > > + (TimerValue2 - TimerValue1) * Ti= merPeriod. > > > > > > > > > > + This parameter is optional and m= ay be NULL. > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS - If the CPU timer count was ret= urned. > > > > > > > > > > + @retval EFI_UNSUPPORTED - If the CPU does not have any > readable > > > > > timers. > > > > > > > > > > + @retval EFI_DEVICE_ERROR - If an error occurred while rea= ding > the > > > > > timer. > > > > > > > > > > + @retval EFI_INVALID_PARAMETER - TimerIndex is not valid or > > > > > + TimerValue > > > > > is NULL. > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuGetTimerValue ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN UINT32 TimerIndex, > > > > > > > > > > + OUT UINT64 *TimerValue, > > > > > > > > > > + OUT UINT64 *TimerPeriod OPTIONAL > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > +/** > > > > > > > > > > + Set memory cacheability attributes for given range of memeory. > > > > > > > > > > + > > > > > > > > > > + @param This Protocol instance structure > > > > > > > > > > + @param BaseAddress Specifies the start address of = the > > > > > > > > > > + memory range > > > > > > > > > > + @param Length Specifies the length of the mem= ory range > > > > > > > > > > + @param Attributes The memory cacheability for the= memory > > > range > > > > > > > > > > + > > > > > > > > > > + @retval EFI_SUCCESS If the cacheability of that mem= ory range > is > > > > > > > > > > + set successfully > > > > > > > > > > + @retval EFI_UNSUPPORTED If the desired operation cannot= be > > > done > > > > > > > > > > + @retval EFI_INVALID_PARAMETER The input parameter is not > > > > > + correct, > > > > > > > > > > + such as Length =3D 0 > > > > > > > > > > + > > > > > > > > > > +**/ > > > > > > > > > > +EFI_STATUS > > > > > > > > > > +EFIAPI > > > > > > > > > > +CpuSetMemoryAttributes ( > > > > > > > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > > > > > > > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > > > > > > > > > > + IN UINT64 Length, > > > > > > > > > > + IN UINT64 Attributes > > > > > > > > > > + ); > > > > > > > > > > + > > > > > > > > > > +#endif > > > > > > > > > > -- > > > > > 2.25.1