Selaa lähdekoodia

Don't use dword-by-dword memset/memcpy if the addresses are unaligned.

Also don't enable the large kmalloc catcher by default.
Andreas Kling 6 vuotta sitten
vanhempi
commit
c43903eebd
2 muutettua tiedostoa jossa 10 lisäystä ja 4 poistoa
  1. 4 2
      Kernel/StdLib.cpp
  2. 6 2
      Kernel/kmalloc.h

+ 4 - 2
Kernel/StdLib.cpp

@@ -9,7 +9,8 @@ void memcpy(void *dest_ptr, const void *src_ptr, dword n)
 {
 {
     dword dest = (dword)dest_ptr;
     dword dest = (dword)dest_ptr;
     dword src = (dword)src_ptr;
     dword src = (dword)src_ptr;
-    if (n >= 12) {
+    // FIXME: Support starting at an unaligned address.
+    if (!(dest & 0x3) && !(src & 0x3) && n >= 12) {
         size_t dwords = n / sizeof(dword);
         size_t dwords = n / sizeof(dword);
         asm volatile(
         asm volatile(
             "rep movsl\n"
             "rep movsl\n"
@@ -36,7 +37,8 @@ void strcpy(char* dest, const char *src)
 void* memset(void* dest_ptr, byte c, dword n)
 void* memset(void* dest_ptr, byte c, dword n)
 {
 {
     dword dest = (dword)dest_ptr;
     dword dest = (dword)dest_ptr;
-    if (n >= 12) {
+    // FIXME: Support starting at an unaligned address.
+    if (!(dest & 0x3) && n >= 12) {
         size_t dwords = n / sizeof(dword);
         size_t dwords = n / sizeof(dword);
         dword expanded_c = c;
         dword expanded_c = c;
         expanded_c <<= 8;
         expanded_c <<= 8;

+ 6 - 2
Kernel/kmalloc.h

@@ -1,5 +1,7 @@
 #pragma once
 #pragma once
 
 
+//#define KMALLOC_DEBUG_LARGE_ALLOCATIONS
+
 void kmalloc_init();
 void kmalloc_init();
 void* kmalloc_impl(dword size) __attribute__ ((malloc));
 void* kmalloc_impl(dword size) __attribute__ ((malloc));
 void* kmalloc_eternal(size_t) __attribute__ ((malloc));
 void* kmalloc_eternal(size_t) __attribute__ ((malloc));
@@ -20,8 +22,10 @@ inline void* operator new[](size_t, void* p) { return p; }
 
 
 ALWAYS_INLINE void* kmalloc(size_t size)
 ALWAYS_INLINE void* kmalloc(size_t size)
 {
 {
-    // Any kernel allocation >= 32K is very suspicious, catch them.
-    if (size >= 0x8000)
+#ifdef KMALLOC_DEBUG_LARGE_ALLOCATIONS
+    // Any kernel allocation >= 1M is 99.9% a bug.
+    if (size >= 1048576)
         asm volatile("cli;hlt");
         asm volatile("cli;hlt");
+#endif
     return kmalloc_impl(size);
     return kmalloc_impl(size);
 }
 }