您尚未登录。

楼主 # 2024-03-02 19:50:45

VisionShow
会员
注册时间: 2022-01-28
已发帖子: 12
积分: 12

程序为何不能正确执行?

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

离线

楼主 #1 2024-03-02 19:51:20

VisionShow
会员
注册时间: 2022-01-28
已发帖子: 12
积分: 12

Re: 程序为何不能正确执行?

想了一天,  还是没有什么头绪

离线

楼主 #2 2024-03-02 21:00:37

VisionShow
会员
注册时间: 2022-01-28
已发帖子: 12
积分: 12

Re: 程序为何不能正确执行?

问题已解决,  原因是icache问题,  在调用call()之前,  需要执行一条icache.iall, 让指令缓冲失效

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn