D213执行下面的程序, 如果程序偏移量大于某个值(>2048, 更精确的值没有测试), 将进入异常处理
/*
* 此段程序的汇编为: (此段程序与位置无关)
* li a0, 111
* ret
*/
//该程序的地址为: 0x400012C0
u64 get_val(void)
{
return 111;
}
typedef u64 (*PROC)(void);
//该程序的地址为: 0x400012D0
void test_call(u64 addr)
{
PROC call = (PROC)addr;
memcpy((char *)addr, (char *)get_val, 16); //假定函数最长16字节
printf("val=%d\n", call());
}
测试样例:
test_call(0x42000000);
进入异常的信息:
CPU Exception: NO.2
x1(ra) : 00000000400013c4 x2(sp) : 000000004000d9ac
x3(gp) : 000000004000aa68 x4(tp) : 0022802011008002
x5(t0) : 000000004000b960 x6(t1) : 0000000000000000
x7(t2) : 000000000000000f x8(s0/fp): 0000000000000010
x9(s1) : 0000000040010010 x10(a0) : 000000000000000a
x11(a1) : 000000000000000a x12(a2) : 0000000040006e25
x13(a3) : 0000000018710000 x14(a4) : 00000000000f40e6
x15(a5) : 0000000000000020 x16(a7) : 000000004000d676
x17(a7) : 0000000000000010 x18(s2) : 0000000040006e20
x19(s3) : 0000000000000001 x20(s4) : 0000000000000010
x21(s5) : 0000000000000010 x22(s6) : 0000000040010000
x23(s7) : 00000000400012d0 x24(s8) : 0000000000000006
x25(s9) : 0000000000000100 x26(s10) : 0000000040011c48
x27(s11) : 8040408900812002 x28(t3) : 0000000040006ffc
x29(t4) : 0000000000000200 x30(t5) : 0000000000000000
x31(t6) : 0000000000000001
mcause : 0000000000000002 mtval : 0000000000000000
mepc : 0000000040010000 mstatus : 0000000a00001800
离线
想了一天, 还是没有什么头绪
离线
问题已解决, 原因是icache问题, 在调用call()之前, 需要执行一条icache.iall, 让指令缓冲失效
离线