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> 12f80dff9dSDan Williams#include <asm/arch/entry-macro.S> 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds#include "entry-header.S" 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds .align 5 181da177e4SLinus Torvalds/* 191da177e4SLinus Torvalds * This is the fast syscall return path. We do as little as 201da177e4SLinus Torvalds * possible here, and this includes saving r0 back into the SVC 211da177e4SLinus Torvalds * stack. 221da177e4SLinus Torvalds */ 231da177e4SLinus Torvaldsret_fast_syscall: 241ec42c0cSRussell King disable_irq @ disable interrupts 251da177e4SLinus Torvalds ldr r1, [tsk, #TI_FLAGS] 261da177e4SLinus Torvalds tst r1, #_TIF_WORK_MASK 271da177e4SLinus Torvalds bne fast_work_pending 28f4dc9a4cSRussell King 29f80dff9dSDan Williams /* perform architecture specific actions before user return */ 30f80dff9dSDan Williams arch_ret_to_user r1, lr 31f80dff9dSDan Williams 32f4dc9a4cSRussell King @ fast_restore_user_regs 33f4dc9a4cSRussell King ldr r1, [sp, #S_OFF + S_PSR] @ get calling cpsr 34f4dc9a4cSRussell King ldr lr, [sp, #S_OFF + S_PC]! @ get pc 35f4dc9a4cSRussell King msr spsr_cxsf, r1 @ save in spsr_svc 36f4dc9a4cSRussell King ldmdb sp, {r1 - lr}^ @ get calling r1 - lr 37f4dc9a4cSRussell King mov r0, r0 38f4dc9a4cSRussell King add sp, sp, #S_FRAME_SIZE - S_PC 39f4dc9a4cSRussell King movs pc, lr @ return & move spsr_svc into cpsr 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds/* 421da177e4SLinus Torvalds * Ok, we need to do extra processing, enter the slow path. 431da177e4SLinus Torvalds */ 441da177e4SLinus Torvaldsfast_work_pending: 451da177e4SLinus Torvalds str r0, [sp, #S_R0+S_OFF]! @ returned r0 461da177e4SLinus Torvaldswork_pending: 471da177e4SLinus Torvalds tst r1, #_TIF_NEED_RESCHED 481da177e4SLinus Torvalds bne work_resched 49a583f1b5SStephane Eranian tst r1, #_TIF_SIGPENDING 501da177e4SLinus Torvalds beq no_work_pending 511da177e4SLinus Torvalds mov r0, sp @ 'regs' 521da177e4SLinus Torvalds mov r2, why @ 'syscall' 531da177e4SLinus Torvalds bl do_notify_resume 54a6c61e9dSDaniel Jacobowitz b ret_slow_syscall @ Check work again 551da177e4SLinus Torvalds 561da177e4SLinus Torvaldswork_resched: 571da177e4SLinus Torvalds bl schedule 581da177e4SLinus Torvalds/* 591da177e4SLinus Torvalds * "slow" syscall return path. "why" tells us if this was a real syscall. 601da177e4SLinus Torvalds */ 611da177e4SLinus TorvaldsENTRY(ret_to_user) 621da177e4SLinus Torvaldsret_slow_syscall: 631ec42c0cSRussell King disable_irq @ disable interrupts 641da177e4SLinus Torvalds ldr r1, [tsk, #TI_FLAGS] 651da177e4SLinus Torvalds tst r1, #_TIF_WORK_MASK 661da177e4SLinus Torvalds bne work_pending 671da177e4SLinus Torvaldsno_work_pending: 68f80dff9dSDan Williams /* perform architecture specific actions before user return */ 69f80dff9dSDan Williams arch_ret_to_user r1, lr 70f80dff9dSDan Williams 71f4dc9a4cSRussell King @ slow_restore_user_regs 72f4dc9a4cSRussell King ldr r1, [sp, #S_PSR] @ get calling cpsr 73f4dc9a4cSRussell King ldr lr, [sp, #S_PC]! @ get pc 74f4dc9a4cSRussell King msr spsr_cxsf, r1 @ save in spsr_svc 75f4dc9a4cSRussell King ldmdb sp, {r0 - lr}^ @ get calling r1 - lr 76f4dc9a4cSRussell King mov r0, r0 77f4dc9a4cSRussell King add sp, sp, #S_FRAME_SIZE - S_PC 78f4dc9a4cSRussell King movs pc, lr @ return & move spsr_svc into cpsr 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds/* 811da177e4SLinus Torvalds * This is how we return from a fork. 821da177e4SLinus Torvalds */ 831da177e4SLinus TorvaldsENTRY(ret_from_fork) 841da177e4SLinus Torvalds bl schedule_tail 851da177e4SLinus Torvalds get_thread_info tsk 861da177e4SLinus Torvalds ldr r1, [tsk, #TI_FLAGS] @ check for syscall tracing 871da177e4SLinus Torvalds mov why, #1 881da177e4SLinus Torvalds tst r1, #_TIF_SYSCALL_TRACE @ are we tracing syscalls? 891da177e4SLinus Torvalds beq ret_slow_syscall 901da177e4SLinus Torvalds mov r1, sp 911da177e4SLinus Torvalds mov r0, #1 @ trace exit [IP = 1] 921da177e4SLinus Torvalds bl syscall_trace 931da177e4SLinus Torvalds b ret_slow_syscall 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds 96fa1b4f91SAl Viro .equ NR_syscalls,0 97fa1b4f91SAl Viro#define CALL(x) .equ NR_syscalls,NR_syscalls+1 981da177e4SLinus Torvalds#include "calls.S" 99fa1b4f91SAl Viro#undef CALL 100fa1b4f91SAl Viro#define CALL(x) .long x 1011da177e4SLinus Torvalds 1021da177e4SLinus Torvalds/*============================================================================= 1031da177e4SLinus Torvalds * SWI handler 1041da177e4SLinus Torvalds *----------------------------------------------------------------------------- 1051da177e4SLinus Torvalds */ 1061da177e4SLinus Torvalds 1071da177e4SLinus Torvalds /* If we're optimising for StrongARM the resulting code won't 1081da177e4SLinus Torvalds run on an ARM7 and we can save a couple of instructions. 1091da177e4SLinus Torvalds --pb */ 1101da177e4SLinus Torvalds#ifdef CONFIG_CPU_ARM710 1113f2829a3SNicolas Pitre#define A710(code...) code 1123f2829a3SNicolas Pitre.Larm710bug: 1131da177e4SLinus Torvalds ldmia sp, {r0 - lr}^ @ Get calling r0 - lr 1141da177e4SLinus Torvalds mov r0, r0 1151da177e4SLinus Torvalds add sp, sp, #S_FRAME_SIZE 11660ac133aSNicolas Pitre subs pc, lr, #4 1171da177e4SLinus Torvalds#else 1183f2829a3SNicolas Pitre#define A710(code...) 1191da177e4SLinus Torvalds#endif 1201da177e4SLinus Torvalds 1211da177e4SLinus Torvalds .align 5 1221da177e4SLinus TorvaldsENTRY(vector_swi) 123f4dc9a4cSRussell King sub sp, sp, #S_FRAME_SIZE 124f4dc9a4cSRussell King stmia sp, {r0 - r12} @ Calling r0 - r12 125f4dc9a4cSRussell King add r8, sp, #S_PC 126f4dc9a4cSRussell King stmdb r8, {sp, lr}^ @ Calling sp, lr 127f4dc9a4cSRussell King mrs r8, spsr @ called from non-FIQ mode, so ok. 128f4dc9a4cSRussell King str lr, [sp, #S_PC] @ Save calling PC 129f4dc9a4cSRussell King str r8, [sp, #S_PSR] @ Save CPSR 130f4dc9a4cSRussell King str r0, [sp, #S_OLD_R0] @ Save OLD_R0 1311da177e4SLinus Torvalds zero_fp 132e0f9f4a6SRussell King 133e0f9f4a6SRussell King /* 134e0f9f4a6SRussell King * Get the system call number. 135e0f9f4a6SRussell King */ 1363f2829a3SNicolas Pitre 137dd35afc2SNicolas Pitre#if defined(CONFIG_OABI_COMPAT) 1383f2829a3SNicolas Pitre 139dd35afc2SNicolas Pitre /* 140dd35afc2SNicolas Pitre * If we have CONFIG_OABI_COMPAT then we need to look at the swi 141dd35afc2SNicolas Pitre * value to determine if it is an EABI or an old ABI call. 142dd35afc2SNicolas Pitre */ 143dd35afc2SNicolas Pitre#ifdef CONFIG_ARM_THUMB 144dd35afc2SNicolas Pitre tst r8, #PSR_T_BIT 145dd35afc2SNicolas Pitre movne r10, #0 @ no thumb OABI emulation 146dd35afc2SNicolas Pitre ldreq r10, [lr, #-4] @ get SWI instruction 147dd35afc2SNicolas Pitre#else 148dd35afc2SNicolas Pitre ldr r10, [lr, #-4] @ get SWI instruction 149dd35afc2SNicolas Pitre A710( and ip, r10, #0x0f000000 @ check for SWI ) 150dd35afc2SNicolas Pitre A710( teq ip, #0x0f000000 ) 151dd35afc2SNicolas Pitre A710( bne .Larm710bug ) 152dd35afc2SNicolas Pitre#endif 153dd35afc2SNicolas Pitre 154dd35afc2SNicolas Pitre#elif defined(CONFIG_AEABI) 155dd35afc2SNicolas Pitre 156dd35afc2SNicolas Pitre /* 157dd35afc2SNicolas Pitre * Pure EABI user space always put syscall number into scno (r7). 158dd35afc2SNicolas Pitre */ 1593f2829a3SNicolas Pitre A710( ldr ip, [lr, #-4] @ get SWI instruction ) 1603f2829a3SNicolas Pitre A710( and ip, ip, #0x0f000000 @ check for SWI ) 1613f2829a3SNicolas Pitre A710( teq ip, #0x0f000000 ) 1623f2829a3SNicolas Pitre A710( bne .Larm710bug ) 163dd35afc2SNicolas Pitre 1643f2829a3SNicolas Pitre#elif defined(CONFIG_ARM_THUMB) 165dd35afc2SNicolas Pitre 166dd35afc2SNicolas Pitre /* Legacy ABI only, possibly thumb mode. */ 167e0f9f4a6SRussell King tst r8, #PSR_T_BIT @ this is SPSR from save_user_regs 168e0f9f4a6SRussell King addne scno, r7, #__NR_SYSCALL_BASE @ put OS number in 169e0f9f4a6SRussell King ldreq scno, [lr, #-4] 170dd35afc2SNicolas Pitre 171e0f9f4a6SRussell King#else 172dd35afc2SNicolas Pitre 173dd35afc2SNicolas Pitre /* Legacy ABI only. */ 174e0f9f4a6SRussell King ldr scno, [lr, #-4] @ get SWI instruction 1753f2829a3SNicolas Pitre A710( and ip, scno, #0x0f000000 @ check for SWI ) 1763f2829a3SNicolas Pitre A710( teq ip, #0x0f000000 ) 1773f2829a3SNicolas Pitre A710( bne .Larm710bug ) 178dd35afc2SNicolas Pitre 179e0f9f4a6SRussell King#endif 1801da177e4SLinus Torvalds 1811da177e4SLinus Torvalds#ifdef CONFIG_ALIGNMENT_TRAP 1821da177e4SLinus Torvalds ldr ip, __cr_alignment 1831da177e4SLinus Torvalds ldr ip, [ip] 1841da177e4SLinus Torvalds mcr p15, 0, ip, c1, c0 @ update control register 1851da177e4SLinus Torvalds#endif 1861ec42c0cSRussell King enable_irq 1871da177e4SLinus Torvalds 1881da177e4SLinus Torvalds get_thread_info tsk 189dd35afc2SNicolas Pitre adr tbl, sys_call_table @ load syscall table pointer 1901da177e4SLinus Torvalds ldr ip, [tsk, #TI_FLAGS] @ check for syscall tracing 191dd35afc2SNicolas Pitre 192dd35afc2SNicolas Pitre#if defined(CONFIG_OABI_COMPAT) 193dd35afc2SNicolas Pitre /* 194dd35afc2SNicolas Pitre * If the swi argument is zero, this is an EABI call and we do nothing. 195dd35afc2SNicolas Pitre * 196dd35afc2SNicolas Pitre * If this is an old ABI call, get the syscall number into scno and 197dd35afc2SNicolas Pitre * get the old ABI syscall table address. 198dd35afc2SNicolas Pitre */ 199dd35afc2SNicolas Pitre bics r10, r10, #0xff000000 200dd35afc2SNicolas Pitre eorne scno, r10, #__NR_OABI_SYSCALL_BASE 201dd35afc2SNicolas Pitre ldrne tbl, =sys_oabi_call_table 202dd35afc2SNicolas Pitre#elif !defined(CONFIG_AEABI) 2031da177e4SLinus Torvalds bic scno, scno, #0xff000000 @ mask off SWI op-code 204e0f9f4a6SRussell King eor scno, scno, #__NR_SYSCALL_BASE @ check OS number 2053f2829a3SNicolas Pitre#endif 206dd35afc2SNicolas Pitre 2073f2829a3SNicolas Pitre stmdb sp!, {r4, r5} @ push fifth and sixth args 2081da177e4SLinus Torvalds tst ip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls? 2091da177e4SLinus Torvalds bne __sys_trace 2101da177e4SLinus Torvalds 2111da177e4SLinus Torvalds cmp scno, #NR_syscalls @ check upper syscall limit 2123f2829a3SNicolas Pitre adr lr, ret_fast_syscall @ return address 2131da177e4SLinus Torvalds ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine 2141da177e4SLinus Torvalds 2151da177e4SLinus Torvalds add r1, sp, #S_OFF 2161da177e4SLinus Torvalds2: mov why, #0 @ no longer a real syscall 217e0f9f4a6SRussell King cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) 218e0f9f4a6SRussell King eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back 2191da177e4SLinus Torvalds bcs arm_syscall 2201da177e4SLinus Torvalds b sys_ni_syscall @ not private func 2211da177e4SLinus Torvalds 2221da177e4SLinus Torvalds /* 2231da177e4SLinus Torvalds * This is the really slow path. We're going to be doing 2241da177e4SLinus Torvalds * context switches, and waiting for our parent to respond. 2251da177e4SLinus Torvalds */ 2261da177e4SLinus Torvalds__sys_trace: 2273f471126SNicolas Pitre mov r2, scno 2281da177e4SLinus Torvalds add r1, sp, #S_OFF 2291da177e4SLinus Torvalds mov r0, #0 @ trace entry [IP = 0] 2301da177e4SLinus Torvalds bl syscall_trace 2311da177e4SLinus Torvalds 2321da177e4SLinus Torvalds adr lr, __sys_trace_return @ return address 2333f471126SNicolas Pitre mov scno, r0 @ syscall number (possibly new) 2341da177e4SLinus Torvalds add r1, sp, #S_R0 + S_OFF @ pointer to regs 2351da177e4SLinus Torvalds cmp scno, #NR_syscalls @ check upper syscall limit 2361da177e4SLinus Torvalds ldmccia r1, {r0 - r3} @ have to reload r0 - r3 2371da177e4SLinus Torvalds ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine 2381da177e4SLinus Torvalds b 2b 2391da177e4SLinus Torvalds 2401da177e4SLinus Torvalds__sys_trace_return: 2411da177e4SLinus Torvalds str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 2423f471126SNicolas Pitre mov r2, scno 2431da177e4SLinus Torvalds mov r1, sp 2441da177e4SLinus Torvalds mov r0, #1 @ trace exit [IP = 1] 2451da177e4SLinus Torvalds bl syscall_trace 2461da177e4SLinus Torvalds b ret_slow_syscall 2471da177e4SLinus Torvalds 2481da177e4SLinus Torvalds .align 5 2491da177e4SLinus Torvalds#ifdef CONFIG_ALIGNMENT_TRAP 2501da177e4SLinus Torvalds .type __cr_alignment, #object 2511da177e4SLinus Torvalds__cr_alignment: 2521da177e4SLinus Torvalds .word cr_alignment 2531da177e4SLinus Torvalds#endif 254dd35afc2SNicolas Pitre .ltorg 255dd35afc2SNicolas Pitre 256dd35afc2SNicolas Pitre/* 257dd35afc2SNicolas Pitre * This is the syscall table declaration for native ABI syscalls. 258dd35afc2SNicolas Pitre * With EABI a couple syscalls are obsolete and defined as sys_ni_syscall. 259dd35afc2SNicolas Pitre */ 260dd35afc2SNicolas Pitre#define ABI(native, compat) native 261dd35afc2SNicolas Pitre#ifdef CONFIG_AEABI 262dd35afc2SNicolas Pitre#define OBSOLETE(syscall) sys_ni_syscall 263dd35afc2SNicolas Pitre#else 264dd35afc2SNicolas Pitre#define OBSOLETE(syscall) syscall 265dd35afc2SNicolas Pitre#endif 2661da177e4SLinus Torvalds 2671da177e4SLinus Torvalds .type sys_call_table, #object 2681da177e4SLinus TorvaldsENTRY(sys_call_table) 2691da177e4SLinus Torvalds#include "calls.S" 270dd35afc2SNicolas Pitre#undef ABI 271dd35afc2SNicolas Pitre#undef OBSOLETE 2721da177e4SLinus Torvalds 2731da177e4SLinus Torvalds/*============================================================================ 2741da177e4SLinus Torvalds * Special system call wrappers 2751da177e4SLinus Torvalds */ 2761da177e4SLinus Torvalds@ r0 = syscall number 277567bd980SRussell King@ r8 = syscall table 2781da177e4SLinus Torvalds .type sys_syscall, #function 2791da177e4SLinus Torvaldssys_syscall: 2805247593cSPaul Brook bic scno, r0, #__NR_OABI_SYSCALL_BASE 2811da177e4SLinus Torvalds cmp scno, #__NR_syscall - __NR_SYSCALL_BASE 2821da177e4SLinus Torvalds cmpne scno, #NR_syscalls @ check range 2831da177e4SLinus Torvalds stmloia sp, {r5, r6} @ shuffle args 2841da177e4SLinus Torvalds movlo r0, r1 2851da177e4SLinus Torvalds movlo r1, r2 2861da177e4SLinus Torvalds movlo r2, r3 2871da177e4SLinus Torvalds movlo r3, r4 2881da177e4SLinus Torvalds ldrlo pc, [tbl, scno, lsl #2] 2891da177e4SLinus Torvalds b sys_ni_syscall 2901da177e4SLinus Torvalds 2911da177e4SLinus Torvaldssys_fork_wrapper: 2921da177e4SLinus Torvalds add r0, sp, #S_OFF 2931da177e4SLinus Torvalds b sys_fork 2941da177e4SLinus Torvalds 2951da177e4SLinus Torvaldssys_vfork_wrapper: 2961da177e4SLinus Torvalds add r0, sp, #S_OFF 2971da177e4SLinus Torvalds b sys_vfork 2981da177e4SLinus Torvalds 2991da177e4SLinus Torvaldssys_execve_wrapper: 3001da177e4SLinus Torvalds add r3, sp, #S_OFF 3011da177e4SLinus Torvalds b sys_execve 3021da177e4SLinus Torvalds 3031da177e4SLinus Torvaldssys_clone_wrapper: 3041da177e4SLinus Torvalds add ip, sp, #S_OFF 3051da177e4SLinus Torvalds str ip, [sp, #4] 3061da177e4SLinus Torvalds b sys_clone 3071da177e4SLinus Torvalds 3081da177e4SLinus Torvaldssys_sigsuspend_wrapper: 3091da177e4SLinus Torvalds add r3, sp, #S_OFF 3101da177e4SLinus Torvalds b sys_sigsuspend 3111da177e4SLinus Torvalds 3121da177e4SLinus Torvaldssys_rt_sigsuspend_wrapper: 3131da177e4SLinus Torvalds add r2, sp, #S_OFF 3141da177e4SLinus Torvalds b sys_rt_sigsuspend 3151da177e4SLinus Torvalds 3161da177e4SLinus Torvaldssys_sigreturn_wrapper: 3171da177e4SLinus Torvalds add r0, sp, #S_OFF 3181da177e4SLinus Torvalds b sys_sigreturn 3191da177e4SLinus Torvalds 3201da177e4SLinus Torvaldssys_rt_sigreturn_wrapper: 3211da177e4SLinus Torvalds add r0, sp, #S_OFF 3221da177e4SLinus Torvalds b sys_rt_sigreturn 3231da177e4SLinus Torvalds 3241da177e4SLinus Torvaldssys_sigaltstack_wrapper: 3251da177e4SLinus Torvalds ldr r2, [sp, #S_OFF + S_SP] 3261da177e4SLinus Torvalds b do_sigaltstack 3271da177e4SLinus Torvalds 328713c4815SNicolas Pitresys_statfs64_wrapper: 329713c4815SNicolas Pitre teq r1, #88 330713c4815SNicolas Pitre moveq r1, #84 331713c4815SNicolas Pitre b sys_statfs64 332713c4815SNicolas Pitre 333713c4815SNicolas Pitresys_fstatfs64_wrapper: 334713c4815SNicolas Pitre teq r1, #88 335713c4815SNicolas Pitre moveq r1, #84 336713c4815SNicolas Pitre b sys_fstatfs64 337713c4815SNicolas Pitre 3381da177e4SLinus Torvalds/* 3391da177e4SLinus Torvalds * Note: off_4k (r5) is always units of 4K. If we can't do the requested 3401da177e4SLinus Torvalds * offset, we return EINVAL. 3411da177e4SLinus Torvalds */ 3421da177e4SLinus Torvaldssys_mmap2: 3431da177e4SLinus Torvalds#if PAGE_SHIFT > 12 3441da177e4SLinus Torvalds tst r5, #PGOFF_MASK 3451da177e4SLinus Torvalds moveq r5, r5, lsr #PAGE_SHIFT - 12 3461da177e4SLinus Torvalds streq r5, [sp, #4] 3471da177e4SLinus Torvalds beq do_mmap2 3481da177e4SLinus Torvalds mov r0, #-EINVAL 3497999d8d7SRussell King mov pc, lr 3501da177e4SLinus Torvalds#else 3511da177e4SLinus Torvalds str r5, [sp, #4] 3521da177e4SLinus Torvalds b do_mmap2 3531da177e4SLinus Torvalds#endif 354687ad019SNicolas Pitre 355687ad019SNicolas Pitre#ifdef CONFIG_OABI_COMPAT 356dd35afc2SNicolas Pitre 357687ad019SNicolas Pitre/* 358687ad019SNicolas Pitre * These are syscalls with argument register differences 359687ad019SNicolas Pitre */ 360687ad019SNicolas Pitre 361687ad019SNicolas Pitresys_oabi_pread64: 362687ad019SNicolas Pitre stmia sp, {r3, r4} 363687ad019SNicolas Pitre b sys_pread64 364687ad019SNicolas Pitre 365687ad019SNicolas Pitresys_oabi_pwrite64: 366687ad019SNicolas Pitre stmia sp, {r3, r4} 367687ad019SNicolas Pitre b sys_pwrite64 368687ad019SNicolas Pitre 369687ad019SNicolas Pitresys_oabi_truncate64: 370687ad019SNicolas Pitre mov r3, r2 371687ad019SNicolas Pitre mov r2, r1 372687ad019SNicolas Pitre b sys_truncate64 373687ad019SNicolas Pitre 374687ad019SNicolas Pitresys_oabi_ftruncate64: 375687ad019SNicolas Pitre mov r3, r2 376687ad019SNicolas Pitre mov r2, r1 377687ad019SNicolas Pitre b sys_ftruncate64 378687ad019SNicolas Pitre 379687ad019SNicolas Pitresys_oabi_readahead: 380687ad019SNicolas Pitre str r3, [sp] 381687ad019SNicolas Pitre mov r3, r2 382687ad019SNicolas Pitre mov r2, r1 383687ad019SNicolas Pitre b sys_readahead 384687ad019SNicolas Pitre 385dd35afc2SNicolas Pitre/* 386dd35afc2SNicolas Pitre * Let's declare a second syscall table for old ABI binaries 387dd35afc2SNicolas Pitre * using the compatibility syscall entries. 388dd35afc2SNicolas Pitre */ 389dd35afc2SNicolas Pitre#define ABI(native, compat) compat 390dd35afc2SNicolas Pitre#define OBSOLETE(syscall) syscall 391dd35afc2SNicolas Pitre 392dd35afc2SNicolas Pitre .type sys_oabi_call_table, #object 393dd35afc2SNicolas PitreENTRY(sys_oabi_call_table) 394dd35afc2SNicolas Pitre#include "calls.S" 395dd35afc2SNicolas Pitre#undef ABI 396dd35afc2SNicolas Pitre#undef OBSOLETE 397dd35afc2SNicolas Pitre 398687ad019SNicolas Pitre#endif 399687ad019SNicolas Pitre 400