【发布时间】:2011-02-01 10:49:21
【问题描述】:
有人可以向我解释这段代码 sn-p 吗? 另外请给我一些链接/ URL,我可以在其中了解更多信息? 此代码用作包装器来覆盖我们库中的“extern int errno”。有人可以解释一下这个函数,并告诉我为什么在某些系统调用中需要包装器吗?哪些也称为 WeakSYSCALLS?
#define ASM_ARGS_1 ASM_ARGS_0, "r" (_a1)
#define ASM_ARGS_2 ASM_ARGS_1, "r" (_a2)
#define ASM_ARGS_3 ASM_ARGS_2, "r" (_a3)
#define LOADREGS_5(a1, a2, a3, a4, a5) \
register int _v1 asm ("v1") = (int) (a5); \
LOADREGS_4 (a1, a2, a3, a4)
#define LOADREGS_6(a1, a2, a3, a4, a5, a6) \
register int _v2 asm ("v2") = (int) (a6); \
LOADREGS_5 (a1, a2, a3, a4, a5)
#define MYLIBC_SYSCALL(name, nargs, args...) \
({ \
unsigned int retval; \
{ \
register int _a1 asm ("r0"), _nargs asm ("r7"); \
LOADREGS_##nargs(args) \
_nargs = __NR_##name; \
asm volatile ( \
"swi 0x0" \
:"=r"(_a1) \
:"r"(_nargs) ASM_ARGS_##nargs \
: "memory" ); \
retval = _a1; \
} \
if ( retval >= 0xfffff001 ) { \
errno = -retval; \
retval = (unsigned int)-1; \
} \
(int) retval; \
})
【问题讨论】:
标签: c assembly arm wrapper system-calls