]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchronization.S
MdePkg/BaseSynchronizationLib: RISC-V cache related code.
[mirror_edk2.git] / MdePkg / Library / BaseSynchronizationLib / RiscV64 / Synchronization.S
1 //------------------------------------------------------------------------------
2 //
3 // RISC-V synchronization functions.
4 //
5 // Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
6 //
7 // SPDX-License-Identifier: BSD-2-Clause-Patent
8 //
9 //------------------------------------------------------------------------------
10 #include <Base.h>
11
12 .data
13
14 .text
15 .align 3
16
17 .global ASM_PFX(InternalSyncCompareExchange32)
18 .global ASM_PFX(InternalSyncCompareExchange64)
19 .global ASM_PFX(InternalSyncIncrement)
20 .global ASM_PFX(InternalSyncDecrement)
21
22 //
23 // ompare and xchange a 32-bit value.
24 //
25 // @param a0 : Pointer to 32-bit value.
26 // @param a1 : Compare value.
27 // @param a2 : Exchange value.
28 //
29 ASM_PFX (InternalSyncCompareExchange32):
30 lr.w a3, (a0) // Load the value from a0 and make
31 // the reservation of address.
32 bne a3, a1, exit
33 sc.w a3, a2, (a0) // Write the value back to the address.
34 mv a3, a1
35 exit:
36 mv a0, a3
37 ret
38
39 .global ASM_PFX(InternalSyncCompareExchange64)
40
41 //
42 // Compare and xchange a 64-bit value.
43 //
44 // @param a0 : Pointer to 64-bit value.
45 // @param a1 : Compare value.
46 // @param a2 : Exchange value.
47 //
48 ASM_PFX (SyncCompareExchange64):
49 lr.d a3, (a0) // Load the value from a0 and make
50 // the reservation of address.
51 bne a3, a1, exit
52 sc.d a3, a2, (a0) // Write the value back to the address.
53 mv a3, a1
54 exit2:
55 mv a0, a3
56 ret
57
58 //
59 // Performs an atomic increment of an 32-bit unsigned integer.
60 //
61 // @param a0 : Pointer to 32-bit value.
62 //
63 ASM_PFX (InternalSyncIncrement):
64 li a1, 1
65 amoadd.w a2, a1, (a0)
66 mv a0, a2
67 ret
68
69 //
70 // Performs an atomic decrement of an 32-bit unsigned integer.
71 //
72 // @param a0 : Pointer to 32-bit value.
73 //
74 ASM_PFX (InternalSyncDecrement):
75 li a1, -1
76 amoadd.w a2, a1, (a0)
77 mv a0, a2
78 ret