Added API for read/write common integer sizes from/to memory
authorDavide Libenzi <dlibenzi@google.com>
Sat, 28 Nov 2015 16:32:11 +0000 (08:32 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 16 Dec 2015 21:27:06 +0000 (16:27 -0500)
Added API for read/write common integer sizes from/to memory.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ros/memops.h [new file with mode: 0644]

diff --git a/kern/include/ros/memops.h b/kern/include/ros/memops.h
new file mode 100644 (file)
index 0000000..28f03b5
--- /dev/null
@@ -0,0 +1,72 @@
+/* Copyright (c) 2015 Google Inc
+ * Davide Libenzi <dlibenzi@google.com>
+ * See LICENSE for details.
+ */
+
+#pragma once
+
+#include <sys/types.h>
+#include <stdint.h>
+
+static inline const void *get_le_u16(const void *ptr, uint16_t *pvalue)
+{
+       const uint8_t *p = (const uint8_t *) ptr;
+
+       *pvalue = (uint16_t) p[0] | ((uint16_t) p[1] << 8);
+       return p + sizeof(uint16_t);
+}
+
+static inline const void *get_le_u32(const void *ptr, uint32_t *pvalue)
+{
+       const uint8_t *p = (const uint8_t *) ptr;
+
+       *pvalue = (uint32_t) p[0] | ((uint32_t) p[1] << 8) |
+               ((uint32_t) p[2] << 16) | ((uint32_t) p[3] << 24);
+       return p + sizeof(uint32_t);
+}
+
+static inline const void *get_le_u64(const void *ptr, uint64_t *pvalue)
+{
+       const uint8_t *p = (const uint8_t *) ptr;
+
+       *pvalue = (uint64_t) p[0] | ((uint64_t) p[1] << 8) |
+               ((uint64_t) p[2] << 16) | ((uint64_t) p[3] << 24) |
+               ((uint64_t) p[4] << 32) | ((uint64_t) p[5] << 40) |
+               ((uint64_t) p[6] << 48) | ((uint64_t) p[7] << 56);
+       return p + sizeof(uint64_t);
+}
+
+static inline void *put_le_u16(void *ptr, uint16_t v)
+{
+       uint8_t *p = (uint8_t *) ptr;
+
+       p[0] = (uint8_t) v;
+       p[1] = (uint8_t) (v >> 8);
+       return p + sizeof(uint16_t);
+}
+
+static inline void *put_le_u32(void *ptr, uint32_t v)
+{
+       uint8_t *p = (uint8_t *) ptr;
+
+       p[0] = (uint8_t) v;
+       p[1] = (uint8_t) (v >> 8);
+       p[2] = (uint8_t) (v >> 16);
+       p[3] = (uint8_t) (v >> 24);
+       return p + sizeof(uint32_t);
+}
+
+static inline void *put_le_u64(void *ptr, uint64_t v)
+{
+       uint8_t *p = (uint8_t *) ptr;
+
+       p[0] = (uint8_t) v;
+       p[1] = (uint8_t) (v >> 8);
+       p[2] = (uint8_t) (v >> 16);
+       p[3] = (uint8_t) (v >> 24);
+       p[4] = (uint8_t) (v >> 32);
+       p[5] = (uint8_t) (v >> 40);
+       p[6] = (uint8_t) (v >> 48);
+       p[7] = (uint8_t) (v >> 56);
+       return p + sizeof(uint64_t);
+}