diff --git a/kern/libkern/memory.c b/kern/libkern/memory.c index 47ac873..72871fa 100644 --- a/kern/libkern/memory.c +++ b/kern/libkern/memory.c @@ -1,28 +1,21 @@ +#include #include -#include -#include +#include -#define MAX_PROBE_SIZE (256 * 1024 * 1024) // Probe up to 256 MiB max -#define PROBE_STEP 0x1000 // Probe every 4 KiB page +int memory_sweep(const uintptr_t start, const uintptr_t end) { + assert_msg(start < end, "Start needs to be before end."); + uintptr_t sweeper = start; -size_t probe_memory(void) { - volatile u32 *addr; - u32 test_pattern = 0xA5A5A5A5; - size_t detected = 0; - - for (size_t offset = 4096 * 16; offset < MAX_PROBE_SIZE; offset += PROBE_STEP) { - addr = (volatile u32 *)(KERNBASE + offset); - - u32 old = *addr; - *addr = test_pattern; - - if (*addr != test_pattern) { - break; // Memory not readable/writable here, stop probing - } - - *addr = old; // restore original data - detected = offset + PROBE_STEP; + while (sweeper < end) { + *(uint64_t *)sweeper = 0xFAFAFAFABCBCBCBC; + sweeper += sizeof(uint64_t); } - return detected; + sweeper -= sizeof(uint64_t); + while (sweeper != start) { + assert(*(uint64_t *)sweeper == 0xFAFAFAFABCBCBCBC); + sweeper -= sizeof(uint64_t); + } + + return EXIT_SUCCESS; } diff --git a/kern/libkern/memory.h b/kern/libkern/memory.h index c8d7d36..a61d701 100644 --- a/kern/libkern/memory.h +++ b/kern/libkern/memory.h @@ -8,9 +8,8 @@ #define PHYSTOP (KERNBASE + 128 * 1024 * 1024) /** - * Returns size in bytes of detected RAM In qemu, it requires a trap handler to - * handle the interrupt when accessing unavailable memory. + * Set and fetch routine for checking memory. */ -size_t probe_memory(void); +int memory_sweep(const uintptr_t start, const uintptr_t end); -#endif // MEMORY_KARNEL_H +#endif // MEMORY_KERNEL_H