t_noifar)
? 431:? ? ? ? mov? ? pc, lr
? 432: ENDPROC(pabort_ifar)
? 433: ENDPROC(pabort_noifar)
? 434:?
? 435: #ifdef CONFIG_OABI_COMPAT
? 436:?
? 437: /*
? 438:? * These are syscalls with argument register differences
? 439:? */
? 440:?
? 441: sys_oabi_pread64:
? 442:? ? ? ? stmia? ? sp, {r3, r4}
? 443:? ? ? ? b? ? sys_pread64
? 444: ENDPROC(sys_oabi_pread64)
? 445:?
? 446: sys_oabi_pwrite64:
? 447:? ? ? ? stmia? ? sp, {r3, r4}
? 448:? ? ? ? b? ? sys_pwrite64
? 449: ENDPROC(sys_oabi_pwrite64)
? 450:?
? 451: sys_oabi_truncate64:
? 452:? ? ? ? mov? ? r3, r2
? 453:? ? ? ? mov? ? r2, r1
? 454:? ? ? ? b? ? sys_truncate64
? 455: ENDPROC(sys_oabi_truncate64)
? 456:?
? 457: sys_oabi_ftruncate64:
? 458:? ? ? ? mov? ? r3, r2
? 459:? ? ? ? mov? ? r2, r1
? 460:? ? ? ? b? ? sys_ftruncate64
? 461: ENDPROC(sys_oabi_ftruncate64)
? 462:?
? 463: sys_oabi_readahead:
? 464:? ? ? ? str? ? r3, [sp]
? 465:? ? ? ? mov? ? r3, r2
? 466:? ? ? ? mov? ? r2, r1
? 467:? ? ? ? b? ? sys_readahead
? 468: ENDPROC(sys_oabi_readahead)
? 469:?
? 470: /*
? 471:? * Let's declare a second syscall table for old ABI binaries
? 472:? * using the compatibility syscall entries.
? 473:? */
? 474: #define ABI(native, compat) compat
? 475: #define OBSOLETE(syscall) syscall
? 476:?
? 477:? ? .type? ? sys_oabi_call_table, #object
? 478: ENTRY(sys_oabi_call_table)
? 479: #include "calls.S"
? 480: #undef ABI
? 481: #undef OBSOLETE
? 482:?
? 483: #endif
? 484:?
在entry-common.S中包含了上次calls.S,这里简单分析前两次:
第一次:
在entry-common.S中:
? 1: .equ NR_syscalls,0
? ? 2: #define CALL(x) .equ NR_syscalls,NR_syscalls+1
? ? 3: #include "calls.S"
? ? 4: #undef CALL
? ? 5: #define CALL(x) .long x
在calls.S的结尾:
? 1: CALL(sys_preadv)
? ? 2: CALL(sys_pwritev)
? ? 3: #ifndef syscalls_counted
? ? 4: .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
? ? 5: #define syscalls_counted
? ? 6: #endif
? ? 7: .rept syscalls_padding
? ? 8: CALL(sys_ni_syscall)
? ? 9: .endr
分析:
.equ NR_syscalls,0? ? 中涉及到汇编指令.equ:
.equ/.set: 赋值语句, 格式如下:
? .equ(.set) 变量名,表达式
? 例如:
? .equ abc 3 @让abc=3
这里只是定义了一个变量NR_syscalls,并将其初始化为0。可以理解为: NR_syscalls = 0
#define CALL(x) .equ NR_syscalls,NR_syscalls+1?
即 将CALL(x) 定义为: NR_syscalls = NR_syscalls? + 1
#include "calls.S"? ? 将calls.S的内容包进来,因为上面对CALL(x)进行了定义所以相当于执行了多次NR_syscalls++,相当于统计了系统调用的个数,但是注意:在calls.S的结尾的对齐处理:
#ifndef syscalls_counted
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
#define syscalls_counted
#endif
.rept syscalls_padding
? ? ? ? CALL(sys_ni_syscall)
.endr
由于是第一次包含,故syscalls_counted没有定义,
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
为了保证NR_syscalls是4的整数倍,上面的语句相当于:syscalls_padding = ((NR_syscalls + 3) & ~3) - NR_syscalls;
即:假如NR_syscalls 是1,那么syscalls_padding 就是3
?
.rept syscalls_padding
? ? ? ? CALL(sys_ni_syscall)
? ? ? .endr
?
这里涉及到汇编指令.rept的用法:
.rept:重复定义伪操作, 格式如下:
?.rept 重复次数
?数据定义
.endr @结束重复定义
?例如:
?.rept 3
?.byte 0x23
?.endr
?
继续上面的例子:syscalls_padding 为3,那么上面的rept语句块相当于:
CALL(sys_ni_syscall)
CALL(sys_ni_syscall)
CALL(sys_ni_syscall)
即又执行了三次:NR_syscalls++,此时NR_syscalls就变成了4,对齐了。
?
第二次:
? 1: .type? ? sys_call_table, #object
? ? 2: ENTRY(sys_call_table)
? ? 3: #include "calls.S"
? ? 4: #undef ABI
? ? 5: #undef OBSOLETE
? ? 6:?
? ? 7:?
? ? 8: @r0 = syscall number
? ? 9: @r8 = syscall table
? 10: sys_syscall:
? 11:? ? bic? ? scno, r0, #__NR_OABI_SYSCALL_BASE
? 12:? ? cmp? ? scno, #__NR_syscall - __NR_SYSCALL_BASE
? 13:? ? cmpne? ? scno, #NR_syscalls? ? @ check range
? 14:? ? stmloia? ? sp, {r5, r6}? ? ? ? @ shuffle args
? 15:? ? movlo? ? r0, r1
? 16:? ? movlo? ? r1, r2
? 17:? ? movlo? ? r2, r3
? 18:? ? movlo? ? r3, r4
? 19:? ?