#include <linux/kernel.h>
#include <linux/memblock.h>
static u64 patterns[] __initdata = {
static void __init reserve_bad_mem(u64 pattern, phys_addr_t start_bad, phys_addr_t end_bad)
pr_info(" %016llx bad mem addr %pa - %pa reserved\n",
cpu_to_be64(pattern), &start_bad, &end_bad);
memblock_reserve(start_bad, end_bad - start_bad);
static void __init memtest(u64 pattern, phys_addr_t start_phys, phys_addr_t size)
phys_addr_t start_bad, last_bad;
phys_addr_t start_phys_aligned;
const size_t incr = sizeof(pattern);
start_phys_aligned = ALIGN(start_phys, incr);
start = __va(start_phys_aligned);
end = start + (size - (start_phys_aligned - start_phys)) / incr;
for (p = start; p < end; p++)
for (p = start; p < end; p++, start_phys_aligned += incr) {
if (start_phys_aligned == last_bad + incr) {
reserve_bad_mem(pattern, start_bad, last_bad + incr);
start_bad = last_bad = start_phys_aligned;
reserve_bad_mem(pattern, start_bad, last_bad + incr);