- 论坛徽章:
- 0
|
这个是mips 处理ade异常里的一段汇编
case lh_op:
if (!access_ok(VERIFY_READ, addr, 2))
goto sigbus;
__asm__ __volatile__ (".set\tnoat\n"
#ifdef __BIG_ENDIAN
"1:\tlb\t%0, 0(%2)\n"
"2:\tlbu\t$1, 1(%2)\n\t"
#endif
#ifdef __LITTLE_ENDIAN
"1:\tlb\t%0, 1(%2)\n"
"2:\tlbu\t$1, 0(%2)\n\t"
#endif
"sll\t%0, 0x8\n\t"
"or\t%0, $1\n\t"
"li\t%1, 0\n" ------------------------ 上面是将此地址开始的16个bit组起来
"3:\t.set\tat\n\t" -------------------------- 从这个开始觉得应该是判断是不是组起来就解决了异常,没解决就把返回值设成-EFAULT
".section\t.fixup,\"ax\"\n\t" --------- 这个段定义是干啥?
"4:\tli\t%1, %3\n\t" --------- res = -EFAULT
"j\t3b\n\t" ----------------------- 无条件跳到3的地方,怎么没有判断前面是不是成功就无条件的跳了
".previous\n\t" ---------------- 还有从这个往下是干什么呢?
".section\t__ex_table,\"a\"\n\t"
STR(PTR)"\t1b, 4b\n\t"
STR(PTR)"\t2b, 4b\n\t"
".previous"
: "=&r" (value), "=r" (res)
: "r" (addr), "i" (-EFAULT));
if (res)
goto fault;
compute_return_epc(regs);
regs->regs[insn.i_format.rt] = value;
break;
主要的问题是怎么判断的16bit组起来是否有问题,没问题是怎么走出去的,有问题设置了返回值那个跳转是干什么
多谢大家帮忙哈,O(∩_∩)O |
|