From nobody Mon Feb 9 12:26:42 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+46787+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+46787+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=hpe.com ARC-Seal: i=1; a=rsa-sha256; t=1567595618; cv=none; d=zoho.com; s=zohoarc; b=O5LgV3TV7QvmJffgf/5EOHc+e1Ds3ACh0tEP6IPZFFn6agjx3ynEiZtM5DhZEXhLhhpWHcur8JUsj7DWSx8unKlr7YqJ5DM1G65LOWPXuTD2JtdVHnJgJjlYWZTFMDVUDmDbcShfSwKu1vfhYLHQrX4bKUFvVThlX074fLCE8xk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567595618; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To:ARC-Authentication-Results; bh=n4JSaRWmlVIn/5Z6xipOAQ3vuN8uyPMv844dkfcB27k=; b=Uf9gK/aBH6UyPJhWdoM5+jcCdX4Vi4OhN1VmT73ql3BHC8oXZ99j6i+u5esm1r4x7eQ5F9mdmuY8bV7V26NLZtcsDbjgV9VdyIKodTRCKshKcrMuo1b9ppCAUCMdOHQg5OCr5YU+lvRabtJQyXUm3EqQJX7IXJ57lzFU3RMLUhc= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+46787+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1567595618843645.142275295419; Wed, 4 Sep 2019 04:13:38 -0700 (PDT) Return-Path: X-Received: from mx0b-002e3701.pphosted.com (mx0b-002e3701.pphosted.com [148.163.143.35]) by groups.io with SMTP; Wed, 04 Sep 2019 04:13:38 -0700 X-Received: from pps.filterd (m0134423.ppops.net [127.0.0.1]) by mx0b-002e3701.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id x84BBjJX016912 for ; Wed, 4 Sep 2019 11:13:37 GMT X-Received: from g2t2352.austin.hpe.com (g2t2352.austin.hpe.com [15.233.44.25]) by mx0b-002e3701.pphosted.com with ESMTP id 2usra9rckg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 Sep 2019 11:13:37 +0000 X-Received: from g2t2360.austin.hpecorp.net (g2t2360.austin.hpecorp.net [16.196.225.135]) by g2t2352.austin.hpe.com (Postfix) with ESMTP id C39C1B0 for ; Wed, 4 Sep 2019 11:13:36 +0000 (UTC) X-Received: from UB16Abner.asiapacific.hpqcorp.net (ub16abner.asiapacific.hpqcorp.net [15.119.209.44]) by g2t2360.austin.hpecorp.net (Postfix) with ESMTP id D8ABB39; Wed, 4 Sep 2019 11:13:35 +0000 (UTC) From: "Abner Chang" To: devel@edk2.groups.io Cc: abner.chang@hpe.com Subject: [edk2-devel] [edk2-staging/RISC-V-V2 PATCH v1 10/22]: MdePkg/BaseSynchronizationLib: RISC-V cache related code. Date: Wed, 4 Sep 2019 18:43:05 +0800 Message-Id: <1567593797-26216-11-git-send-email-abner.chang@hpe.com> In-Reply-To: <1567593797-26216-1-git-send-email-abner.chang@hpe.com> References: <1567593797-26216-1-git-send-email-abner.chang@hpe.com> X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-HPE-SCL: -1 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,abner.chang@hpe.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1567595618; bh=Wk3OrKpbDG6quhxJA6u13WzvsaZdpGyEKKIMWsHv2JA=; h=Cc:Date:From:Reply-To:Subject:To; b=P+isi6nJaYH0cOJngY4ZvXHeZrxG4y7E5i15QR6RNrkMTrm+082BT2EDTYoaJBSzkV3 b4a9lUJ29eRUkQp55D+xMM5S9tqu7LVkQ2YIul5y3LZ9H/6tWue82gWXMWJN0qT33gSGv OEsZfuGq8ZK4ZRB59H0vRLN4JF5U471GY6g= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Support RISC-V cache related functions. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Abner Chang --- .../BaseSynchronizationLib.inf | 6 + .../RiscV64/Synchronization.c | 189 +++++++++++++++++= ++++ .../RiscV64/SynchronizationAsm.s | 84 +++++++++ 3 files changed, 279 insertions(+) create mode 100644 MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchroni= zation.c create mode 100644 MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchroni= zationAsm.s diff --git a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.i= nf b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf index 446bc19..d49001b 100755 --- a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf +++ b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf @@ -3,6 +3,7 @@ # # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
+# Copyright (c) 2016, Hewlett Packard Enterprise Development LP. All righ= ts reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -78,6 +79,11 @@ AArch64/Synchronization.S | GCC AArch64/Synchronization.asm | MSFT =20 +[Sources.RISCV64] + Synchronization.c + RiscV64/Synchronization.c | GCC + RiscV64/SynchronizationAsm.s + [Packages] MdePkg/MdePkg.dec =20 diff --git a/MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchronization.= c b/MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchronization.c new file mode 100644 index 0000000..e85e2f5 --- /dev/null +++ b/MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchronization.c @@ -0,0 +1,189 @@ +/** @file + Implementation of synchronization functions on RISC-V + + Copyright (c) 2016, Hewlett Packard Enterprise Development LP. All right= s reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may be= found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. +**/ + +#include + +UINT32 +SyncCompareExchange32 ( + IN volatile UINT32 *Value, + IN UINT32 CompareValue, + IN UINT32 ExchangeValue +); + +UINT64 +SyncCompareExchange64 ( + IN volatile UINT64 *Value, + IN UINT64 CompareValue, + IN UINT64 ExchangeValue +); + +UINT32 +SyncSyncIncrement32 ( + IN volatile UINT32 *Value + ); + +UINT32 +SyncSyncDecrement32 ( + IN volatile UINT32 *Value + ); + +/** + Performs an atomic compare exchange operation on a 16-bit + unsigned integer. + + Performs an atomic compare exchange operation on the 16-bit + unsigned integer specified by Value. If Value is equal to + CompareValue, then Value is set to ExchangeValue and + CompareValue is returned. If Value is not equal to + CompareValue, then Value is returned. The compare exchange + operation must be performed using MP safe mechanisms. + + @param Value A pointer to the 16-bit value for the + compare exchange operation. + @param CompareValue 16-bit value used in compare operation. + @param ExchangeValue 16-bit value used in exchange operation. + + @return The original *Value before exchange. + +**/ +UINT16 +EFIAPI +InternalSyncCompareExchange16 ( + IN volatile UINT16 *Value, + IN UINT16 CompareValue, + IN UINT16 ExchangeValue + ) +{ + DEBUG((DEBUG_ERROR, "%a:RISC-V does not support 16-bit AMO operation\n",= __FUNCTION__)); + ASSERT (FALSE); + return 0; +} + +/** + Performs an atomic compare exchange operation on a 32-bit + unsigned integer. + + Performs an atomic compare exchange operation on the 32-bit + unsigned integer specified by Value. If Value is equal to + CompareValue, then Value is set to ExchangeValue and + CompareValue is returned. If Value is not equal to + CompareValue, then Value is returned. The compare exchange + operation must be performed using MP safe mechanisms. + + @param Value A pointer to the 32-bit value for the + compare exchange operation. + @param CompareValue 32-bit value used in compare operation. + @param ExchangeValue 32-bit value used in exchange operation. + + @return The original *Value before exchange. + +**/ +UINT32 +EFIAPI +InternalSyncCompareExchange32 ( + IN volatile UINT32 *Value, + IN UINT32 CompareValue, + IN UINT32 ExchangeValue + ) +{ + + if (((UINTN)Value % sizeof (UINT32)) !=3D 0) { + DEBUG((DEBUG_ERROR, "%a:Value pointer must aligned at natural addres= s.\n", __FUNCTION__)); + ASSERT (FALSE); + } + return SyncCompareExchange32(Value, CompareValue, ExchangeValue); +} + +/** + Performs an atomic compare exchange operation on a 64-bit unsigned integ= er. + + Performs an atomic compare exchange operation on the 64-bit unsigned int= eger specified + by Value. If Value is equal to CompareValue, then Value is set to Excha= ngeValue and + CompareValue is returned. If Value is not equal to CompareValue, then V= alue is returned. + The compare exchange operation must be performed using MP safe mechanism= s. + + @param Value A pointer to the 64-bit value for the compare exch= ange + operation. + @param CompareValue 64-bit value used in compare operation. + @param ExchangeValue 64-bit value used in exchange operation. + + @return The original *Value before exchange. + +**/ +UINT64 +EFIAPI +InternalSyncCompareExchange64 ( + IN volatile UINT64 *Value, + IN UINT64 CompareValue, + IN UINT64 ExchangeValue + ) +{ + if (((UINTN)Value % sizeof (UINT64)) !=3D 0) { + DEBUG((DEBUG_ERROR, "%a:Value pointer must aligned at natural addres= s.\n", __FUNCTION__)); + ASSERT (FALSE); + } + return SyncCompareExchange64 (Value, CompareValue, ExchangeValue); +} + +/** + Performs an atomic increment of an 32-bit unsigned integer. + + Performs an atomic increment of the 32-bit unsigned integer specified by + Value and returns the incremented value. The increment operation must be + performed using MP safe mechanisms. The state of the return value is not + guaranteed to be MP safe. + + @param Value A pointer to the 32-bit value to increment. + + @return The incremented value. + +**/ +UINT32 +EFIAPI +InternalSyncIncrement ( + IN volatile UINT32 *Value + ) +{ + if (((UINTN)Value % sizeof (UINT32)) !=3D 0) { + DEBUG((DEBUG_ERROR, "%a:Value pointer must aligned at natural addres= s.\n", __FUNCTION__)); + ASSERT (FALSE); + } + return SyncSyncIncrement32 (Value); +} + +/** + Performs an atomic decrement of an 32-bit unsigned integer. + + Performs an atomic decrement of the 32-bit unsigned integer specified by + Value and returns the decrement value. The decrement operation must be + performed using MP safe mechanisms. The state of the return value is not + guaranteed to be MP safe. + + @param Value A pointer to the 32-bit value to decrement. + + @return The decrement value. + +**/ +UINT32 +EFIAPI +InternalSyncDecrement ( + IN volatile UINT32 *Value + ) +{ + if (((UINTN)Value % sizeof (UINT32)) !=3D 0) { + DEBUG((DEBUG_ERROR, "%a:Value pointer must aligned at natural addres= s.\n", __FUNCTION__)); + ASSERT (FALSE); + } + return SyncSyncDecrement32 (Value); +} diff --git a/MdePkg/Library/BaseSynchronizationLib/RiscV64/SynchronizationA= sm.s b/MdePkg/Library/BaseSynchronizationLib/RiscV64/SynchronizationAsm.s new file mode 100644 index 0000000..3e838b0 --- /dev/null +++ b/MdePkg/Library/BaseSynchronizationLib/RiscV64/SynchronizationAsm.s @@ -0,0 +1,84 @@ +//------------------------------------------------------------------------= ------ +// +// RISC-V synchronization functions. +// +// Copyright (c) 2016, Hewlett Packard Enterprise Development LP. All righ= ts reserved.
+// +// This program and the accompanying materials +// are licensed and made available under the terms and conditions of the B= SD License +// which accompanies this distribution. The full text of the license may = be found at +// http://opensource.org/licenses/bsd-license.php. +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +// +//------------------------------------------------------------------------= ------ +#include + +.data + +.text +.align 3 + +.global ASM_PFX(SyncCompareExchange32) +.global ASM_PFX(SyncCompareExchange64) +.global ASM_PFX(SyncSyncIncrement32) +.global ASM_PFX(SyncSyncDecrement32) + +// +// ompare and xchange a 32-bit value. +// +// @param a0 : Pointer to 32-bit value. +// @param a1 : Compare value. +// @param a2 : Exchange value. +// +ASM_PFX (SyncCompareExchange32): + lr.w a3, (a0) // Load the value from a0 and make + // the reservation of address. + bne a3, a1, exit + sc.w a3, a2, (a0) // Write the value back to the address. + mv a3, a1 +exit: + mv a0, a3 + ret + +.global ASM_PFX(SyncCompareExchange64) + +// +// Compare and xchange a 64-bit value. +// +// @param a0 : Pointer to 64-bit value. +// @param a1 : Compare value. +// @param a2 : Exchange value. +// +ASM_PFX (SyncCompareExchange64): + lr.d a3, (a0) // Load the value from a0 and make + // the reservation of address. + bne a3, a1, exit + sc.d a3, a2, (a0) // Write the value back to the address. + mv a3, a1 +exit2: + mv a0, a3 + ret + +// +// Performs an atomic increment of an 32-bit unsigned integer. +// +// @param a0 : Pointer to 32-bit value. +// +ASM_PFX (SyncSyncIncrement32): + li a1, 1 + amoadd.w a2, a1, (a0) + mv a0, a2 + ret + +// +// Performs an atomic decrement of an 32-bit unsigned integer. +// +// @param a0 : Pointer to 32-bit value. +// +ASM_PFX (SyncSyncDecrement32): + li a1, -1 + amoadd.w a2, a1, (a0) + mv a0, a2 + ret --=20 2.7.4 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#46787): https://edk2.groups.io/g/devel/message/46787 Mute This Topic: https://groups.io/mt/33137133/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-