소스 검색

Kernel: Build MiniStdLib.cpp in aarch64 builds

Nico Weber 3 년 전
부모
커밋
a8d96df8e0
2개의 변경된 파일20개의 추가작업 그리고 7개의 파일을 삭제
  1. 19 6
      Kernel/MiniStdLib.cpp
  2. 1 1
      Kernel/Prekernel/CMakeLists.txt

+ 19 - 6
Kernel/MiniStdLib.cpp

@@ -10,24 +10,25 @@ extern "C" {
 
 void* memcpy(void* dest_ptr, const void* src_ptr, size_t n)
 {
+#if ARCH(I386) || ARCH(X86_64)
     size_t dest = (size_t)dest_ptr;
     size_t src = (size_t)src_ptr;
     // FIXME: Support starting at an unaligned address.
     if (!(dest & 0x3) && !(src & 0x3) && n >= 12) {
         size_t size_ts = n / sizeof(size_t);
-#if ARCH(I386)
+#    if ARCH(I386)
         asm volatile(
             "rep movsl\n"
             : "=S"(src), "=D"(dest)
             : "S"(src), "D"(dest), "c"(size_ts)
             : "memory");
-#else
+#    else
         asm volatile(
             "rep movsq\n"
             : "=S"(src), "=D"(dest)
             : "S"(src), "D"(dest), "c"(size_ts)
             : "memory");
-#endif
+#    endif
         n -= size_ts * sizeof(size_t);
         if (n == 0)
             return dest_ptr;
@@ -35,6 +36,12 @@ void* memcpy(void* dest_ptr, const void* src_ptr, size_t n)
     asm volatile(
         "rep movsb\n" ::"S"(src), "D"(dest), "c"(n)
         : "memory");
+#else
+    u8* pd = (u8*)dest_ptr;
+    u8 const* ps = (u8 const*)src_ptr;
+    for (; n--;)
+        *pd++ = *ps++;
+#endif
     return dest_ptr;
 }
 
@@ -52,24 +59,25 @@ void* memmove(void* dest, const void* src, size_t n)
 
 void* memset(void* dest_ptr, int c, size_t n)
 {
+#if ARCH(I386) || ARCH(X86_64)
     size_t dest = (size_t)dest_ptr;
     // FIXME: Support starting at an unaligned address.
     if (!(dest & 0x3) && n >= 12) {
         size_t size_ts = n / sizeof(size_t);
         size_t expanded_c = explode_byte((u8)c);
-#if ARCH(I386)
+#    if ARCH(I386)
         asm volatile(
             "rep stosl\n"
             : "=D"(dest)
             : "D"(dest), "c"(size_ts), "a"(expanded_c)
             : "memory");
-#else
+#    else
         asm volatile(
             "rep stosq\n"
             : "=D"(dest)
             : "D"(dest), "c"(size_ts), "a"(expanded_c)
             : "memory");
-#endif
+#    endif
         n -= size_ts * sizeof(size_t);
         if (n == 0)
             return dest_ptr;
@@ -79,6 +87,11 @@ void* memset(void* dest_ptr, int c, size_t n)
         : "=D"(dest), "=c"(n)
         : "0"(dest), "1"(n), "a"(c)
         : "memory");
+#else
+    u8* pd = (u8*)dest_ptr;
+    for (; n--;)
+        *pd++ = c;
+#endif
     return dest_ptr;
 }
 

+ 1 - 1
Kernel/Prekernel/CMakeLists.txt

@@ -1,5 +1,6 @@
 set(SOURCES
     UBSanitizer.cpp
+    ../MiniStdLib.cpp
 )
 if ("${SERENITY_ARCH}" STREQUAL "aarch64")
     set(SOURCES
@@ -14,7 +15,6 @@ else()
         Arch/x86/multiboot.S
         # FIXME: Eventually, some of these should build on aarch64 too.
         init.cpp
-        ../MiniStdLib.cpp
         ../../Userland/Libraries/LibELF/Relocation.cpp
     )
 endif()