summaryrefslogtreecommitdiffhomepage
path: root/src/loader/lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/loader/lib.c')
-rw-r--r--src/loader/lib.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/loader/lib.c b/src/loader/lib.c
index c54ef14..a9fec01 100644
--- a/src/loader/lib.c
+++ b/src/loader/lib.c
@@ -45,6 +45,53 @@ u32 strlcpy(char *dst, const char *src, u32 size)
}
/**
+ * Common memory functions
+ */
+
+void *memcpy(void *dest, const void *src, u32 n)
+{
+ // Inspired by jgraef at osdev
+ u32 num_dwords = n / 4;
+ u32 num_bytes = n % 4;
+ u32 *dest32 = (u32 *)dest;
+ const u32 *src32 = (const u32 *)src;
+ u8 *dest8 = ((u8 *)dest) + num_dwords * 4;
+ const u8 *src8 = ((const u8 *)src) + num_dwords * 4;
+
+ __asm__ volatile("rep movsl\n"
+ : "=S"(src32), "=D"(dest32), "=c"(num_dwords)
+ : "S"(src32), "D"(dest32), "c"(num_dwords)
+ : "memory");
+
+ for (u32 i = 0; i < num_bytes; i++)
+ dest8[i] = src8[i];
+
+ return dest;
+}
+
+void *memset(void *dest, u32 val, u32 n)
+{
+ // Inspired by jgraef at osdev
+ u32 uval = val;
+ u32 num_dwords = n / 4;
+ u32 num_bytes = n % 4;
+ u32 *dest32 = (u32 *)dest;
+ u8 *dest8 = ((u8 *)dest) + num_dwords * 4;
+ u8 val8 = (u8)val;
+ u32 val32 = uval | (uval << 8) | (uval << 16) | (uval << 24);
+
+ __asm__ volatile("rep stosl\n"
+ : "=D"(dest32), "=c"(num_dwords)
+ : "D"(dest32), "c"(num_dwords), "a"(val32)
+ : "memory");
+
+ for (u32 i = 0; i < num_bytes; i++)
+ dest8[i] = val8;
+
+ return dest;
+}
+
+/**
* Conversion
*/