aboutsummaryrefslogtreecommitdiff
path: root/src/components/mem
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/mem')
-rw-r--r--src/components/mem/simple_mem.c48
-rw-r--r--src/components/mem/source.mk1
2 files changed, 49 insertions, 0 deletions
diff --git a/src/components/mem/simple_mem.c b/src/components/mem/simple_mem.c
new file mode 100644
index 0000000..bea68ed
--- /dev/null
+++ b/src/components/mem/simple_mem.c
@@ -0,0 +1,48 @@
+#include <string.h>
+#include <stdlib.h>
+
+#include <gran/components/mem/simple_mem.h>
+
+struct simple_mem {
+ struct component component;
+ size_t size;
+ char buf[];
+};
+
+static stat simple_mem_write(struct simple_mem *mem, uintptr_t addr,
+ size_t size, char *buf)
+{
+ uintptr_t offset = addr % mem->size;
+ if (offset + size > mem->size) {
+ error("write outside memory");
+ return ESIZE;
+ }
+
+ memcpy(mem->buf + offset, buf, size);
+ return OK;
+}
+
+static stat simple_mem_read(struct simple_mem *mem, uintptr_t addr, size_t size,
+ char *buf)
+{
+ uintptr_t offset = addr % mem->size;
+ if (offset + size > mem->size) {
+ error("read outside memory");
+ return ESIZE;
+ }
+
+ memcpy(buf, mem->buf + offset, size);
+ return OK;
+}
+
+struct component *create_simple_mem(size_t size)
+{
+ struct simple_mem *new = calloc(1, sizeof(struct simple_mem) + size);
+ if (!new)
+ return NULL;
+
+ new->size = size;
+ new->component.write = (write_callback)simple_mem_write;
+ new->component.read = (read_callback)simple_mem_read;
+ return (struct component *)new;
+}
diff --git a/src/components/mem/source.mk b/src/components/mem/source.mk
new file mode 100644
index 0000000..9c339ba
--- /dev/null
+++ b/src/components/mem/source.mk
@@ -0,0 +1 @@
+SOURCES += src/components/mem/simple_mem.c