From 191eaea25cf569ad9c5fb12b8755ae6400750e58 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sun, 30 Apr 2023 16:03:55 +0300 Subject: initial --- src/components/mem/simple_mem.c | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/components/mem/simple_mem.c (limited to 'src/components/mem/simple_mem.c') 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 +#include + +#include + +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; +} -- cgit v1.3