@@ -44,6 +44,87 @@ static int wolfkmod_cleanup(void);
4444static int wolfkmod_load (void );
4545static int wolfkmod_unload (void );
4646
47+ #if defined(WOLFSSL_ATOMIC_OPS )
48+ /* Note: using compiler built-ins like __atomic_fetch_add will technically
49+ * build, but are not commonly used in FreeBSD and may not be safe / portable.
50+ * */
51+ void wolfSSL_Atomic_Int_Init (wolfSSL_Atomic_Int * c , int i )
52+ {
53+ * c = i ;
54+ }
55+
56+ void wolfSSL_Atomic_Uint_Init (wolfSSL_Atomic_Uint * c , unsigned int i )
57+ {
58+ * c = i ;
59+ }
60+
61+ int wolfSSL_Atomic_Int_FetchAdd (wolfSSL_Atomic_Int * c , int i )
62+ {
63+ return atomic_fetchadd_int (c , i );
64+ }
65+
66+ int wolfSSL_Atomic_Int_FetchSub (wolfSSL_Atomic_Int * c , int i )
67+ {
68+ return atomic_fetchadd_int (c , - i );
69+ }
70+
71+ int wolfSSL_Atomic_Int_AddFetch (wolfSSL_Atomic_Int * c , int i )
72+ {
73+ int val = atomic_fetchadd_int (c , i );
74+ return val + i ;
75+ }
76+
77+ int wolfSSL_Atomic_Int_SubFetch (wolfSSL_Atomic_Int * c , int i )
78+ {
79+ int val = atomic_fetchadd_int (c , - i );
80+ return val - i ;
81+ }
82+
83+ unsigned int wolfSSL_Atomic_Uint_FetchAdd (wolfSSL_Atomic_Uint * c ,
84+ unsigned int i )
85+ {
86+ return atomic_fetchadd_int (c , i );
87+ }
88+
89+ unsigned int wolfSSL_Atomic_Uint_FetchSub (wolfSSL_Atomic_Uint * c ,
90+ unsigned int i )
91+ {
92+ return atomic_fetchadd_int (c , - i );
93+ }
94+
95+ unsigned int wolfSSL_Atomic_Uint_AddFetch (wolfSSL_Atomic_Uint * c ,
96+ unsigned int i )
97+ {
98+ unsigned int val = atomic_fetchadd_int (c , i );
99+ return val + i ;
100+ }
101+
102+ unsigned int wolfSSL_Atomic_Uint_SubFetch (wolfSSL_Atomic_Uint * c ,
103+ unsigned int i )
104+ {
105+ unsigned int val = atomic_fetchadd_int (c , - i );
106+ return val - i ;
107+ }
108+
109+ int wolfSSL_Atomic_Int_CompareExchange (wolfSSL_Atomic_Int * c , int * expected_i ,
110+ int new_i )
111+ {
112+ u_int exp = (u_int ) * expected_i ;
113+ int ret = atomic_fcmpset_int (c , & exp , new_i );
114+ * expected_i = (int )exp ;
115+ return ret ;
116+ }
117+
118+ int wolfSSL_Atomic_Uint_CompareExchange (
119+ wolfSSL_Atomic_Uint * c , unsigned int * expected_i , unsigned int new_i )
120+ {
121+ u_int exp = (u_int ) * expected_i ;
122+ int ret = atomic_fcmpset_int (c , & exp , new_i );
123+ * expected_i = (unsigned int )exp ;
124+ return ret ;
125+ }
126+ #endif /* WOLFSSL_ATOMIC_OPS */
127+
47128static int wolfkmod_init (void )
48129{
49130 int ret = 0 ;
0 commit comments