From 090e97e3e17689bd6a7b3b1aa743de852cd0a8d0 Mon Sep 17 00:00:00 2001 From: Francesco Date: Mon, 26 Jan 2026 15:22:46 +0100 Subject: [PATCH] feat(memory, string): add memory and string utilities --- include/memory.h | 10 ++++++++++ include/string.h | 15 +++++++++++++++ run.sh | 4 +++- src/kernel.c | 21 ++++++--------------- src/memory.c | 21 +++++++++++++++++++++ src/string.c | 29 +++++++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 16 deletions(-) create mode 100644 include/memory.h create mode 100644 include/string.h create mode 100644 src/memory.c create mode 100644 src/string.c diff --git a/include/memory.h b/include/memory.h new file mode 100644 index 0000000..ea6f8f0 --- /dev/null +++ b/include/memory.h @@ -0,0 +1,10 @@ +#ifndef RIVOS_MEMORY_H +#define RIVOS_MEMORY_H + +#include "types.h" + +void *kmemset(void *buf, char c, size_t n); + +void *kmemcpy(void *dst, const void *src, size_t n); + +#endif diff --git a/include/string.h b/include/string.h new file mode 100644 index 0000000..7b5babd --- /dev/null +++ b/include/string.h @@ -0,0 +1,15 @@ +#ifndef RIVOS_STRING_H +#define RIVOS_STRING_H + +#include "types.h" + +/** + * This is not a safe function, check dst size + */ +char *kstrcpy(char *dst, const char *src); + +size_t kstrlen(const char *str); + +int kstrcmp(const char *s1, const char *s2); + +#endif diff --git a/run.sh b/run.sh index bc52bf0..fa545d6 100755 --- a/run.sh +++ b/run.sh @@ -18,7 +18,9 @@ CFLAGS="-std=c11 -O2 -g3 -Wall -Wextra --target=riscv32-unknown-elf -fuse-ld=lld $CC $CFLAGS -Wl,-Tkernel.ld -Wl,-Map=kernel.map -o kernel.elf \ src/kernel.c \ - src/io.c + src/io.c \ + src/memory.c \ + src/string.c # Run QEMU # -machine virt: generic riscv platform diff --git a/src/kernel.c b/src/kernel.c index ef03ff3..7aa5f89 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1,6 +1,6 @@ #include "../include/kernel.h" #include "../include/io.h" -#include "../include/types.h" +#include "../include/memory.h" extern char __bss[], __bss_end[], __stack_top[]; @@ -14,7 +14,7 @@ extern char __bss[], __bss_end[], __stack_top[]; * a0 returns and error code */ sbiret_s sbi_call(long arg0, long arg1, long arg2, long arg3, long arg4, long arg5, long fid, long eid) { - register long a0 __asm("a0") = arg0; + register long a0 __asm__("a0") = arg0; register long a1 __asm__("a1") = arg1; register long a2 __asm__("a2") = arg2; register long a3 __asm__("a3") = arg3; @@ -31,27 +31,18 @@ sbiret_s sbi_call(long arg0, long arg1, long arg2, long arg3, long arg4, long ar return (sbiret_s){.error = a0, .value = a1}; } -void k_putchar(char ch) { +void kputchar(char ch) { sbi_call(ch, 0, 0, 0, 0, 0, 0, 1); } -void *k_memset(void *buf, char c, size_t n) { - u8 *p = (u8 *)buf; - while (n--) { - *p++ = c; - } - - return buf; -} - /* Kernel main */ void kernel_main(void) { /* Usually it is not required */ - k_memset(__bss, 0, __bss_end - __bss); + kmemset(__bss, 0, __bss_end - __bss); /* Start here */ - r_printf("%s, %s\n", "Hello", "world!"); - r_printf("3 + 4 = %d\n", 3 + 4); + kprintf("%s, %s\n", "Hello", "world!"); + kprintf("3 + 4 = %d\n", 3 + 4); for (;;) { __asm__ __volatile__("wfi"); diff --git a/src/memory.c b/src/memory.c new file mode 100644 index 0000000..5ffd617 --- /dev/null +++ b/src/memory.c @@ -0,0 +1,21 @@ +#include "../include/memory.h" + +void *kmemset(void *buf, char c, size_t n) { + u8 *p = (u8 *)buf; + while (n--) { + *p++ = c; + } + + return buf; +} + +void *kmemcpy(void *dst, const void *src, size_t n) { + u8 *dest = (u8 *)dst; + const u8 *source = (u8 *)src; + + while (n--) { + *dest++ = *source++; + } + + return dst; +} diff --git a/src/string.c b/src/string.c new file mode 100644 index 0000000..e8c15a5 --- /dev/null +++ b/src/string.c @@ -0,0 +1,29 @@ +#include "../include/string.h" + +char *kstrcpy(char *dst, const char *src) { + while (*src) { + *dst = *src; + src++; + } + + return dst; +} + +size_t kstrlen(const char *str) { + size_t len = 0; + + while (*str) { + len++; + str++; + } + + return len; +} + +int kstrcmp(const char *s1, const char *s2) { + /** + * TODO + */ + + return 0; +}