#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 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; } return detected; }