ENTRY (vector_swi) save_user_regs zero_fp get_scno // dump the interrupt number in [lr, #-4] To scno (r7) arm710_bug_check scno, ip # ifdef CONFIG_ALIGNMENT_TRAP ldr ip, _ cr_alignment ldr ip, [ip] mcr p15, 0, ip, c1, c0 @ update control register # endif enable_irq ip str r4, [sp, #-S_OFF]! @ Push every th arg get_current_task tsk ldr ip, [tsk, # TSK_PTRACE] @ check for syscall tracing bic scno, scno, #0xff000000 @ mask off SWI op-code // # define OS _NUMBER 9 [entry-header.S] // so for the above example open system call number scno = 0x900005 // eor scno, scno, #0x900000 // and then scno = 0x05 eor scno, scno, # OS _NUMBER <20 @ check OS number // sys_call_table indicates CILS. S content adr tbl, sys_call_table @ load syscall table pointer tst ip, # PT_TRAC ESYS @ are we tracing syscils? Bne _ sys_trace adrsvc al, lr, ret_fast_syscall @ return address cmp scno, # nr_syscils @ check upper syscall limit // execute the sys_open function ldrcc pc, [tbl, scno, lsl #2] @ call sys _ * routine add r1, sp, # S_OFF2: mov why, #0 @ no longer a real syscall cmp scno, # ARMSWI_OFFSET er0 or, scno, # OS _NUMBER <20 @ put OS number back bcs SYMBOL_NAME (arm_syscall) B SYMBOL_NAME (sys_ni_syscall) @ not private func /** This is the really slow path. we're re going to be doing * context switches, and waiting for our parent to respond. */_ sys_trace: add r1, sp, # S_OFF mov r0, #0 @ trace entry [IP = 0] bl SYMBOL_NAME (syscall_trace) // gliethttp [entry-header.S] // Like adr, but force SVC mode (if required ). macro adrsvc, cond, reg, label adr \ cond \ reg, \ label. endm // disassembly: // add lr, pc, #16; lr = _ sys_trace _ Return */adrsvc al, lr, _ sys_trace_return @ return address add r1, sp, # S_R0 + S_OFF @ pointer to regs cmp scno, # nr_syscils @ check upper syscall limit ldmccia r1, {r0-r3} @ have to reload r0-r3 ldrcc pc, [tbl, scno, lsl #2] @ call sys _ * routine B 2b _ sys_trace_return: str r0, [sp, # S_R0 + S_OFF]! @ Save returned r0 mov r1, sp mov r0, #1 @ trace exit [IP = 1] bl SYMBOL_NAME (syscall_trace) B ret_disable_irq. align 5 # ifdef CONFIG_ALIGNMENT_TRAP. type _ cr_alignment, # object _ cr_alignment :. word SYMBOL_NAME (cr_alignment) # endif. type sys_call_table, # objectENTRY (sys_call_table) # include "CILS. s"
|