Support atomic printks
[akaros.git] / kern / include / ros / memops.h
1 /* Copyright (c) 2015 Google Inc
2  * Davide Libenzi <dlibenzi@google.com>
3  * See LICENSE for details.
4  */
5
6 #pragma once
7
8 #include <sys/types.h>
9 #include <stdint.h>
10
11 static inline const void *get_le_u16(const void *ptr, uint16_t *pvalue)
12 {
13         const uint8_t *p = (const uint8_t *) ptr;
14
15         *pvalue = (uint16_t) p[0] | ((uint16_t) p[1] << 8);
16         return p + sizeof(uint16_t);
17 }
18
19 static inline const void *get_le_u32(const void *ptr, uint32_t *pvalue)
20 {
21         const uint8_t *p = (const uint8_t *) ptr;
22
23         *pvalue = (uint32_t) p[0] | ((uint32_t) p[1] << 8) |
24                 ((uint32_t) p[2] << 16) | ((uint32_t) p[3] << 24);
25         return p + sizeof(uint32_t);
26 }
27
28 static inline const void *get_le_u64(const void *ptr, uint64_t *pvalue)
29 {
30         const uint8_t *p = (const uint8_t *) ptr;
31
32         *pvalue = (uint64_t) p[0] | ((uint64_t) p[1] << 8) |
33                 ((uint64_t) p[2] << 16) | ((uint64_t) p[3] << 24) |
34                 ((uint64_t) p[4] << 32) | ((uint64_t) p[5] << 40) |
35                 ((uint64_t) p[6] << 48) | ((uint64_t) p[7] << 56);
36         return p + sizeof(uint64_t);
37 }
38
39 static inline void *put_le_u16(void *ptr, uint16_t v)
40 {
41         uint8_t *p = (uint8_t *) ptr;
42
43         p[0] = (uint8_t) v;
44         p[1] = (uint8_t) (v >> 8);
45         return p + sizeof(uint16_t);
46 }
47
48 static inline void *put_le_u32(void *ptr, uint32_t v)
49 {
50         uint8_t *p = (uint8_t *) ptr;
51
52         p[0] = (uint8_t) v;
53         p[1] = (uint8_t) (v >> 8);
54         p[2] = (uint8_t) (v >> 16);
55         p[3] = (uint8_t) (v >> 24);
56         return p + sizeof(uint32_t);
57 }
58
59 static inline void *put_le_u64(void *ptr, uint64_t v)
60 {
61         uint8_t *p = (uint8_t *) ptr;
62
63         p[0] = (uint8_t) v;
64         p[1] = (uint8_t) (v >> 8);
65         p[2] = (uint8_t) (v >> 16);
66         p[3] = (uint8_t) (v >> 24);
67         p[4] = (uint8_t) (v >> 32);
68         p[5] = (uint8_t) (v >> 40);
69         p[6] = (uint8_t) (v >> 48);
70         p[7] = (uint8_t) (v >> 56);
71         return p + sizeof(uint64_t);
72 }