xref: /aosp_15_r20/external/zstd/contrib/linux-kernel/mem.h (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
2*01826a49SYabin Cui /*
3*01826a49SYabin Cui  * Copyright (c) Meta Platforms, Inc. and affiliates.
4*01826a49SYabin Cui  * All rights reserved.
5*01826a49SYabin Cui  *
6*01826a49SYabin Cui  * This source code is licensed under both the BSD-style license (found in the
7*01826a49SYabin Cui  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
8*01826a49SYabin Cui  * in the COPYING file in the root directory of this source tree).
9*01826a49SYabin Cui  * You may select, at your option, one of the above-listed licenses.
10*01826a49SYabin Cui  */
11*01826a49SYabin Cui 
12*01826a49SYabin Cui #ifndef MEM_H_MODULE
13*01826a49SYabin Cui #define MEM_H_MODULE
14*01826a49SYabin Cui 
15*01826a49SYabin Cui /*-****************************************
16*01826a49SYabin Cui *  Dependencies
17*01826a49SYabin Cui ******************************************/
18*01826a49SYabin Cui #include <asm/unaligned.h>  /* get_unaligned, put_unaligned* */
19*01826a49SYabin Cui #include <linux/compiler.h>  /* inline */
20*01826a49SYabin Cui #include <linux/swab.h>  /* swab32, swab64 */
21*01826a49SYabin Cui #include <linux/types.h>  /* size_t, ptrdiff_t */
22*01826a49SYabin Cui #include "debug.h"  /* DEBUG_STATIC_ASSERT */
23*01826a49SYabin Cui 
24*01826a49SYabin Cui /*-****************************************
25*01826a49SYabin Cui *  Compiler specifics
26*01826a49SYabin Cui ******************************************/
27*01826a49SYabin Cui #undef MEM_STATIC /* may be already defined from common/compiler.h */
28*01826a49SYabin Cui #define MEM_STATIC static inline
29*01826a49SYabin Cui 
30*01826a49SYabin Cui /*-**************************************************************
31*01826a49SYabin Cui *  Basic Types
32*01826a49SYabin Cui *****************************************************************/
33*01826a49SYabin Cui typedef uint8_t  BYTE;
34*01826a49SYabin Cui typedef uint8_t  U8;
35*01826a49SYabin Cui typedef int8_t   S8;
36*01826a49SYabin Cui typedef uint16_t U16;
37*01826a49SYabin Cui typedef int16_t  S16;
38*01826a49SYabin Cui typedef uint32_t U32;
39*01826a49SYabin Cui typedef int32_t  S32;
40*01826a49SYabin Cui typedef uint64_t U64;
41*01826a49SYabin Cui typedef int64_t  S64;
42*01826a49SYabin Cui 
43*01826a49SYabin Cui /*-**************************************************************
44*01826a49SYabin Cui *  Memory I/O API
45*01826a49SYabin Cui *****************************************************************/
46*01826a49SYabin Cui /*=== Static platform detection ===*/
47*01826a49SYabin Cui MEM_STATIC unsigned MEM_32bits(void);
48*01826a49SYabin Cui MEM_STATIC unsigned MEM_64bits(void);
49*01826a49SYabin Cui MEM_STATIC unsigned MEM_isLittleEndian(void);
50*01826a49SYabin Cui 
51*01826a49SYabin Cui /*=== Native unaligned read/write ===*/
52*01826a49SYabin Cui MEM_STATIC U16 MEM_read16(const void* memPtr);
53*01826a49SYabin Cui MEM_STATIC U32 MEM_read32(const void* memPtr);
54*01826a49SYabin Cui MEM_STATIC U64 MEM_read64(const void* memPtr);
55*01826a49SYabin Cui MEM_STATIC size_t MEM_readST(const void* memPtr);
56*01826a49SYabin Cui 
57*01826a49SYabin Cui MEM_STATIC void MEM_write16(void* memPtr, U16 value);
58*01826a49SYabin Cui MEM_STATIC void MEM_write32(void* memPtr, U32 value);
59*01826a49SYabin Cui MEM_STATIC void MEM_write64(void* memPtr, U64 value);
60*01826a49SYabin Cui 
61*01826a49SYabin Cui /*=== Little endian unaligned read/write ===*/
62*01826a49SYabin Cui MEM_STATIC U16 MEM_readLE16(const void* memPtr);
63*01826a49SYabin Cui MEM_STATIC U32 MEM_readLE24(const void* memPtr);
64*01826a49SYabin Cui MEM_STATIC U32 MEM_readLE32(const void* memPtr);
65*01826a49SYabin Cui MEM_STATIC U64 MEM_readLE64(const void* memPtr);
66*01826a49SYabin Cui MEM_STATIC size_t MEM_readLEST(const void* memPtr);
67*01826a49SYabin Cui 
68*01826a49SYabin Cui MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val);
69*01826a49SYabin Cui MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val);
70*01826a49SYabin Cui MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32);
71*01826a49SYabin Cui MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64);
72*01826a49SYabin Cui MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val);
73*01826a49SYabin Cui 
74*01826a49SYabin Cui /*=== Big endian unaligned read/write ===*/
75*01826a49SYabin Cui MEM_STATIC U32 MEM_readBE32(const void* memPtr);
76*01826a49SYabin Cui MEM_STATIC U64 MEM_readBE64(const void* memPtr);
77*01826a49SYabin Cui MEM_STATIC size_t MEM_readBEST(const void* memPtr);
78*01826a49SYabin Cui 
79*01826a49SYabin Cui MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32);
80*01826a49SYabin Cui MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64);
81*01826a49SYabin Cui MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val);
82*01826a49SYabin Cui 
83*01826a49SYabin Cui /*=== Byteswap ===*/
84*01826a49SYabin Cui MEM_STATIC U32 MEM_swap32(U32 in);
85*01826a49SYabin Cui MEM_STATIC U64 MEM_swap64(U64 in);
86*01826a49SYabin Cui MEM_STATIC size_t MEM_swapST(size_t in);
87*01826a49SYabin Cui 
88*01826a49SYabin Cui /*-**************************************************************
89*01826a49SYabin Cui *  Memory I/O Implementation
90*01826a49SYabin Cui *****************************************************************/
MEM_32bits(void)91*01826a49SYabin Cui MEM_STATIC unsigned MEM_32bits(void)
92*01826a49SYabin Cui {
93*01826a49SYabin Cui     return sizeof(size_t) == 4;
94*01826a49SYabin Cui }
95*01826a49SYabin Cui 
MEM_64bits(void)96*01826a49SYabin Cui MEM_STATIC unsigned MEM_64bits(void)
97*01826a49SYabin Cui {
98*01826a49SYabin Cui     return sizeof(size_t) == 8;
99*01826a49SYabin Cui }
100*01826a49SYabin Cui 
101*01826a49SYabin Cui #if defined(__LITTLE_ENDIAN)
102*01826a49SYabin Cui #define MEM_LITTLE_ENDIAN 1
103*01826a49SYabin Cui #else
104*01826a49SYabin Cui #define MEM_LITTLE_ENDIAN 0
105*01826a49SYabin Cui #endif
106*01826a49SYabin Cui 
MEM_isLittleEndian(void)107*01826a49SYabin Cui MEM_STATIC unsigned MEM_isLittleEndian(void)
108*01826a49SYabin Cui {
109*01826a49SYabin Cui     return MEM_LITTLE_ENDIAN;
110*01826a49SYabin Cui }
111*01826a49SYabin Cui 
MEM_read16(const void * memPtr)112*01826a49SYabin Cui MEM_STATIC U16 MEM_read16(const void *memPtr)
113*01826a49SYabin Cui {
114*01826a49SYabin Cui     return get_unaligned((const U16 *)memPtr);
115*01826a49SYabin Cui }
116*01826a49SYabin Cui 
MEM_read32(const void * memPtr)117*01826a49SYabin Cui MEM_STATIC U32 MEM_read32(const void *memPtr)
118*01826a49SYabin Cui {
119*01826a49SYabin Cui     return get_unaligned((const U32 *)memPtr);
120*01826a49SYabin Cui }
121*01826a49SYabin Cui 
MEM_read64(const void * memPtr)122*01826a49SYabin Cui MEM_STATIC U64 MEM_read64(const void *memPtr)
123*01826a49SYabin Cui {
124*01826a49SYabin Cui     return get_unaligned((const U64 *)memPtr);
125*01826a49SYabin Cui }
126*01826a49SYabin Cui 
MEM_readST(const void * memPtr)127*01826a49SYabin Cui MEM_STATIC size_t MEM_readST(const void *memPtr)
128*01826a49SYabin Cui {
129*01826a49SYabin Cui     return get_unaligned((const size_t *)memPtr);
130*01826a49SYabin Cui }
131*01826a49SYabin Cui 
MEM_write16(void * memPtr,U16 value)132*01826a49SYabin Cui MEM_STATIC void MEM_write16(void *memPtr, U16 value)
133*01826a49SYabin Cui {
134*01826a49SYabin Cui     put_unaligned(value, (U16 *)memPtr);
135*01826a49SYabin Cui }
136*01826a49SYabin Cui 
MEM_write32(void * memPtr,U32 value)137*01826a49SYabin Cui MEM_STATIC void MEM_write32(void *memPtr, U32 value)
138*01826a49SYabin Cui {
139*01826a49SYabin Cui     put_unaligned(value, (U32 *)memPtr);
140*01826a49SYabin Cui }
141*01826a49SYabin Cui 
MEM_write64(void * memPtr,U64 value)142*01826a49SYabin Cui MEM_STATIC void MEM_write64(void *memPtr, U64 value)
143*01826a49SYabin Cui {
144*01826a49SYabin Cui     put_unaligned(value, (U64 *)memPtr);
145*01826a49SYabin Cui }
146*01826a49SYabin Cui 
147*01826a49SYabin Cui /*=== Little endian r/w ===*/
148*01826a49SYabin Cui 
MEM_readLE16(const void * memPtr)149*01826a49SYabin Cui MEM_STATIC U16 MEM_readLE16(const void *memPtr)
150*01826a49SYabin Cui {
151*01826a49SYabin Cui     return get_unaligned_le16(memPtr);
152*01826a49SYabin Cui }
153*01826a49SYabin Cui 
MEM_writeLE16(void * memPtr,U16 val)154*01826a49SYabin Cui MEM_STATIC void MEM_writeLE16(void *memPtr, U16 val)
155*01826a49SYabin Cui {
156*01826a49SYabin Cui     put_unaligned_le16(val, memPtr);
157*01826a49SYabin Cui }
158*01826a49SYabin Cui 
MEM_readLE24(const void * memPtr)159*01826a49SYabin Cui MEM_STATIC U32 MEM_readLE24(const void *memPtr)
160*01826a49SYabin Cui {
161*01826a49SYabin Cui     return MEM_readLE16(memPtr) + (((const BYTE *)memPtr)[2] << 16);
162*01826a49SYabin Cui }
163*01826a49SYabin Cui 
MEM_writeLE24(void * memPtr,U32 val)164*01826a49SYabin Cui MEM_STATIC void MEM_writeLE24(void *memPtr, U32 val)
165*01826a49SYabin Cui {
166*01826a49SYabin Cui 	MEM_writeLE16(memPtr, (U16)val);
167*01826a49SYabin Cui 	((BYTE *)memPtr)[2] = (BYTE)(val >> 16);
168*01826a49SYabin Cui }
169*01826a49SYabin Cui 
MEM_readLE32(const void * memPtr)170*01826a49SYabin Cui MEM_STATIC U32 MEM_readLE32(const void *memPtr)
171*01826a49SYabin Cui {
172*01826a49SYabin Cui     return get_unaligned_le32(memPtr);
173*01826a49SYabin Cui }
174*01826a49SYabin Cui 
MEM_writeLE32(void * memPtr,U32 val32)175*01826a49SYabin Cui MEM_STATIC void MEM_writeLE32(void *memPtr, U32 val32)
176*01826a49SYabin Cui {
177*01826a49SYabin Cui     put_unaligned_le32(val32, memPtr);
178*01826a49SYabin Cui }
179*01826a49SYabin Cui 
MEM_readLE64(const void * memPtr)180*01826a49SYabin Cui MEM_STATIC U64 MEM_readLE64(const void *memPtr)
181*01826a49SYabin Cui {
182*01826a49SYabin Cui     return get_unaligned_le64(memPtr);
183*01826a49SYabin Cui }
184*01826a49SYabin Cui 
MEM_writeLE64(void * memPtr,U64 val64)185*01826a49SYabin Cui MEM_STATIC void MEM_writeLE64(void *memPtr, U64 val64)
186*01826a49SYabin Cui {
187*01826a49SYabin Cui     put_unaligned_le64(val64, memPtr);
188*01826a49SYabin Cui }
189*01826a49SYabin Cui 
MEM_readLEST(const void * memPtr)190*01826a49SYabin Cui MEM_STATIC size_t MEM_readLEST(const void *memPtr)
191*01826a49SYabin Cui {
192*01826a49SYabin Cui 	if (MEM_32bits())
193*01826a49SYabin Cui 		return (size_t)MEM_readLE32(memPtr);
194*01826a49SYabin Cui 	else
195*01826a49SYabin Cui 		return (size_t)MEM_readLE64(memPtr);
196*01826a49SYabin Cui }
197*01826a49SYabin Cui 
MEM_writeLEST(void * memPtr,size_t val)198*01826a49SYabin Cui MEM_STATIC void MEM_writeLEST(void *memPtr, size_t val)
199*01826a49SYabin Cui {
200*01826a49SYabin Cui 	if (MEM_32bits())
201*01826a49SYabin Cui 		MEM_writeLE32(memPtr, (U32)val);
202*01826a49SYabin Cui 	else
203*01826a49SYabin Cui 		MEM_writeLE64(memPtr, (U64)val);
204*01826a49SYabin Cui }
205*01826a49SYabin Cui 
206*01826a49SYabin Cui /*=== Big endian r/w ===*/
207*01826a49SYabin Cui 
MEM_readBE32(const void * memPtr)208*01826a49SYabin Cui MEM_STATIC U32 MEM_readBE32(const void *memPtr)
209*01826a49SYabin Cui {
210*01826a49SYabin Cui     return get_unaligned_be32(memPtr);
211*01826a49SYabin Cui }
212*01826a49SYabin Cui 
MEM_writeBE32(void * memPtr,U32 val32)213*01826a49SYabin Cui MEM_STATIC void MEM_writeBE32(void *memPtr, U32 val32)
214*01826a49SYabin Cui {
215*01826a49SYabin Cui     put_unaligned_be32(val32, memPtr);
216*01826a49SYabin Cui }
217*01826a49SYabin Cui 
MEM_readBE64(const void * memPtr)218*01826a49SYabin Cui MEM_STATIC U64 MEM_readBE64(const void *memPtr)
219*01826a49SYabin Cui {
220*01826a49SYabin Cui     return get_unaligned_be64(memPtr);
221*01826a49SYabin Cui }
222*01826a49SYabin Cui 
MEM_writeBE64(void * memPtr,U64 val64)223*01826a49SYabin Cui MEM_STATIC void MEM_writeBE64(void *memPtr, U64 val64)
224*01826a49SYabin Cui {
225*01826a49SYabin Cui     put_unaligned_be64(val64, memPtr);
226*01826a49SYabin Cui }
227*01826a49SYabin Cui 
MEM_readBEST(const void * memPtr)228*01826a49SYabin Cui MEM_STATIC size_t MEM_readBEST(const void *memPtr)
229*01826a49SYabin Cui {
230*01826a49SYabin Cui 	if (MEM_32bits())
231*01826a49SYabin Cui 		return (size_t)MEM_readBE32(memPtr);
232*01826a49SYabin Cui 	else
233*01826a49SYabin Cui 		return (size_t)MEM_readBE64(memPtr);
234*01826a49SYabin Cui }
235*01826a49SYabin Cui 
MEM_writeBEST(void * memPtr,size_t val)236*01826a49SYabin Cui MEM_STATIC void MEM_writeBEST(void *memPtr, size_t val)
237*01826a49SYabin Cui {
238*01826a49SYabin Cui 	if (MEM_32bits())
239*01826a49SYabin Cui 		MEM_writeBE32(memPtr, (U32)val);
240*01826a49SYabin Cui 	else
241*01826a49SYabin Cui 		MEM_writeBE64(memPtr, (U64)val);
242*01826a49SYabin Cui }
243*01826a49SYabin Cui 
MEM_swap32(U32 in)244*01826a49SYabin Cui MEM_STATIC U32 MEM_swap32(U32 in)
245*01826a49SYabin Cui {
246*01826a49SYabin Cui     return swab32(in);
247*01826a49SYabin Cui }
248*01826a49SYabin Cui 
MEM_swap64(U64 in)249*01826a49SYabin Cui MEM_STATIC U64 MEM_swap64(U64 in)
250*01826a49SYabin Cui {
251*01826a49SYabin Cui     return swab64(in);
252*01826a49SYabin Cui }
253*01826a49SYabin Cui 
MEM_swapST(size_t in)254*01826a49SYabin Cui MEM_STATIC size_t MEM_swapST(size_t in)
255*01826a49SYabin Cui {
256*01826a49SYabin Cui     if (MEM_32bits())
257*01826a49SYabin Cui         return (size_t)MEM_swap32((U32)in);
258*01826a49SYabin Cui     else
259*01826a49SYabin Cui         return (size_t)MEM_swap64((U64)in);
260*01826a49SYabin Cui }
261*01826a49SYabin Cui 
262*01826a49SYabin Cui #endif /* MEM_H_MODULE */
263