概述
简单来说,exception table用于截获一些异常,并且针对该异常做一些修正。
一个简单的例子
先来看一段调用逻辑及代码片段:
futex_init
futex_detect_cmpxchg();
cmpxchg_futex_value_locked(&curval, NULL, 0, 0)
futex_atomic_cmpxchg_inatomic(curval, uaddr, uval, newval);
ARM64平台:
static inline int
futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
u32 oldval, u32 newval)
{
int ret = 0;
u32 val, tmp;
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
return -EFAULT;
asm volatile("// futex_atomic_cmpxchg_inatomic\n"
ALTERNATIVE("nop", SET_PSTATE_PAN(0), ARM64_HAS_PAN, CONFIG_ARM64_PAN)
" prfm pstl1strm, %2\n"
"1: ldxr %w1, %2\n"
" sub %w3, %w1, %w4\n"
" cbnz %w3, 3f\n"
"2: stlxr %w3, %w5, %2\n"
" cbnz %w3, 1b\n"
" dmb ish\n"
"3:\n"
" .pushsection .fixup,\"a