m710bug? ? ? ? ? ? ? ? ? ? ? ? ) ? 212: #endif ? 213:? ? 214: #elif defined(CONFIG_AEABI) ? 215:? ? 216:? ? /* ? 217:? ? ? * Pure EABI user space always put syscall number into scno (r7). ? 218:? ? ? */ ? 219:? A710(? ? ldr? ? ip, [lr, #-4]? ? ? ? ? ? @ get SWI instruction? ? ) ? 220:? A710(? ? and? ? ip, ip, #0x0f000000? ? ? ? @ check for SWI? ? ? ? ) ? 221:? A710(? ? teq? ? ip, #0x0f000000? ? ? ? ? ? ? ? ? ? ? ? ) ? 222:? A710(? ? bne? ? .Larm710bug? ? ? ? ? ? ? ? ? ? ? ? ) ? 223:? ? 224: #elif defined(CONFIG_ARM_THUMB) ? 225:? ? 226:? ? /* Legacy ABI only, possibly thumb mode. */ ? 227:? ? tst? ? r8, #PSR_T_BIT? ? ? ? ? ? @ this is SPSR from save_user_regs ? 228:? ? addne? ? scno, r7, #__NR_SYSCALL_BASE? ? @ put OS number in ? 229:? ? ldreq? ? scno, [lr, #-4] ? 230:? ? 231: #else ? 232:? ? 233:? ? /* Legacy ABI only. */ ? 234:? ? ldr? ? scno, [lr, #-4]? ? ? ? ? ? @ get SWI instruction ? 235:? A710(? ? and? ? ip, scno, #0x0f000000? ? ? ? @ check for SWI? ? ? ? ) ? 236:? A710(? ? teq? ? ip, #0x0f000000? ? ? ? ? ? ? ? ? ? ? ? ) ? 237:? A710(? ? bne? ? .Larm710bug? ? ? ? ? ? ? ? ? ? ? ? ) ? 238:? ? 239: #endif ? 240:? ? 241: #ifdef CONFIG_ALIGNMENT_TRAP ? 242:? ? ldr? ? ip, __cr_alignment ? 243:? ? ldr? ? ip, [ip] ? 244:? ? mcr? ? p15, 0, ip, c1, c0? ? ? ? @ update control register ? 245: #endif ? 246:? ? enable_irq ? 247:? ? 248:? ? get_thread_info tsk ? 249:? ? adr? ? tbl, sys_call_table? ? ? ? @ load syscall table pointer ? 250:? ? ldr? ? ip, [tsk, #TI_FLAGS]? ? ? ? @ check for syscall tracing ? 251:? ? 252: #if defined(CONFIG_OABI_COMPAT) ? 253:? ? /* ? 254:? ? ? * If the swi argument is zero, this is an EABI call and we do nothing. ? 255:? ? ? * ? 256:? ? ? * If this is an old ABI call, get the syscall number into scno and ? 257:? ? ? * get the old ABI syscall table address. ? 258:? ? ? */ ? 259:? ? bics? ? r10, r10, #0xff000000 ? 260:? ? eorne? ? scno, r10, #__NR_OABI_SYSCALL_BASE ? 261:? ? ldrne? ? tbl, =sys_oabi_call_table ? 262: #elif !defined(CONFIG_AEABI) ? 263:? ? bic? ? scno, scno, #0xff000000? ? ? ? @ mask off SWI op-code ? 264:? ? eor? ? scno, scno, #__NR_SYSCALL_BASE? ? @ check OS number ? 265: #endif ? 266:? ? 267:? ? stmdb? ? sp!, {r4, r5}? ? ? ? ? ? @ push fifth and sixth args ? 268:? ? tst? ? ip, #_TIF_SYSCALL_TRACE? ? ? ? @ are we tracing syscalls? ? 269:? ? bne? ? __sys_trace ? 270:? ? 271:? ? cmp? ? scno, #NR_syscalls? ? ? ? @ check upper syscall limit ? 272:? ? adr? ? lr, ret_fast_syscall? ? ? ? @ return address ? 273:? ? ldrcc? ? pc, [tbl, scno, lsl #2]? ? ? ? @ call sys_* routine ? 274:? ? 275:? ? add? ? r1, sp, #S_OFF ? 276: 2:? ? mov? ? why, #0? ? ? ? ? ? ? ? @ no longer a real syscall ? 277:? ? cmp? ? scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) ? 278:? ? eor? ? r0, scno, #__NR_SYSCALL_BASE? ? @ put OS number back ? 279:? ? bcs? ? arm_syscall? ? ? 280:? ? b? ? sys_ni_syscall? ? ? ? ? ? @ not private func ? 281: ENDPROC(vector_swi) ? 282:? ? 283:? ? /* ? 284:? ? ? * This is the really slow path.? We're going to be doing ? 285:? ? ? * context switches, and waiting for our parent to respond. ? 286:? ? ? */ ? 287: __sys_trace: ? 288:? ? mov? ? r2, scno ? 289:? ? add? ? r1, sp, #S_OFF ? 290:? ? mov? ? r0, #0? ? ? ? ? ? ? ? @ trace entry [IP = 0] ? 291:? ? bl? ? syscall_trace ? 292:? ? 293:? ? adr? ? lr, __sys_trace_return? ? ? ? @ return address ? 294:? ? mov? ? scno, r0? ? ? ? ? ? @ syscall number (possibly new) ? 295:? ? add? ? r1, sp, #S_R0 + S_OFF? ? ? ? @ pointer to regs ? 296:? ? cmp? ? scno, #NR_syscalls? ? ? ? @ check upper syscall limit ? 297:? ? ldmccia? ? r1, {r0 - r3}? ? ? ? ? ? @ have to reload r0 - r3 ? 298:? ? ldrcc? ? pc, [tbl, scno, lsl #2]? ? ? ? @ call sys_* routine ? 299:? ? b? ? 2b ? 300:? ? 301: __sys_trace_return: ? 302:? ? str? ? r0, [sp, #S_R0 + S_OFF]!? ? @ save returned r0 ? 303:? ? mov? ? r2, scno ? 304:? ? mov? ? r1, sp ? 305:? ? mov? ? r0, #1? ? ? ? ? ? ? ? @ trace exit [IP = 1] ? 306:? ? bl |