29 lines
766 B
C
29 lines
766 B
C
#include <memory.h>
|
|
#include <string.h>
|
|
#include <uart.h>
|
|
|
|
#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;
|
|
}
|