diff options
| author | Miquel Sabaté Solà <mikisabate@gmail.com> | 2024-11-26 22:27:02 +0100 |
|---|---|---|
| committer | Miquel Sabaté Solà <mikisabate@gmail.com> | 2024-11-26 22:27:02 +0100 |
| commit | fa8f9e9f44d47f5b2d0b4cc6a2cc8f328e0caa80 (patch) | |
| tree | 46dea3fa328b013d1d9bd021d2afea2fa9b69c30 | |
| parent | 87d1a2597ceedd03a7d4005db1bf82b72b423a18 (diff) | |
| download | fbos-fa8f9e9f44d47f5b2d0b4cc6a2cc8f328e0caa80.tar.gz fbos-fa8f9e9f44d47f5b2d0b4cc6a2cc8f328e0caa80.zip | |
Move 'memcpy' to assembly
And apparently 'memmove' is not needed anymore, so we dodged a bullet
there.
Signed-off-by: Miquel Sabaté Solà <mikisabate@gmail.com>
| -rw-r--r-- | kernel/initrd.c | 27 | ||||
| -rw-r--r-- | kernel/string.S | 27 |
2 files changed, 31 insertions, 23 deletions
diff --git a/kernel/initrd.c b/kernel/initrd.c index d503dd8..62a4e20 100644 --- a/kernel/initrd.c +++ b/kernel/initrd.c @@ -9,33 +9,16 @@ #define CPIO_HEADER_NAMESIZE 94 #define CPIO_HEADER_SIZE 110 -// TODO: move to assembly -__kernel void *memcpy(void *dest, const void *src, size_t count) -{ - char *destc = dest; - const char *srcc = src; - - for (uint64_t i = 0; i < count; i++) { - *destc++ = *srcc++; - } - return dest; -} - -// TODO: this is required by GCC which must be doing some optimization -// underneath. For now let's keep it simple (and wrong) by just calling memcpy. -__kernel void *memmove(void *dest, const void *src, size_t count) -{ - return memcpy(dest, src, count); -} - -__kernel uint64_t strtoul16(const char *str, size_t count) +// Converts the given string 'str' of 'n' length to an integer by assuming it's +// in base 16. +__kernel uint64_t strtoul16(const char *str, size_t n) { char c; uint64_t ret = 0; uint64_t aux = 0; - for (uint64_t i = 1; count > 0; i *= 16, count--) { - c = str[count - 1]; + for (uint64_t i = 1; n > 0; i *= 16, n--) { + c = str[n - 1]; if (c >= 'A' && c <= 'F') { aux = 10 + (uint64_t)(c - 'A'); } else if (c >= 'a' && c <= 'f') { diff --git a/kernel/string.S b/kernel/string.S index 4fb1ccc..271e8f3 100644 --- a/kernel/string.S +++ b/kernel/string.S @@ -51,7 +51,7 @@ strcmp: * int memcmp(const void *ptr1, const void *ptr2, size_t n) * * Returns (a0): comparison result as in stdlib. - * Parameter (a0, a1): strings to compare. + * Parameters (a0, a1): strings to compare. * Clobbers: t0, t1. */ .global memcmp @@ -70,3 +70,28 @@ memcmp: 2: sub a0, t0, t1 ret + +/* + * Defined in include/fbos/string.h + * + * void memcpy(const void *dest, const void *src, size_t count) + * + * Parameter a0: destination string. + * Parameter a1: source string. + * Parameter a2: number of bytes to copy. + * Clobbers: t0. + */ +.global memcpy +.type memcpy, @function +memcpy: +1: + beqz a2, 3f +2: + lbu t0, 0(a1) + sb t0, 0(a0) + addi a0, a0, 1 + addi a1, a1, 1 + addi a2, a2, -1 + bnez a2, 2b +3: + ret |
