feat: kernel stack tracing
[lunaix-os.git] / lunaix-os / libs / klibc / string / mem.c
index 0b93a7d065f198ba18cba0c471e2b09990a61c7a..3183f0288caa68b7d2f8e3946ead80aa62845905 100755 (executable)
@@ -1,22 +1,24 @@
-#include <stdint.h>
 #include <klibc/string.h>
+#include <lunaix/types.h>
 
 void*
 memcpy(void* dest, const void* src, size_t num)
 {
-    uint8_t* dest_ptr = (uint8_t*)dest;
-    const uint8_t* src_ptr = (const uint8_t*)src;
-    for (size_t i = 0; i < num; i++) {
-        *(dest_ptr + i) = *(src_ptr + i);
-    }
+    if (!num)
+        return dest;
+    asm volatile("movl %1, %%edi\n"
+                 "rep movsb\n" ::"S"(src),
+                 "r"(dest),
+                 "c"(num)
+                 : "edi", "memory");
     return dest;
 }
 
 void*
 memmove(void* dest, const void* src, size_t num)
 {
-    uint8_t* dest_ptr = (uint8_t*)dest;
-    const uint8_t* src_ptr = (const uint8_t*)src;
+    u8_t* dest_ptr = (u8_t*)dest;
+    const u8_t* src_ptr = (const u8_t*)src;
     if (dest_ptr < src_ptr) {
         for (size_t i = 0; i < num; i++) {
             *(dest_ptr + i) = *(src_ptr + i);
@@ -32,18 +34,19 @@ memmove(void* dest, const void* src, size_t num)
 void*
 memset(void* ptr, int value, size_t num)
 {
-    uint8_t* c_ptr = (uint8_t*)ptr;
-    for (size_t i = 0; i < num; i++) {
-        *(c_ptr + i) = (uint8_t)value;
-    }
+    asm volatile("movl %1, %%edi\n"
+                 "rep stosb\n" ::"c"(num),
+                 "r"(ptr),
+                 "a"(value)
+                 : "edi", "memory");
     return ptr;
 }
 
 int
 memcmp(const void* ptr1, const void* ptr2, size_t num)
 {
-    uint8_t* p1 = (uint8_t*)ptr1;
-    uint8_t* p2 = (uint8_t*)ptr2;
+    u8_t* p1 = (u8_t*)ptr1;
+    u8_t* p2 = (u8_t*)ptr2;
     for (size_t i = 0; i < num; i++) {
         int diff = *(p1 + i) - *(p2 + i);
         if (diff != 0) {