Initial commit: functional for newer bzImage kernels
[wraplinux.git] / le.h
1 /* ----------------------------------------------------------------------- *
2  *   
3  *   Copyright 2008 H. Peter Anvin - All Rights Reserved
4  *
5  *   This program is free software; you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
8  *   Boston MA 02110-1301, USA; either version 2 of the License, or
9  *   (at your option) any later version; incorporated herein by reference.
10  *
11  * ----------------------------------------------------------------------- */
12
13 /*
14  * le.h
15  *
16  * Write unaligned littleendian data
17  */
18
19 #ifndef LE_H
20 #define LE_H
21
22 #include <inttypes.h>
23
24 #if defined(__i386__) || defined(__x86_64__)
25
26 /* Littleendian architecture, unaligned accesses permitted */
27
28 static inline uint16_t rdle16(const uint16_t *p)
29 {
30         return *p;
31 }
32
33 static inline uint32_t rdle32(const uint32_t *p)
34 {
35         return *p;
36 }
37
38 static inline void wrle16(uint16_t v, uint16_t *p)
39 {
40         *p = v;
41 }
42
43 static inline void wrle32(uint32_t v, uint32_t *p)
44 {
45         *p = v;
46 }
47
48 #else
49
50 static inline uint16_t rdle16(const uint16_t *p)
51 {
52         const uint8_t *_p = (const uint8_t *)p;
53         return _p[0] + (_p[1] << 8);
54 }
55
56 static inline uint32_t rdle32(const uint32_t *p)
57 {
58         const uint8_t *_p = (const uint8_t *)p;
59         return _p[0] + (_p[1] << 8) + (_p[2] << 16) + (_p[3] << 24);
60 }
61
62 static inline void wrle16(uint16_t v, uint16_t *p)
63 {
64         uint8_t *_p = (uint8_t *)p;
65
66         _p[0] = v;
67         _p[1] = v >> 8;
68 }
69
70 static inline void wrle32(uint32_t v, uint32_t *p)
71 {
72         uint8_t *_p = (uint8_t *)p;
73
74         _p[0] = v;
75         _p[1] = v >> 8;
76         _p[2] = v >> 16;
77         _p[3] = v >> 24;
78 }
79
80 #endif
81
82 #endif /* LE_H */