aboutsummaryrefslogtreecommitdiff
path: root/src/components/mem/simple_mem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-04-30 16:03:55 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-04-30 16:03:55 +0300
commit191eaea25cf569ad9c5fb12b8755ae6400750e58 (patch)
treea0cd14f4a772da01b445355eb35eec54616d01ec /src/components/mem/simple_mem.c
downloadgran-191eaea25cf569ad9c5fb12b8755ae6400750e58.tar.gz
gran-191eaea25cf569ad9c5fb12b8755ae6400750e58.zip
initial
Diffstat (limited to 'src/components/mem/simple_mem.c')
-rw-r--r--src/components/mem/simple_mem.c48
1 files changed, 48 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;
+}