diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-04-30 16:03:55 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-04-30 16:03:55 +0300 |
| commit | 191eaea25cf569ad9c5fb12b8755ae6400750e58 (patch) | |
| tree | a0cd14f4a772da01b445355eb35eec54616d01ec /src/components/mem/simple_mem.c | |
| download | gran-191eaea25cf569ad9c5fb12b8755ae6400750e58.tar.gz gran-191eaea25cf569ad9c5fb12b8755ae6400750e58.zip | |
initial
Diffstat (limited to 'src/components/mem/simple_mem.c')
| -rw-r--r-- | src/components/mem/simple_mem.c | 48 |
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; +} |
