From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-io1-f42.google.com (mail-io1-f42.google.com [209.85.166.42]) by mx.groups.io with SMTP id smtpd.web10.2457.1619642667287236898 for ; Wed, 28 Apr 2021 13:44:27 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@nuviainc-com.20150623.gappssmtp.com header.s=20150623 header.b=jclbXDQo; spf=pass (domain: nuviainc.com, ip: 209.85.166.42, mailfrom: rebecca@nuviainc.com) Received: by mail-io1-f42.google.com with SMTP id p8so11134356iol.11 for ; Wed, 28 Apr 2021 13:44:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nuviainc-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CEd7AJYo0Kn4Tu5a0kFHefNU7fRwhSvPMtnc6R0l2eU=; b=jclbXDQoixhHbl9wWWC5PNX/p+HTXzV04XLAmFfzf5r/+g9lLR5fQtAzC5Gl+I00cX inEBgaNRHwSymZD9i518SIfiAs5huRnssFzWnsS0T42t+cDAw2HpNFACaMNYaf0M5dKD LPCPrheCwsIkO2GD+eljrSjxO1QgKiqoW1J8/s2nlM0DM/qByqQMyS1dZHw9T1n9pLd9 M6OfW8Ujk5a09Xpj7BR5hEPDdg67bY1LOW3st2jlMQtxp8etFWAzGo3mid3PMp6hWd3q NsXvL+va/GE+Ol5cFV/uqZnW0ciep5ffmFgEC0ohr5shOmqQM9n9p0sNiLLa3jG/E8Rs BoTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CEd7AJYo0Kn4Tu5a0kFHefNU7fRwhSvPMtnc6R0l2eU=; b=QNSvl3kPEOAmZ8USV7jj8U2kxbxR8zqouvFoxzJ3fqGcFFlUMLk+x9o4I/27CfQoA2 dQOMOOswcrl9Z6+b2wpwK/poGW83ud3uyMWh+MbUMBVhP21tTlT0OF/wP0N5ETBOB0/A f0HlKN3V7upI4nxmzlCUyFP/YQWbmNz+7PlWT8RZUoax7z/es6y4VPZteKTn4r7lBjt1 eELHUHph4Dmb3D8ZN6WsW65oXGiTIcjuXOChYF0dGB4fojBABJvuVMfNcWBoDVgIWipI ArsiJ2OYikPVYYGhUWLWTTCOeK7/lLSbAmEY1d3Azyfldi4jQn/U+RVHcjjuyZZBI0sB 6rPA== X-Gm-Message-State: AOAM530xS7wdjkiTuyteqpx2LCkkvzOer5h1gQh6tlrtAzXuSrwCjf+o wMO0oPsET97CKTOV2Kc1p3g6dKcTU4DZzMVjVnoLDgZTJOqpVoSMJtCakJSFsdRzNe89eKhlpsU 2J6xx9oZbyrNuhpLc0kTV0m00aR6/fH8+m7GiGF/Pj5SJLygwt228FCDUeZb1rWuTZFHM9w== X-Google-Smtp-Source: ABdhPJz8zmXto/Kf9+SZCC/ZmQ5IhioC1G3ehQM4UNZajVE7w95K1gSx7TaOBYA+hhBW7GDBkfsS+Q== X-Received: by 2002:a5e:c74a:: with SMTP id g10mr25552105iop.165.1619642666419; Wed, 28 Apr 2021 13:44:26 -0700 (PDT) Return-Path: Received: from cube.int.bluestop.org (c-174-52-16-57.hsd1.ut.comcast.net. [174.52.16.57]) by smtp.gmail.com with ESMTPSA id 7sm352437ilj.59.2021.04.28.13.44.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Apr 2021 13:44:26 -0700 (PDT) From: "Rebecca Cran" To: devel@edk2.groups.io Cc: Rebecca Cran , Jiewen Yao , Jian J Wang , Michael D Kinney , Liming Gao , Zhiguang Liu , Ard Biesheuvel , Sami Mujawar Subject: [PATCH 1/3] MdePkg/BaseLib: Add support for ARMv8.5 RNG instructions Date: Wed, 28 Apr 2021 14:44:13 -0600 Message-Id: <20210428204415.25454-2-rebecca@nuviainc.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210428204415.25454-1-rebecca@nuviainc.com> References: <20210428204415.25454-1-rebecca@nuviainc.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add support for the optional ARMv8.5 RNDR and RNDRRS instructions that are a part of FEAT_RNG to BaseLib, and add a function to read the ISAR0 register which indicates whether the CPU supports FEAT_RNG. Signed-off-by: Rebecca Cran --- MdePkg/Library/BaseLib/BaseLib.inf | 4 ++ MdePkg/Include/Library/BaseLib.h | 47 +++++++++++++++++ MdePkg/Library/BaseLib/BaseLibInternals.h | 6 +++ MdePkg/Library/BaseLib/AArch64/ArmReadIdIsar0.S | 29 +++++++++++ MdePkg/Library/BaseLib/AArch64/ArmReadIdIsar0.asm | 28 ++++++++++ MdePkg/Library/BaseLib/AArch64/ArmRng.S | 51 ++++++++++++++++++ MdePkg/Library/BaseLib/AArch64/ArmRng.asm | 55 ++++++++++++++++++++ 7 files changed, 220 insertions(+) diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index b76f3af380ea..7f582079d786 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -380,6 +380,8 @@ [Sources.AARCH64] AArch64/SetJumpLongJump.S | GCC AArch64/CpuBreakpoint.S | GCC AArch64/SpeculationBarrier.S | GCC + AArch64/ArmRng.S | GCC + AArch64/ArmReadIdIsar0.S | GCC AArch64/MemoryFence.asm | MSFT AArch64/SwitchStack.asm | MSFT @@ -389,6 +391,8 @@ [Sources.AARCH64] AArch64/SetJumpLongJump.asm | MSFT AArch64/CpuBreakpoint.asm | MSFT AArch64/SpeculationBarrier.asm | MSFT + AArch64/ArmRng.asm | MSFT + AArch64/ArmReadIdIsar0.asm | MSFT [Sources.RISCV64] Math64.c diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index 7253997a6f8c..60cf559b0849 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -7519,4 +7519,51 @@ PatchInstructionX86 ( ); #endif // defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) + +#if defined (MDE_CPU_AARCH64) + +/** + Reads the ID_AA64ISAR0 Register. + + @return The contents of the ID_AA64ISAR0 Register + +**/ +UINT64 +EFIAPI +ArmReadIdIsar0 ( + VOID + ); + +/** + Generates a random number using the RNDR instruction. + + @param[out] The generated random number + + @retval TRUE Success: a random number was successfully generated + @retval FALSE Failure: a random number was unable to be generated + +**/ +BOOLEAN +EFIAPI +ArmRndr ( + OUT UINT64 *Rand + ); + +/** + Generates a random number using the RNDRRS instruction. + + @param[out] The generated random number + + @retval TRUE Success: a random number was successfully generated + @retval FALSE Failure: a random number was unable to be generated + +**/ +BOOLEAN +EFIAPI +ArmRndrrs ( + OUT UINT64 *Rand + ); + +#endif // defined (MDE_CPU_AARCH64) + #endif // !defined (__BASE_LIB__) diff --git a/MdePkg/Library/BaseLib/BaseLibInternals.h b/MdePkg/Library/BaseLib/BaseLibInternals.h index 6837d67d90cf..4ae79a4e7ab4 100644 --- a/MdePkg/Library/BaseLib/BaseLibInternals.h +++ b/MdePkg/Library/BaseLib/BaseLibInternals.h @@ -862,6 +862,12 @@ InternalX86RdRand64 ( OUT UINT64 *Rand ); +#elif defined (MDE_CPU_AARCH64) + +// RNDR, Random Number +#define RNDR S3_3_C2_C4_0 +#define RNDRRS S3_3_C2_C4_1 + #else #endif diff --git a/MdePkg/Library/BaseLib/AArch64/ArmReadIdIsar0.S b/MdePkg/Library/BaseLib/AArch64/ArmReadIdIsar0.S new file mode 100644 index 000000000000..b31e565c7955 --- /dev/null +++ b/MdePkg/Library/BaseLib/AArch64/ArmReadIdIsar0.S @@ -0,0 +1,29 @@ +#------------------------------------------------------------------------------ +# +# ArmReadIdIsar0() for AArch64 +# +# Copyright (c) 2021, NUVIA Inc. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#------------------------------------------------------------------------------ + +.text +.p2align 2 +GCC_ASM_EXPORT(ArmReadIdIsar0) + +#/** +# Reads the ID_AA64ISAR0 Register. +# +#**/ +#UINT64 +#EFIAPI +#ArmReadIdIsar0 ( +# VOID +# ); +# +ASM_PFX(ArmReadIdIsar0): + mrs x0, id_aa64isar0_el1 // Read ID_AA64ISAR0 Register + ret + + diff --git a/MdePkg/Library/BaseLib/AArch64/ArmReadIdIsar0.asm b/MdePkg/Library/BaseLib/AArch64/ArmReadIdIsar0.asm new file mode 100644 index 000000000000..1f1d15626cc2 --- /dev/null +++ b/MdePkg/Library/BaseLib/AArch64/ArmReadIdIsar0.asm @@ -0,0 +1,28 @@ +;------------------------------------------------------------------------------ +; +; ArmReadIdIsar0() for AArch64 +; +; Copyright (c) 2021, NUVIA Inc. All rights reserved.
+; +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +;------------------------------------------------------------------------------ + + EXPORT ArmReadIdIsar0 + AREA BaseLib_LowLevel, CODE, READONLY + +;/** +; Reads the ID_AA64ISAR0 Register. +; +;**/ +;UINT64 +;EFIAPI +;ArmReadIdIsar0 ( +; VOID +; ); +; +ArmReadIdIsar0 + mrs x0, id_aa64isar0_el1 // Read ID_AA64ISAR0 Register + ret + + END diff --git a/MdePkg/Library/BaseLib/AArch64/ArmRng.S b/MdePkg/Library/BaseLib/AArch64/ArmRng.S new file mode 100644 index 000000000000..fc2adb660d21 --- /dev/null +++ b/MdePkg/Library/BaseLib/AArch64/ArmRng.S @@ -0,0 +1,51 @@ +#------------------------------------------------------------------------------ +# +# ArmRndr() and ArmRndrrs() for AArch64 +# +# Copyright (c) 2021, NUVIA Inc. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#------------------------------------------------------------------------------ + +#include "BaseLibInternals.h" + +.text +.p2align 2 +GCC_ASM_EXPORT(ArmRndr) +GCC_ASM_EXPORT(ArmRndrrs) + +#/** +# Generates a random number using RNDR. +# Returns TRUE on success; FALSE on failure. +# +#**/ +#BOOLEAN +#EFIAPI +#ArmRndr ( +# OUT UINT64 *Rand +# ); +# +ASM_PFX(ArmRndr): + mrs x1, RNDR + str x1, [x0] + cset x0, ne // RNDR sets NZCV to 0b0100 on failure + ret + + +#/** +# Generates a random number using RNDRRS +# Returns TRUE on success; FALSE on failure. +# +#**/ +#BOOLEAN +#EFIAPI +#ArmRndrrs ( +# OUT UINT64 *Rand +# ); +# +ASM_PFX(ArmRndrrs): + mrs x1, RNDRRS + str x1, [x0] + cset x0, ne // RNDRRS sets NZCV to 0b0100 on failure + ret diff --git a/MdePkg/Library/BaseLib/AArch64/ArmRng.asm b/MdePkg/Library/BaseLib/AArch64/ArmRng.asm new file mode 100644 index 000000000000..ed8d1a81bdfe --- /dev/null +++ b/MdePkg/Library/BaseLib/AArch64/ArmRng.asm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; ArmRndr() and ArmRndrrs() for AArch64 +; +; Copyright (c) 2021, NUVIA Inc. All rights reserved.
+; +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +;------------------------------------------------------------------------------ + +#include "BaseLibInternals.h" + + EXPORT ArmRndr + EXPORT ArmRndrrs + AREA BaseLib_LowLevel, CODE, READONLY + + +;/** +; Generates a random number using RNDR. +; Returns TRUE on success; FALSE on failure. +; +;**/ +;BOOLEAN +;EFIAPI +;ArmRndr ( +; OUT UINT64 *Rand +; ); +; +ArmRndr + mrs x1, RNDR + str x1, [x0] + cset x0, ne // RNDR sets NZCV to 0b0100 on failure + ret + + END + +;/** +; Generates a random number using RNDRRS. +; Returns TRUE on success; FALSE on failure. +; +;**/ +;BOOLEAN +;EFIAPI +;ArmRndrrs ( +; OUT UINT64 *Rand +; ); +; +ArmRndrrs + mrs x1, RNDRRS + str x1, [x0] + cset x0, ne // RNDRRS sets NZCV to 0b0100 on failure + ret + + END + -- 2.26.2