📄 ramtest.s
字号:
#include <bios/linkage.h>ENTRY(quick_ramtest) stmfd sp!, {r4, lr} ldmia r0, {r4, lr} mvn r2, r1 stmia r0, {r1, r2} ldmia r0, {r3, ip} teq r1, r3 teqeq r2, ip mvn r1, r1 mvn r2, r2 stmia r0, {r1, r2} ldmia r0, {r3, ip} stmia r0, {r4, lr} teqeq r1, r3 moveq r0, ip movne r0, r1 ldmfd sp!, {r4, pc}/* * Block memory checker * r0 = start * r2 = size * r5 = value to write * returns Z set - ok * Z clear - fail, address = r0-4, value = r4 */checkit: mov r3, r21: str r5, [r0], #4 str r5, [r0], #4 str r5, [r0], #4 str r5, [r0], #4 subs r3, r3, #4 * 4 bne 1b sub r0, r0, r2 /* * wait a while */ mov ip, #0x1001: mov ip, ip mov ip, ip mov ip, ip subs ip, ip, #1 bne 1b /* * check that it is still zeros */ mov r3, r21: ldr r4, [r0], #4 teq r4, r5 bne fail subs r3, r3, #4 bne 1b sub r0, r0, r2fail: mov pc, lr/* * r0 = chunk to check * r1 = save chunk (or zero). first 16 bytes hold the result on error * r2 = chunk size */ENTRY(check_chunk) stmfd sp!, {r4 - r8, lr} add r1, r1, #16 /* * First, save the memory */ mov r3, r21: ldmia r0!, {r4 - r8} stmia r1!, {r4 - r8} subs r3, r3, #4 * 4 bne 1b sub r0, r0, r2 sub r1, r1, r2nosave: /* * Ok, now do the actual test * ==================================================== * stage 1 - fill memory with zeros */ mov r5, #0 bl checkit bne stagefail /* ==================================================== * stage 2 - fill memory with ones */ mov r5, #-1 bl checkit bne stagefail /* ==================================================== * stage 3 - fill memory with walking '1' bit pattern */ mov r5, #11: bl checkit bne stagefail movs r5, r5, lsl #1 bne 1b /* ==================================================== * stage 4 - fill memory with walking '0' bit pattern */ mov r5, #-21: bl checkit bne stagefail movs r5, r5, lsl #1 orr r5, r5, #1 bcs 1b /* ==================================================== * stage 5 - alternate 01010101 pattern */ mov r5, #0x55 orr r5, r5, r5, lsl #8 orr r5, r5, r5, lsl #16 bl checkit bne stagefail /* ==================================================== * stage 6 - alternate 10101010 pattern */ mov r5, #0xaa orr r5, r5, r5, lsl #8 orr r5, r5, r5, lsl #16 bl checkit bne stagefail mov ip, #-1 b passstagefail: stmdb r1, {r0, r3, r4, r5} mov ip, #0pass: /* * Copy everything back into place */ mov r3, r21: ldmia r1!, {r4 - r8} stmia r0!, {r4 - r8} subs r3, r3, #4 * 4 bne 1b mov r0, ip ldmfd sp!, {r4 - r8, pc}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -