I just discovered the hard way that clobbering FPU/MMX/SSE registers in the kernel makes things very confusing for userspace (and other kernel threads.) Let's banish all of those things from the kernel to keep things simple.
@@ -5,6 +5,7 @@
extern "C" {
+#ifndef KERNEL
void* mmx_memcpy(void* dest, const void* src, size_t len)
{
ASSERT(len >= 1024);
@@ -51,6 +52,7 @@ void* mmx_memcpy(void* dest, const void* src, size_t len)
memcpy(dest_ptr, src_ptr, len);
return dest;
}
+#endif
#ifdef KERNEL
@@ -11,14 +11,18 @@
#include <AK/Types.h>
extern "C" void* mmx_memcpy(void* to, const void* from, size_t);
[[gnu::always_inline]] inline void fast_dword_copy(dword* dest, const dword* src, size_t count)
if (count >= 256) {
mmx_memcpy(dest, src, count * sizeof(count));
return;
asm volatile(
"rep movsl\n"
: "=S"(src), "=D"(dest), "=c"(count)
@@ -8,9 +8,10 @@ extern "C" {
void* memcpy(void* dest_ptr, const void* src_ptr, size_t n)
- if (n >= 1024) {
+ if (n >= 1024)
return mmx_memcpy(dest_ptr, src_ptr, n);
- }
size_t dest = (size_t)dest_ptr;
size_t src = (size_t)src_ptr;