aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/initrd.c27
-rw-r--r--kernel/string.S27
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