11da177e4SLinus Torvalds/* 21da177e4SLinus Torvalds * linux/arch/arm/kernel/entry-common.S 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Copyright (C) 2000 Russell King 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 71da177e4SLinus Torvalds * it under the terms of the GNU General Public License version 2 as 81da177e4SLinus Torvalds * published by the Free Software Foundation. 91da177e4SLinus Torvalds */ 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds#include <asm/unistd.h> 12395a59d0SAbhishek Sagar#include <asm/ftrace.h> 13a09e64fbSRussell King#include <mach/entry-macro.S> 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds#include "entry-header.S" 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds 181da177e4SLinus Torvalds .align 5 191da177e4SLinus Torvalds/* 201da177e4SLinus Torvalds * This is the fast syscall return path. We do as little as 211da177e4SLinus Torvalds * possible here, and this includes saving r0 back into the SVC 221da177e4SLinus Torvalds * stack. 231da177e4SLinus Torvalds */ 241da177e4SLinus Torvaldsret_fast_syscall: 251ec42c0cSRussell King disable_irq @ disable interrupts 261da177e4SLinus Torvalds ldr r1, [tsk, #TI_FLAGS] 271da177e4SLinus Torvalds tst r1, #_TIF_WORK_MASK 281da177e4SLinus Torvalds bne fast_work_pending 29f4dc9a4cSRussell King 30f80dff9dSDan Williams /* perform architecture specific actions before user return */ 31f80dff9dSDan Williams arch_ret_to_user r1, lr 32f80dff9dSDan Williams 33f4dc9a4cSRussell King @ fast_restore_user_regs 34f4dc9a4cSRussell King ldr r1, [sp, #S_OFF + S_PSR] @ get calling cpsr 35f4dc9a4cSRussell King ldr lr, [sp, #S_OFF + S_PC]! @ get pc 36f4dc9a4cSRussell King msr spsr_cxsf, r1 @ save in spsr_svc 37f4dc9a4cSRussell King ldmdb sp, {r1 - lr}^ @ get calling r1 - lr 38f4dc9a4cSRussell King mov r0, r0 39f4dc9a4cSRussell King add sp, sp, #S_FRAME_SIZE - S_PC 40f4dc9a4cSRussell King movs pc, lr @ return & move spsr_svc into cpsr 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds/* 431da177e4SLinus Torvalds * Ok, we need to do extra processing, enter the slow path. 441da177e4SLinus Torvalds */ 451da177e4SLinus Torvaldsfast_work_pending: 461da177e4SLinus Torvalds str r0, [sp, #S_R0+S_OFF]! @ returned r0 471da177e4SLinus Torvaldswork_pending: 481da177e4SLinus Torvalds tst r1, #_TIF_NEED_RESCHED 491da177e4SLinus Torvalds bne work_resched 50a583f1b5SStephane Eranian tst r1, #_TIF_SIGPENDING 511da177e4SLinus Torvalds beq no_work_pending 521da177e4SLinus Torvalds mov r0, sp @ 'regs' 531da177e4SLinus Torvalds mov r2, why @ 'syscall' 541da177e4SLinus Torvalds bl do_notify_resume 55a6c61e9dSDaniel Jacobowitz b ret_slow_syscall @ Check work again 561da177e4SLinus Torvalds 571da177e4SLinus Torvaldswork_resched: 581da177e4SLinus Torvalds bl schedule 591da177e4SLinus Torvalds/* 601da177e4SLinus Torvalds * "slow" syscall return path. "why" tells us if this was a real syscall. 611da177e4SLinus Torvalds */ 621da177e4SLinus TorvaldsENTRY(ret_to_user) 631da177e4SLinus Torvaldsret_slow_syscall: 641ec42c0cSRussell King disable_irq @ disable interrupts 651da177e4SLinus Torvalds ldr r1, [tsk, #TI_FLAGS] 661da177e4SLinus Torvalds tst r1, #_TIF_WORK_MASK 671da177e4SLinus Torvalds bne work_pending 681da177e4SLinus Torvaldsno_work_pending: 69f80dff9dSDan Williams /* perform architecture specific actions before user return */ 70f80dff9dSDan Williams arch_ret_to_user r1, lr 71f80dff9dSDan Williams 72f4dc9a4cSRussell King @ slow_restore_user_regs 73f4dc9a4cSRussell King ldr r1, [sp, #S_PSR] @ get calling cpsr 74f4dc9a4cSRussell King ldr lr, [sp, #S_PC]! @ get pc 75f4dc9a4cSRussell King msr spsr_cxsf, r1 @ save in spsr_svc 767b544c99SGeorge G. Davis ldmdb sp, {r0 - lr}^ @ get calling r0 - lr 77f4dc9a4cSRussell King mov r0, r0 78f4dc9a4cSRussell King add sp, sp, #S_FRAME_SIZE - S_PC 79f4dc9a4cSRussell King movs pc, lr @ return & move spsr_svc into cpsr 8093ed3970SCatalin MarinasENDPROC(ret_to_user) 811da177e4SLinus Torvalds 821da177e4SLinus Torvalds/* 831da177e4SLinus Torvalds * This is how we return from a fork. 841da177e4SLinus Torvalds */ 851da177e4SLinus TorvaldsENTRY(ret_from_fork) 861da177e4SLinus Torvalds bl schedule_tail 871da177e4SLinus Torvalds get_thread_info tsk 881da177e4SLinus Torvalds ldr r1, [tsk, #TI_FLAGS] @ check for syscall tracing 891da177e4SLinus Torvalds mov why, #1 901da177e4SLinus Torvalds tst r1, #_TIF_SYSCALL_TRACE @ are we tracing syscalls? 911da177e4SLinus Torvalds beq ret_slow_syscall 921da177e4SLinus Torvalds mov r1, sp 931da177e4SLinus Torvalds mov r0, #1 @ trace exit [IP = 1] 941da177e4SLinus Torvalds bl syscall_trace 951da177e4SLinus Torvalds b ret_slow_syscall 9693ed3970SCatalin MarinasENDPROC(ret_from_fork) 971da177e4SLinus Torvalds 98fa1b4f91SAl Viro .equ NR_syscalls,0 99fa1b4f91SAl Viro#define CALL(x) .equ NR_syscalls,NR_syscalls+1 1001da177e4SLinus Torvalds#include "calls.S" 101fa1b4f91SAl Viro#undef CALL 102fa1b4f91SAl Viro#define CALL(x) .long x 1031da177e4SLinus Torvalds 104606576ceSSteven Rostedt#ifdef CONFIG_FUNCTION_TRACER 105014c257cSAbhishek Sagar#ifdef CONFIG_DYNAMIC_FTRACE 106014c257cSAbhishek SagarENTRY(mcount) 107014c257cSAbhishek Sagar stmdb sp!, {r0-r3, lr} 108014c257cSAbhishek Sagar mov r0, lr 109395a59d0SAbhishek Sagar sub r0, r0, #MCOUNT_INSN_SIZE 110014c257cSAbhishek Sagar 111014c257cSAbhishek Sagar .globl mcount_call 112014c257cSAbhishek Sagarmcount_call: 113014c257cSAbhishek Sagar bl ftrace_stub 114d4cc510cSUwe Kleine-König ldr lr, [fp, #-4] @ restore lr 115014c257cSAbhishek Sagar ldmia sp!, {r0-r3, pc} 116014c257cSAbhishek Sagar 117014c257cSAbhishek SagarENTRY(ftrace_caller) 118014c257cSAbhishek Sagar stmdb sp!, {r0-r3, lr} 119014c257cSAbhishek Sagar ldr r1, [fp, #-4] 120014c257cSAbhishek Sagar mov r0, lr 121395a59d0SAbhishek Sagar sub r0, r0, #MCOUNT_INSN_SIZE 122014c257cSAbhishek Sagar 123014c257cSAbhishek Sagar .globl ftrace_call 124014c257cSAbhishek Sagarftrace_call: 125014c257cSAbhishek Sagar bl ftrace_stub 126d4cc510cSUwe Kleine-König ldr lr, [fp, #-4] @ restore lr 127014c257cSAbhishek Sagar ldmia sp!, {r0-r3, pc} 128014c257cSAbhishek Sagar 129014c257cSAbhishek Sagar#else 130014c257cSAbhishek Sagar 131014c257cSAbhishek SagarENTRY(mcount) 132014c257cSAbhishek Sagar stmdb sp!, {r0-r3, lr} 133014c257cSAbhishek Sagar ldr r0, =ftrace_trace_function 134014c257cSAbhishek Sagar ldr r2, [r0] 135014c257cSAbhishek Sagar adr r0, ftrace_stub 136014c257cSAbhishek Sagar cmp r0, r2 137014c257cSAbhishek Sagar bne trace 138d4cc510cSUwe Kleine-König ldr lr, [fp, #-4] @ restore lr 139014c257cSAbhishek Sagar ldmia sp!, {r0-r3, pc} 140014c257cSAbhishek Sagar 141014c257cSAbhishek Sagartrace: 142b3c960b2SUwe Kleine-König ldr r1, [fp, #-4] @ lr of instrumented routine 143014c257cSAbhishek Sagar mov r0, lr 144395a59d0SAbhishek Sagar sub r0, r0, #MCOUNT_INSN_SIZE 145014c257cSAbhishek Sagar mov lr, pc 146014c257cSAbhishek Sagar mov pc, r2 147d4cc510cSUwe Kleine-König mov lr, r1 @ restore lr 148014c257cSAbhishek Sagar ldmia sp!, {r0-r3, pc} 149014c257cSAbhishek Sagar 150014c257cSAbhishek Sagar#endif /* CONFIG_DYNAMIC_FTRACE */ 151014c257cSAbhishek Sagar 152014c257cSAbhishek Sagar .globl ftrace_stub 153014c257cSAbhishek Sagarftrace_stub: 154014c257cSAbhishek Sagar mov pc, lr 155014c257cSAbhishek Sagar 156606576ceSSteven Rostedt#endif /* CONFIG_FUNCTION_TRACER */ 157014c257cSAbhishek Sagar 1581da177e4SLinus Torvalds/*============================================================================= 1591da177e4SLinus Torvalds * SWI handler 1601da177e4SLinus Torvalds *----------------------------------------------------------------------------- 1611da177e4SLinus Torvalds */ 1621da177e4SLinus Torvalds 1631da177e4SLinus Torvalds /* If we're optimising for StrongARM the resulting code won't 1641da177e4SLinus Torvalds run on an ARM7 and we can save a couple of instructions. 1651da177e4SLinus Torvalds --pb */ 1661da177e4SLinus Torvalds#ifdef CONFIG_CPU_ARM710 1673f2829a3SNicolas Pitre#define A710(code...) code 1683f2829a3SNicolas Pitre.Larm710bug: 1691da177e4SLinus Torvalds ldmia sp, {r0 - lr}^ @ Get calling r0 - lr 1701da177e4SLinus Torvalds mov r0, r0 1711da177e4SLinus Torvalds add sp, sp, #S_FRAME_SIZE 17260ac133aSNicolas Pitre subs pc, lr, #4 1731da177e4SLinus Torvalds#else 1743f2829a3SNicolas Pitre#define A710(code...) 1751da177e4SLinus Torvalds#endif 1761da177e4SLinus Torvalds 1771da177e4SLinus Torvalds .align 5 1781da177e4SLinus TorvaldsENTRY(vector_swi) 179f4dc9a4cSRussell King sub sp, sp, #S_FRAME_SIZE 180f4dc9a4cSRussell King stmia sp, {r0 - r12} @ Calling r0 - r12 181f4dc9a4cSRussell King add r8, sp, #S_PC 182f4dc9a4cSRussell King stmdb r8, {sp, lr}^ @ Calling sp, lr 183f4dc9a4cSRussell King mrs r8, spsr @ called from non-FIQ mode, so ok. 184f4dc9a4cSRussell King str lr, [sp, #S_PC] @ Save calling PC 185f4dc9a4cSRussell King str r8, [sp, #S_PSR] @ Save CPSR 186f4dc9a4cSRussell King str r0, [sp, #S_OLD_R0] @ Save OLD_R0 1871da177e4SLinus Torvalds zero_fp 188e0f9f4a6SRussell King 189e0f9f4a6SRussell King /* 190e0f9f4a6SRussell King * Get the system call number. 191e0f9f4a6SRussell King */ 1923f2829a3SNicolas Pitre 193dd35afc2SNicolas Pitre#if defined(CONFIG_OABI_COMPAT) 1943f2829a3SNicolas Pitre 195dd35afc2SNicolas Pitre /* 196dd35afc2SNicolas Pitre * If we have CONFIG_OABI_COMPAT then we need to look at the swi 197dd35afc2SNicolas Pitre * value to determine if it is an EABI or an old ABI call. 198dd35afc2SNicolas Pitre */ 199dd35afc2SNicolas Pitre#ifdef CONFIG_ARM_THUMB 200dd35afc2SNicolas Pitre tst r8, #PSR_T_BIT 201dd35afc2SNicolas Pitre movne r10, #0 @ no thumb OABI emulation 202dd35afc2SNicolas Pitre ldreq r10, [lr, #-4] @ get SWI instruction 203dd35afc2SNicolas Pitre#else 204dd35afc2SNicolas Pitre ldr r10, [lr, #-4] @ get SWI instruction 205dd35afc2SNicolas Pitre A710( and ip, r10, #0x0f000000 @ check for SWI ) 206dd35afc2SNicolas Pitre A710( teq ip, #0x0f000000 ) 207dd35afc2SNicolas Pitre A710( bne .Larm710bug ) 208dd35afc2SNicolas Pitre#endif 209dd35afc2SNicolas Pitre 210dd35afc2SNicolas Pitre#elif defined(CONFIG_AEABI) 211dd35afc2SNicolas Pitre 212dd35afc2SNicolas Pitre /* 213dd35afc2SNicolas Pitre * Pure EABI user space always put syscall number into scno (r7). 214dd35afc2SNicolas Pitre */ 2153f2829a3SNicolas Pitre A710( ldr ip, [lr, #-4] @ get SWI instruction ) 2163f2829a3SNicolas Pitre A710( and ip, ip, #0x0f000000 @ check for SWI ) 2173f2829a3SNicolas Pitre A710( teq ip, #0x0f000000 ) 2183f2829a3SNicolas Pitre A710( bne .Larm710bug ) 219dd35afc2SNicolas Pitre 2203f2829a3SNicolas Pitre#elif defined(CONFIG_ARM_THUMB) 221dd35afc2SNicolas Pitre 222dd35afc2SNicolas Pitre /* Legacy ABI only, possibly thumb mode. */ 223e0f9f4a6SRussell King tst r8, #PSR_T_BIT @ this is SPSR from save_user_regs 224e0f9f4a6SRussell King addne scno, r7, #__NR_SYSCALL_BASE @ put OS number in 225e0f9f4a6SRussell King ldreq scno, [lr, #-4] 226dd35afc2SNicolas Pitre 227e0f9f4a6SRussell King#else 228dd35afc2SNicolas Pitre 229dd35afc2SNicolas Pitre /* Legacy ABI only. */ 230e0f9f4a6SRussell King ldr scno, [lr, #-4] @ get SWI instruction 2313f2829a3SNicolas Pitre A710( and ip, scno, #0x0f000000 @ check for SWI ) 2323f2829a3SNicolas Pitre A710( teq ip, #0x0f000000 ) 2333f2829a3SNicolas Pitre A710( bne .Larm710bug ) 234dd35afc2SNicolas Pitre 235e0f9f4a6SRussell King#endif 2361da177e4SLinus Torvalds 2371da177e4SLinus Torvalds#ifdef CONFIG_ALIGNMENT_TRAP 2381da177e4SLinus Torvalds ldr ip, __cr_alignment 2391da177e4SLinus Torvalds ldr ip, [ip] 2401da177e4SLinus Torvalds mcr p15, 0, ip, c1, c0 @ update control register 2411da177e4SLinus Torvalds#endif 2421ec42c0cSRussell King enable_irq 2431da177e4SLinus Torvalds 2441da177e4SLinus Torvalds get_thread_info tsk 245dd35afc2SNicolas Pitre adr tbl, sys_call_table @ load syscall table pointer 2461da177e4SLinus Torvalds ldr ip, [tsk, #TI_FLAGS] @ check for syscall tracing 247dd35afc2SNicolas Pitre 248dd35afc2SNicolas Pitre#if defined(CONFIG_OABI_COMPAT) 249dd35afc2SNicolas Pitre /* 250dd35afc2SNicolas Pitre * If the swi argument is zero, this is an EABI call and we do nothing. 251dd35afc2SNicolas Pitre * 252dd35afc2SNicolas Pitre * If this is an old ABI call, get the syscall number into scno and 253dd35afc2SNicolas Pitre * get the old ABI syscall table address. 254dd35afc2SNicolas Pitre */ 255dd35afc2SNicolas Pitre bics r10, r10, #0xff000000 256dd35afc2SNicolas Pitre eorne scno, r10, #__NR_OABI_SYSCALL_BASE 257dd35afc2SNicolas Pitre ldrne tbl, =sys_oabi_call_table 258dd35afc2SNicolas Pitre#elif !defined(CONFIG_AEABI) 2591da177e4SLinus Torvalds bic scno, scno, #0xff000000 @ mask off SWI op-code 260e0f9f4a6SRussell King eor scno, scno, #__NR_SYSCALL_BASE @ check OS number 2613f2829a3SNicolas Pitre#endif 262dd35afc2SNicolas Pitre 2633f2829a3SNicolas Pitre stmdb sp!, {r4, r5} @ push fifth and sixth args 2641da177e4SLinus Torvalds tst ip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls? 2651da177e4SLinus Torvalds bne __sys_trace 2661da177e4SLinus Torvalds 2671da177e4SLinus Torvalds cmp scno, #NR_syscalls @ check upper syscall limit 2683f2829a3SNicolas Pitre adr lr, ret_fast_syscall @ return address 2691da177e4SLinus Torvalds ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine 2701da177e4SLinus Torvalds 2711da177e4SLinus Torvalds add r1, sp, #S_OFF 2721da177e4SLinus Torvalds2: mov why, #0 @ no longer a real syscall 273e0f9f4a6SRussell King cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) 274e0f9f4a6SRussell King eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back 2751da177e4SLinus Torvalds bcs arm_syscall 2761da177e4SLinus Torvalds b sys_ni_syscall @ not private func 27793ed3970SCatalin MarinasENDPROC(vector_swi) 2781da177e4SLinus Torvalds 2791da177e4SLinus Torvalds /* 2801da177e4SLinus Torvalds * This is the really slow path. We're going to be doing 2811da177e4SLinus Torvalds * context switches, and waiting for our parent to respond. 2821da177e4SLinus Torvalds */ 2831da177e4SLinus Torvalds__sys_trace: 2843f471126SNicolas Pitre mov r2, scno 2851da177e4SLinus Torvalds add r1, sp, #S_OFF 2861da177e4SLinus Torvalds mov r0, #0 @ trace entry [IP = 0] 2871da177e4SLinus Torvalds bl syscall_trace 2881da177e4SLinus Torvalds 2891da177e4SLinus Torvalds adr lr, __sys_trace_return @ return address 2903f471126SNicolas Pitre mov scno, r0 @ syscall number (possibly new) 2911da177e4SLinus Torvalds add r1, sp, #S_R0 + S_OFF @ pointer to regs 2921da177e4SLinus Torvalds cmp scno, #NR_syscalls @ check upper syscall limit 2931da177e4SLinus Torvalds ldmccia r1, {r0 - r3} @ have to reload r0 - r3 2941da177e4SLinus Torvalds ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine 2951da177e4SLinus Torvalds b 2b 2961da177e4SLinus Torvalds 2971da177e4SLinus Torvalds__sys_trace_return: 2981da177e4SLinus Torvalds str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 2993f471126SNicolas Pitre mov r2, scno 3001da177e4SLinus Torvalds mov r1, sp 3011da177e4SLinus Torvalds mov r0, #1 @ trace exit [IP = 1] 3021da177e4SLinus Torvalds bl syscall_trace 3031da177e4SLinus Torvalds b ret_slow_syscall 3041da177e4SLinus Torvalds 3051da177e4SLinus Torvalds .align 5 3061da177e4SLinus Torvalds#ifdef CONFIG_ALIGNMENT_TRAP 3071da177e4SLinus Torvalds .type __cr_alignment, #object 3081da177e4SLinus Torvalds__cr_alignment: 3091da177e4SLinus Torvalds .word cr_alignment 3101da177e4SLinus Torvalds#endif 311dd35afc2SNicolas Pitre .ltorg 312dd35afc2SNicolas Pitre 313dd35afc2SNicolas Pitre/* 314dd35afc2SNicolas Pitre * This is the syscall table declaration for native ABI syscalls. 315dd35afc2SNicolas Pitre * With EABI a couple syscalls are obsolete and defined as sys_ni_syscall. 316dd35afc2SNicolas Pitre */ 317dd35afc2SNicolas Pitre#define ABI(native, compat) native 318dd35afc2SNicolas Pitre#ifdef CONFIG_AEABI 319dd35afc2SNicolas Pitre#define OBSOLETE(syscall) sys_ni_syscall 320dd35afc2SNicolas Pitre#else 321dd35afc2SNicolas Pitre#define OBSOLETE(syscall) syscall 322dd35afc2SNicolas Pitre#endif 3231da177e4SLinus Torvalds 3241da177e4SLinus Torvalds .type sys_call_table, #object 3251da177e4SLinus TorvaldsENTRY(sys_call_table) 3261da177e4SLinus Torvalds#include "calls.S" 327dd35afc2SNicolas Pitre#undef ABI 328dd35afc2SNicolas Pitre#undef OBSOLETE 3291da177e4SLinus Torvalds 3301da177e4SLinus Torvalds/*============================================================================ 3311da177e4SLinus Torvalds * Special system call wrappers 3321da177e4SLinus Torvalds */ 3331da177e4SLinus Torvalds@ r0 = syscall number 334567bd980SRussell King@ r8 = syscall table 3351da177e4SLinus Torvaldssys_syscall: 3365247593cSPaul Brook bic scno, r0, #__NR_OABI_SYSCALL_BASE 3371da177e4SLinus Torvalds cmp scno, #__NR_syscall - __NR_SYSCALL_BASE 3381da177e4SLinus Torvalds cmpne scno, #NR_syscalls @ check range 3391da177e4SLinus Torvalds stmloia sp, {r5, r6} @ shuffle args 3401da177e4SLinus Torvalds movlo r0, r1 3411da177e4SLinus Torvalds movlo r1, r2 3421da177e4SLinus Torvalds movlo r2, r3 3431da177e4SLinus Torvalds movlo r3, r4 3441da177e4SLinus Torvalds ldrlo pc, [tbl, scno, lsl #2] 3451da177e4SLinus Torvalds b sys_ni_syscall 34693ed3970SCatalin MarinasENDPROC(sys_syscall) 3471da177e4SLinus Torvalds 3481da177e4SLinus Torvaldssys_fork_wrapper: 3491da177e4SLinus Torvalds add r0, sp, #S_OFF 3501da177e4SLinus Torvalds b sys_fork 35193ed3970SCatalin MarinasENDPROC(sys_fork_wrapper) 3521da177e4SLinus Torvalds 3531da177e4SLinus Torvaldssys_vfork_wrapper: 3541da177e4SLinus Torvalds add r0, sp, #S_OFF 3551da177e4SLinus Torvalds b sys_vfork 35693ed3970SCatalin MarinasENDPROC(sys_vfork_wrapper) 3571da177e4SLinus Torvalds 3581da177e4SLinus Torvaldssys_execve_wrapper: 3591da177e4SLinus Torvalds add r3, sp, #S_OFF 3601da177e4SLinus Torvalds b sys_execve 36193ed3970SCatalin MarinasENDPROC(sys_execve_wrapper) 3621da177e4SLinus Torvalds 3631da177e4SLinus Torvaldssys_clone_wrapper: 3641da177e4SLinus Torvalds add ip, sp, #S_OFF 3651da177e4SLinus Torvalds str ip, [sp, #4] 3661da177e4SLinus Torvalds b sys_clone 36793ed3970SCatalin MarinasENDPROC(sys_clone_wrapper) 3681da177e4SLinus Torvalds 3691da177e4SLinus Torvaldssys_sigsuspend_wrapper: 3701da177e4SLinus Torvalds add r3, sp, #S_OFF 3711da177e4SLinus Torvalds b sys_sigsuspend 37293ed3970SCatalin MarinasENDPROC(sys_sigsuspend_wrapper) 3731da177e4SLinus Torvalds 3741da177e4SLinus Torvaldssys_rt_sigsuspend_wrapper: 3751da177e4SLinus Torvalds add r2, sp, #S_OFF 3761da177e4SLinus Torvalds b sys_rt_sigsuspend 37793ed3970SCatalin MarinasENDPROC(sys_rt_sigsuspend_wrapper) 3781da177e4SLinus Torvalds 3791da177e4SLinus Torvaldssys_sigreturn_wrapper: 3801da177e4SLinus Torvalds add r0, sp, #S_OFF 3811da177e4SLinus Torvalds b sys_sigreturn 38293ed3970SCatalin MarinasENDPROC(sys_sigreturn_wrapper) 3831da177e4SLinus Torvalds 3841da177e4SLinus Torvaldssys_rt_sigreturn_wrapper: 3851da177e4SLinus Torvalds add r0, sp, #S_OFF 3861da177e4SLinus Torvalds b sys_rt_sigreturn 38793ed3970SCatalin MarinasENDPROC(sys_rt_sigreturn_wrapper) 3881da177e4SLinus Torvalds 3891da177e4SLinus Torvaldssys_sigaltstack_wrapper: 3901da177e4SLinus Torvalds ldr r2, [sp, #S_OFF + S_SP] 3911da177e4SLinus Torvalds b do_sigaltstack 39293ed3970SCatalin MarinasENDPROC(sys_sigaltstack_wrapper) 3931da177e4SLinus Torvalds 394713c4815SNicolas Pitresys_statfs64_wrapper: 395713c4815SNicolas Pitre teq r1, #88 396713c4815SNicolas Pitre moveq r1, #84 397713c4815SNicolas Pitre b sys_statfs64 39893ed3970SCatalin MarinasENDPROC(sys_statfs64_wrapper) 399713c4815SNicolas Pitre 400713c4815SNicolas Pitresys_fstatfs64_wrapper: 401713c4815SNicolas Pitre teq r1, #88 402713c4815SNicolas Pitre moveq r1, #84 403713c4815SNicolas Pitre b sys_fstatfs64 40493ed3970SCatalin MarinasENDPROC(sys_fstatfs64_wrapper) 405713c4815SNicolas Pitre 4061da177e4SLinus Torvalds/* 4071da177e4SLinus Torvalds * Note: off_4k (r5) is always units of 4K. If we can't do the requested 4081da177e4SLinus Torvalds * offset, we return EINVAL. 4091da177e4SLinus Torvalds */ 4101da177e4SLinus Torvaldssys_mmap2: 4111da177e4SLinus Torvalds#if PAGE_SHIFT > 12 4121da177e4SLinus Torvalds tst r5, #PGOFF_MASK 4131da177e4SLinus Torvalds moveq r5, r5, lsr #PAGE_SHIFT - 12 4141da177e4SLinus Torvalds streq r5, [sp, #4] 4151da177e4SLinus Torvalds beq do_mmap2 4161da177e4SLinus Torvalds mov r0, #-EINVAL 4177999d8d7SRussell King mov pc, lr 4181da177e4SLinus Torvalds#else 4191da177e4SLinus Torvalds str r5, [sp, #4] 4201da177e4SLinus Torvalds b do_mmap2 4211da177e4SLinus Torvalds#endif 42293ed3970SCatalin MarinasENDPROC(sys_mmap2) 423687ad019SNicolas Pitre 42448d7927bSPaul BrookENTRY(pabort_ifar) 42548d7927bSPaul Brook mrc p15, 0, r0, cr6, cr0, 2 42648d7927bSPaul BrookENTRY(pabort_noifar) 42748d7927bSPaul Brook mov pc, lr 42893ed3970SCatalin MarinasENDPROC(pabort_ifar) 42993ed3970SCatalin MarinasENDPROC(pabort_noifar) 43048d7927bSPaul Brook 431687ad019SNicolas Pitre#ifdef CONFIG_OABI_COMPAT 432dd35afc2SNicolas Pitre 433687ad019SNicolas Pitre/* 434687ad019SNicolas Pitre * These are syscalls with argument register differences 435687ad019SNicolas Pitre */ 436687ad019SNicolas Pitre 437687ad019SNicolas Pitresys_oabi_pread64: 438687ad019SNicolas Pitre stmia sp, {r3, r4} 439687ad019SNicolas Pitre b sys_pread64 44093ed3970SCatalin MarinasENDPROC(sys_oabi_pread64) 441687ad019SNicolas Pitre 442687ad019SNicolas Pitresys_oabi_pwrite64: 443687ad019SNicolas Pitre stmia sp, {r3, r4} 444687ad019SNicolas Pitre b sys_pwrite64 44593ed3970SCatalin MarinasENDPROC(sys_oabi_pwrite64) 446687ad019SNicolas Pitre 447687ad019SNicolas Pitresys_oabi_truncate64: 448687ad019SNicolas Pitre mov r3, r2 449687ad019SNicolas Pitre mov r2, r1 450687ad019SNicolas Pitre b sys_truncate64 45193ed3970SCatalin MarinasENDPROC(sys_oabi_truncate64) 452687ad019SNicolas Pitre 453687ad019SNicolas Pitresys_oabi_ftruncate64: 454687ad019SNicolas Pitre mov r3, r2 455687ad019SNicolas Pitre mov r2, r1 456687ad019SNicolas Pitre b sys_ftruncate64 45793ed3970SCatalin MarinasENDPROC(sys_oabi_ftruncate64) 458687ad019SNicolas Pitre 459687ad019SNicolas Pitresys_oabi_readahead: 460687ad019SNicolas Pitre str r3, [sp] 461687ad019SNicolas Pitre mov r3, r2 462687ad019SNicolas Pitre mov r2, r1 463687ad019SNicolas Pitre b sys_readahead 46493ed3970SCatalin MarinasENDPROC(sys_oabi_readahead) 465687ad019SNicolas Pitre 466dd35afc2SNicolas Pitre/* 467dd35afc2SNicolas Pitre * Let's declare a second syscall table for old ABI binaries 468dd35afc2SNicolas Pitre * using the compatibility syscall entries. 469dd35afc2SNicolas Pitre */ 470dd35afc2SNicolas Pitre#define ABI(native, compat) compat 471dd35afc2SNicolas Pitre#define OBSOLETE(syscall) syscall 472dd35afc2SNicolas Pitre 473dd35afc2SNicolas Pitre .type sys_oabi_call_table, #object 474dd35afc2SNicolas PitreENTRY(sys_oabi_call_table) 475dd35afc2SNicolas Pitre#include "calls.S" 476dd35afc2SNicolas Pitre#undef ABI 477dd35afc2SNicolas Pitre#undef OBSOLETE 478dd35afc2SNicolas Pitre 479687ad019SNicolas Pitre#endif 480687ad019SNicolas Pitre 481