xref: /openbmc/linux/arch/ia64/kernel/fsys.S (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds * This file contains the light-weight system call handlers (fsyscall-handlers).
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * Copyright (C) 2003 Hewlett-Packard Co
61da177e4SLinus Torvalds * 	David Mosberger-Tang <davidm@hpl.hp.com>
71da177e4SLinus Torvalds *
81da177e4SLinus Torvalds * 25-Sep-03 davidm	Implement fsys_rt_sigprocmask().
91da177e4SLinus Torvalds * 18-Feb-03 louisk	Implement fsys_gettimeofday().
101da177e4SLinus Torvalds * 28-Feb-03 davidm	Fixed several bugs in fsys_gettimeofday().  Tuned it some more,
111da177e4SLinus Torvalds *			probably broke it along the way... ;-)
121da177e4SLinus Torvalds * 13-Jul-04 clameter   Implement fsys_clock_gettime and revise fsys_gettimeofday to make
131da177e4SLinus Torvalds *                      it capable of using memory based clocks without falling back to C code.
143bc207d2SFenghua Yu * 08-Feb-07 Fenghua Yu Implement fsys_getcpu.
153bc207d2SFenghua Yu *
161da177e4SLinus Torvalds */
171da177e4SLinus Torvalds
181da177e4SLinus Torvalds#include <asm/asmmacro.h>
191da177e4SLinus Torvalds#include <asm/errno.h>
2039e01cb8SSam Ravnborg#include <asm/asm-offsets.h>
211da177e4SLinus Torvalds#include <asm/percpu.h>
221da177e4SLinus Torvalds#include <asm/thread_info.h>
231da177e4SLinus Torvalds#include <asm/sal.h>
241da177e4SLinus Torvalds#include <asm/signal.h>
251da177e4SLinus Torvalds#include <asm/unistd.h>
261da177e4SLinus Torvalds
271da177e4SLinus Torvalds#include "entry.h"
28e55645ecSLuis R. Rodriguez#include <asm/native/inst.h>
291da177e4SLinus Torvalds
301da177e4SLinus Torvalds/*
31*71dbc487SJonathan Corbet * See Documentation/arch/ia64/fsys.rst for details on fsyscalls.
321da177e4SLinus Torvalds *
331da177e4SLinus Torvalds * On entry to an fsyscall handler:
341da177e4SLinus Torvalds *   r10	= 0 (i.e., defaults to "successful syscall return")
351da177e4SLinus Torvalds *   r11	= saved ar.pfs (a user-level value)
361da177e4SLinus Torvalds *   r15	= system call number
371da177e4SLinus Torvalds *   r16	= "current" task pointer (in normal kernel-mode, this is in r13)
381da177e4SLinus Torvalds *   r32-r39	= system call arguments
391da177e4SLinus Torvalds *   b6		= return address (a user-level value)
401da177e4SLinus Torvalds *   ar.pfs	= previous frame-state (a user-level value)
411da177e4SLinus Torvalds *   PSR.be	= cleared to zero (i.e., little-endian byte order is in effect)
421da177e4SLinus Torvalds *   all other registers may contain values passed in from user-mode
431da177e4SLinus Torvalds *
441da177e4SLinus Torvalds * On return from an fsyscall handler:
451da177e4SLinus Torvalds *   r11	= saved ar.pfs (as passed into the fsyscall handler)
461da177e4SLinus Torvalds *   r15	= system call number (as passed into the fsyscall handler)
471da177e4SLinus Torvalds *   r32-r39	= system call arguments (as passed into the fsyscall handler)
481da177e4SLinus Torvalds *   b6		= return address (as passed into the fsyscall handler)
491da177e4SLinus Torvalds *   ar.pfs	= previous frame-state (as passed into the fsyscall handler)
501da177e4SLinus Torvalds */
511da177e4SLinus Torvalds
521da177e4SLinus TorvaldsENTRY(fsys_ni_syscall)
531da177e4SLinus Torvalds	.prologue
541da177e4SLinus Torvalds	.altrp b6
551da177e4SLinus Torvalds	.body
561da177e4SLinus Torvalds	mov r8=ENOSYS
571da177e4SLinus Torvalds	mov r10=-1
581da177e4SLinus Torvalds	FSYS_RETURN
591da177e4SLinus TorvaldsEND(fsys_ni_syscall)
601da177e4SLinus Torvalds
611da177e4SLinus TorvaldsENTRY(fsys_getpid)
621da177e4SLinus Torvalds	.prologue
631da177e4SLinus Torvalds	.altrp b6
641da177e4SLinus Torvalds	.body
657a36094dSEric W. Biederman	add r17=IA64_TASK_SIGNAL_OFFSET,r16
6696ded9daSPavel Emelyanov	;;
677a36094dSEric W. Biederman	ld8 r17=[r17]				// r17 = current->signal
681da177e4SLinus Torvalds	add r9=TI_FLAGS+IA64_TASK_SIZE,r16
691da177e4SLinus Torvalds	;;
701da177e4SLinus Torvalds	ld4 r9=[r9]
716883f81aSEric W. Biederman	add r17=IA64_SIGNAL_PIDS_TGID_OFFSET,r17
721da177e4SLinus Torvalds	;;
731da177e4SLinus Torvalds	and r9=TIF_ALLWORK_MASK,r9
746883f81aSEric W. Biederman	ld8 r17=[r17]				// r17 = current->signal->pids[PIDTYPE_TGID]
7596ded9daSPavel Emelyanov	;;
7696ded9daSPavel Emelyanov	add r8=IA64_PID_LEVEL_OFFSET,r17
7796ded9daSPavel Emelyanov	;;
7896ded9daSPavel Emelyanov	ld4 r8=[r8]				// r8 = pid->level
7996ded9daSPavel Emelyanov	add r17=IA64_PID_UPID_OFFSET,r17	// r17 = &pid->numbers[0]
8096ded9daSPavel Emelyanov	;;
8196ded9daSPavel Emelyanov	shl r8=r8,IA64_UPID_SHIFT
8296ded9daSPavel Emelyanov	;;
8396ded9daSPavel Emelyanov	add r17=r17,r8				// r17 = &pid->numbers[pid->level]
8496ded9daSPavel Emelyanov	;;
8596ded9daSPavel Emelyanov	ld4 r8=[r17]				// r8 = pid->numbers[pid->level].nr
8696ded9daSPavel Emelyanov	;;
8796ded9daSPavel Emelyanov	mov r17=0
881da177e4SLinus Torvalds	;;
891da177e4SLinus Torvalds	cmp.ne p8,p0=0,r9
901da177e4SLinus Torvalds(p8)	br.spnt.many fsys_fallback_syscall
911da177e4SLinus Torvalds	FSYS_RETURN
921da177e4SLinus TorvaldsEND(fsys_getpid)
931da177e4SLinus Torvalds
941da177e4SLinus TorvaldsENTRY(fsys_set_tid_address)
951da177e4SLinus Torvalds	.prologue
961da177e4SLinus Torvalds	.altrp b6
971da177e4SLinus Torvalds	.body
981da177e4SLinus Torvalds	add r9=TI_FLAGS+IA64_TASK_SIZE,r16
992c470475SEric W. Biederman	add r17=IA64_TASK_THREAD_PID_OFFSET,r16
1001da177e4SLinus Torvalds	;;
1011da177e4SLinus Torvalds	ld4 r9=[r9]
1021da177e4SLinus Torvalds	tnat.z p6,p7=r32		// check argument register for being NaT
1032c470475SEric W. Biederman	ld8 r17=[r17]				// r17 = current->thread_pid
1041da177e4SLinus Torvalds	;;
1051da177e4SLinus Torvalds	and r9=TIF_ALLWORK_MASK,r9
10696ded9daSPavel Emelyanov	add r8=IA64_PID_LEVEL_OFFSET,r17
1071da177e4SLinus Torvalds	add r18=IA64_TASK_CLEAR_CHILD_TID_OFFSET,r16
1081da177e4SLinus Torvalds	;;
10996ded9daSPavel Emelyanov	ld4 r8=[r8]				// r8 = pid->level
11096ded9daSPavel Emelyanov	add r17=IA64_PID_UPID_OFFSET,r17	// r17 = &pid->numbers[0]
11196ded9daSPavel Emelyanov	;;
11296ded9daSPavel Emelyanov	shl r8=r8,IA64_UPID_SHIFT
11396ded9daSPavel Emelyanov	;;
11496ded9daSPavel Emelyanov	add r17=r17,r8				// r17 = &pid->numbers[pid->level]
11596ded9daSPavel Emelyanov	;;
11696ded9daSPavel Emelyanov	ld4 r8=[r17]				// r8 = pid->numbers[pid->level].nr
11796ded9daSPavel Emelyanov	;;
1181da177e4SLinus Torvalds	cmp.ne p8,p0=0,r9
1191da177e4SLinus Torvalds	mov r17=-1
1201da177e4SLinus Torvalds	;;
1211da177e4SLinus Torvalds(p6)	st8 [r18]=r32
1221da177e4SLinus Torvalds(p7)	st8 [r18]=r17
1231da177e4SLinus Torvalds(p8)	br.spnt.many fsys_fallback_syscall
1241da177e4SLinus Torvalds	;;
1251da177e4SLinus Torvalds	mov r17=0			// i must not leak kernel bits...
1261da177e4SLinus Torvalds	mov r18=0			// i must not leak kernel bits...
1271da177e4SLinus Torvalds	FSYS_RETURN
1281da177e4SLinus TorvaldsEND(fsys_set_tid_address)
1291da177e4SLinus Torvalds
13074a622beSThomas Gleixner#if IA64_GTOD_SEQ_OFFSET !=0
1310aa366f3STony Luck#error fsys_gettimeofday incompatible with changes to struct fsyscall_gtod_data_t
1320aa366f3STony Luck#endif
1330aa366f3STony Luck#if IA64_ITC_JITTER_OFFSET !=0
1340aa366f3STony Luck#error fsys_gettimeofday incompatible with changes to struct itc_jitter_data_t
1351da177e4SLinus Torvalds#endif
1361da177e4SLinus Torvalds#define CLOCK_REALTIME 0
1371da177e4SLinus Torvalds#define CLOCK_MONOTONIC 1
1381da177e4SLinus Torvalds#define CLOCK_DIVIDE_BY_1000 0x4000
1391da177e4SLinus Torvalds#define CLOCK_ADD_MONOTONIC 0x8000
1401da177e4SLinus Torvalds
1411da177e4SLinus TorvaldsENTRY(fsys_gettimeofday)
1421da177e4SLinus Torvalds	.prologue
1431da177e4SLinus Torvalds	.altrp b6
1441da177e4SLinus Torvalds	.body
1451da177e4SLinus Torvalds	mov r31 = r32
1461da177e4SLinus Torvalds	tnat.nz p6,p0 = r33		// guard against NaT argument
1471da177e4SLinus Torvalds(p6)    br.cond.spnt.few .fail_einval
1481da177e4SLinus Torvalds	mov r30 = CLOCK_DIVIDE_BY_1000
1491da177e4SLinus Torvalds	;;
1501da177e4SLinus Torvalds.gettime:
1511da177e4SLinus Torvalds	// Register map
1521da177e4SLinus Torvalds	// Incoming r31 = pointer to address where to place result
1531da177e4SLinus Torvalds	//          r30 = flags determining how time is processed
1541da177e4SLinus Torvalds	// r2,r3 = temp r4-r7 preserved
1551da177e4SLinus Torvalds	// r8 = result nanoseconds
1561da177e4SLinus Torvalds	// r9 = result seconds
1571da177e4SLinus Torvalds	// r10 = temporary storage for clock difference
1581da177e4SLinus Torvalds	// r11 = preserved: saved ar.pfs
1591da177e4SLinus Torvalds	// r12 = preserved: memory stack
1601da177e4SLinus Torvalds	// r13 = preserved: thread pointer
1610aa366f3STony Luck	// r14 = address of mask / mask value
1621da177e4SLinus Torvalds	// r15 = preserved: system call number
1631da177e4SLinus Torvalds	// r16 = preserved: current task pointer
1640aa366f3STony Luck	// r17 = (not used)
1650aa366f3STony Luck	// r18 = (not used)
1660aa366f3STony Luck	// r19 = address of itc_lastcycle
1670aa366f3STony Luck	// r20 = struct fsyscall_gtod_data (= address of gtod_lock.sequence)
1680aa366f3STony Luck	// r21 = address of mmio_ptr
1690aa366f3STony Luck	// r22 = address of wall_time or monotonic_time
1700aa366f3STony Luck	// r23 = address of shift / value
1710aa366f3STony Luck	// r24 = address mult factor / cycle_last value
1720aa366f3STony Luck	// r25 = itc_lastcycle value
1730aa366f3STony Luck	// r26 = address clocksource cycle_last
1740aa366f3STony Luck	// r27 = (not used)
1753eac094bSBhaskar Chowdhury	// r28 = sequence number at the beginning of critical section
1760aa366f3STony Luck	// r29 = address of itc_jitter
1771da177e4SLinus Torvalds	// r30 = time processing flags / memory address
1781da177e4SLinus Torvalds	// r31 = pointer to result
1791da177e4SLinus Torvalds	// Predicates
1801da177e4SLinus Torvalds	// p6,p7 short term use
1811da177e4SLinus Torvalds	// p8 = timesource ar.itc
1821da177e4SLinus Torvalds	// p9 = timesource mmio64
1830aa366f3STony Luck	// p10 = timesource mmio32 - not used
1841da177e4SLinus Torvalds	// p11 = timesource not to be handled by asm code
1850aa366f3STony Luck	// p12 = memory time source ( = p9 | p10) - not used
1860aa366f3STony Luck	// p13 = do cmpxchg with itc_lastcycle
1871da177e4SLinus Torvalds	// p14 = Divide by 1000
1881da177e4SLinus Torvalds	// p15 = Add monotonic
1891da177e4SLinus Torvalds	//
1900aa366f3STony Luck	// Note that instructions are optimized for McKinley. McKinley can
1910aa366f3STony Luck	// process two bundles simultaneously and therefore we continuously
1920aa366f3STony Luck	// try to feed the CPU two bundles and then a stop.
1934fe01c68SHidetoshi Seto
1941da177e4SLinus Torvalds	add r2 = TI_FLAGS+IA64_TASK_SIZE,r16
1954fe01c68SHidetoshi Seto	tnat.nz p6,p0 = r31		// guard against Nat argument
1964fe01c68SHidetoshi Seto(p6)	br.cond.spnt.few .fail_einval
1970aa366f3STony Luck	movl r20 = fsyscall_gtod_data // load fsyscall gettimeofday data address
1981da177e4SLinus Torvalds	;;
1994fe01c68SHidetoshi Seto	ld4 r2 = [r2]			// process work pending flags
2000aa366f3STony Luck	movl r29 = itc_jitter_data	// itc_jitter
2010aa366f3STony Luck	add r22 = IA64_GTOD_WALL_TIME_OFFSET,r20	// wall_time
2020aa366f3STony Luck	add r21 = IA64_CLKSRC_MMIO_OFFSET,r20
2034fe01c68SHidetoshi Seto	mov pr = r30,0xc000	// Set predicates according to function
2044fe01c68SHidetoshi Seto	;;
2050aa366f3STony Luck	and r2 = TIF_ALLWORK_MASK,r2
2064fe01c68SHidetoshi Seto	add r19 = IA64_ITC_LASTCYCLE_OFFSET,r29
2074fe01c68SHidetoshi Seto(p15)	add r22 = IA64_GTOD_MONO_TIME_OFFSET,r20	// monotonic_time
2080aa366f3STony Luck	;;
2090aa366f3STony Luck	add r26 = IA64_CLKSRC_CYCLE_LAST_OFFSET,r20	// clksrc_cycle_last
2101da177e4SLinus Torvalds	cmp.ne p6, p0 = 0, r2	// Fallback if work is scheduled
2111da177e4SLinus Torvalds(p6)	br.cond.spnt.many fsys_fallback_syscall
2121da177e4SLinus Torvalds	;;
2130aa366f3STony Luck	// Begin critical section
2141da177e4SLinus Torvalds.time_redo:
2150aa366f3STony Luck	ld4.acq r28 = [r20]	// gtod_lock.sequence, Must take first
216829a9996SHidetoshi Seto	;;
2170aa366f3STony Luck	and r28 = ~1,r28	// And make sequence even to force retry if odd
218829a9996SHidetoshi Seto	;;
2190aa366f3STony Luck	ld8 r30 = [r21]		// clocksource->mmio_ptr
2200aa366f3STony Luck	add r24 = IA64_CLKSRC_MULT_OFFSET,r20
2210aa366f3STony Luck	ld4 r2 = [r29]		// itc_jitter value
2220aa366f3STony Luck	add r23 = IA64_CLKSRC_SHIFT_OFFSET,r20
2230aa366f3STony Luck	add r14 = IA64_CLKSRC_MASK_OFFSET,r20
2240aa366f3STony Luck	;;
2250aa366f3STony Luck	ld4 r3 = [r24]		// clocksource mult value
2260aa366f3STony Luck	ld8 r14 = [r14]         // clocksource mask value
2270aa366f3STony Luck	cmp.eq p8,p9 = 0,r30	// use cpu timer if no mmio_ptr
2280aa366f3STony Luck	;;
2290aa366f3STony Luck	setf.sig f7 = r3	// Setup for mult scaling of counter
2300aa366f3STony Luck(p8)	cmp.ne p13,p0 = r2,r0	// need itc_jitter compensation, set p13
2310aa366f3STony Luck	ld4 r23 = [r23]		// clocksource shift value
2320aa366f3STony Luck	ld8 r24 = [r26]		// get clksrc_cycle_last value
2330aa366f3STony Luck(p9)	cmp.eq p13,p0 = 0,r30	// if mmio_ptr, clear p13 jitter control
2340aa366f3STony Luck	;;
2350aa366f3STony Luck	.pred.rel.mutex p8,p9
23694752a79SIsaku Yamahata	MOV_FROM_ITC(p8, p6, r2, r10)	// CPU_TIMER. 36 clocks latency!!!
2370aa366f3STony Luck(p9)	ld8 r2 = [r30]		// MMIO_TIMER. Could also have latency issues..
2380aa366f3STony Luck(p13)	ld8 r25 = [r19]		// get itc_lastcycle value
239d4d1fc61STony Luck	ld8 r9 = [r22],IA64_TIME_SN_SPEC_SNSEC_OFFSET	// sec
2401da177e4SLinus Torvalds	;;
241d4d1fc61STony Luck	ld8 r8 = [r22],-IA64_TIME_SN_SPEC_SNSEC_OFFSET	// snsec
2421da177e4SLinus Torvalds(p13)	sub r3 = r25,r2		// Diff needed before comparison (thanks davidm)
2431da177e4SLinus Torvalds	;;
2441da177e4SLinus Torvalds(p13)	cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared
2450aa366f3STony Luck	sub r10 = r2,r24	// current_cycle - last_cycle
2461da177e4SLinus Torvalds	;;
2470aa366f3STony Luck(p6)	sub r10 = r25,r24	// time we got was less than last_cycle
2481da177e4SLinus Torvalds(p7)	mov ar.ccv = r25	// more than last_cycle. Prep for cmpxchg
2491da177e4SLinus Torvalds	;;
2500aa366f3STony Luck(p7)	cmpxchg8.rel r3 = [r19],r2,ar.ccv
2510aa366f3STony Luck	;;
2520aa366f3STony Luck(p7)	cmp.ne p7,p0 = r25,r3	// if cmpxchg not successful
2530aa366f3STony Luck	;;
2540aa366f3STony Luck(p7)	sub r10 = r3,r24	// then use new last_cycle instead
2550aa366f3STony Luck	;;
2561da177e4SLinus Torvalds	and r10 = r10,r14	// Apply mask
2571da177e4SLinus Torvalds	;;
2581da177e4SLinus Torvalds	setf.sig f8 = r10
2591da177e4SLinus Torvalds	nop.i 123
2601da177e4SLinus Torvalds	;;
2610aa366f3STony Luck	// fault check takes 5 cycles and we have spare time
2620aa366f3STony LuckEX(.fail_efault, probe.w.fault r31, 3)
2631da177e4SLinus Torvalds	xmpy.l f8 = f8,f7	// nsec_per_cyc*(counter-last_counter)
2641da177e4SLinus Torvalds	;;
2651da177e4SLinus Torvalds	getf.sig r2 = f8
2661da177e4SLinus Torvalds	mf
2671da177e4SLinus Torvalds	;;
2680aa366f3STony Luck	ld4 r10 = [r20]		// gtod_lock.sequence
2691da177e4SLinus Torvalds	add r8 = r8,r2		// Add xtime.nsecs
270d4d1fc61STony Luck	;;
271d4d1fc61STony Luck	shr.u r8 = r8,r23	// shift by factor
2720aa366f3STony Luck	cmp4.ne p7,p0 = r28,r10
2730aa366f3STony Luck(p7)	br.cond.dpnt.few .time_redo	// sequence number changed, redo
2740aa366f3STony Luck	// End critical section.
2751da177e4SLinus Torvalds	// Now r8=tv->tv_nsec and r9=tv->tv_sec
2761da177e4SLinus Torvalds	mov r10 = r0
2771da177e4SLinus Torvalds	movl r2 = 1000000000
2781da177e4SLinus Torvalds	add r23 = IA64_TIMESPEC_TV_NSEC_OFFSET, r31
2791da177e4SLinus Torvalds(p14)	movl r3 = 2361183241434822607	// Prep for / 1000 hack
2801da177e4SLinus Torvalds	;;
2811da177e4SLinus Torvalds.time_normalize:
2821da177e4SLinus Torvalds	mov r21 = r8
2831da177e4SLinus Torvalds	cmp.ge p6,p0 = r8,r2
2840aa366f3STony Luck(p14)	shr.u r20 = r8, 3 // We can repeat this if necessary just wasting time
2851da177e4SLinus Torvalds	;;
2861da177e4SLinus Torvalds(p14)	setf.sig f8 = r20
2871da177e4SLinus Torvalds(p6)	sub r8 = r8,r2
2881da177e4SLinus Torvalds(p6)	add r9 = 1,r9		// two nops before the branch.
2891da177e4SLinus Torvalds(p14)	setf.sig f7 = r3	// Chances for repeats are 1 in 10000 for gettod
2901da177e4SLinus Torvalds(p6)	br.cond.dpnt.few .time_normalize
2911da177e4SLinus Torvalds	;;
2921da177e4SLinus Torvalds	// Divided by 8 though shift. Now divide by 125
2931da177e4SLinus Torvalds	// The compiler was able to do that with a multiply
2941da177e4SLinus Torvalds	// and a shift and we do the same
2951da177e4SLinus TorvaldsEX(.fail_efault, probe.w.fault r23, 3)	// This also costs 5 cycles
2960aa366f3STony Luck(p14)	xmpy.hu f8 = f8, f7		// xmpy has 5 cycles latency so use it
2971da177e4SLinus Torvalds	;;
2981da177e4SLinus Torvalds(p14)	getf.sig r2 = f8
2991da177e4SLinus Torvalds	;;
3004fe01c68SHidetoshi Seto	mov r8 = r0
3011da177e4SLinus Torvalds(p14)	shr.u r21 = r2, 4
3021da177e4SLinus Torvalds	;;
3031da177e4SLinus TorvaldsEX(.fail_efault, st8 [r31] = r9)
3041da177e4SLinus TorvaldsEX(.fail_efault, st8 [r23] = r21)
3051da177e4SLinus Torvalds	FSYS_RETURN
3061da177e4SLinus Torvalds.fail_einval:
3071da177e4SLinus Torvalds	mov r8 = EINVAL
3081da177e4SLinus Torvalds	mov r10 = -1
3091da177e4SLinus Torvalds	FSYS_RETURN
3101da177e4SLinus Torvalds.fail_efault:
3111da177e4SLinus Torvalds	mov r8 = EFAULT
3121da177e4SLinus Torvalds	mov r10 = -1
3131da177e4SLinus Torvalds	FSYS_RETURN
3141da177e4SLinus TorvaldsEND(fsys_gettimeofday)
3151da177e4SLinus Torvalds
3161da177e4SLinus TorvaldsENTRY(fsys_clock_gettime)
3171da177e4SLinus Torvalds	.prologue
3181da177e4SLinus Torvalds	.altrp b6
3191da177e4SLinus Torvalds	.body
3201da177e4SLinus Torvalds	cmp4.ltu p6, p0 = CLOCK_MONOTONIC, r32
3211da177e4SLinus Torvalds	// Fallback if this is not CLOCK_REALTIME or CLOCK_MONOTONIC
3221da177e4SLinus Torvalds(p6)	br.spnt.few fsys_fallback_syscall
3231da177e4SLinus Torvalds	mov r31 = r33
3241da177e4SLinus Torvalds	shl r30 = r32,15
3251da177e4SLinus Torvalds	br.many .gettime
3261da177e4SLinus TorvaldsEND(fsys_clock_gettime)
3271da177e4SLinus Torvalds
3281da177e4SLinus Torvalds/*
3293bc207d2SFenghua Yu * fsys_getcpu doesn't use the third parameter in this implementation. It reads
3303bc207d2SFenghua Yu * current_thread_info()->cpu and corresponding node in cpu_to_node_map.
3313bc207d2SFenghua Yu */
3323bc207d2SFenghua YuENTRY(fsys_getcpu)
3333bc207d2SFenghua Yu	.prologue
3343bc207d2SFenghua Yu	.altrp b6
3353bc207d2SFenghua Yu	.body
3363bc207d2SFenghua Yu	;;
3373bc207d2SFenghua Yu	add r2=TI_FLAGS+IA64_TASK_SIZE,r16
3383bc207d2SFenghua Yu	tnat.nz p6,p0 = r32			// guard against NaT argument
3393bc207d2SFenghua Yu	add r3=TI_CPU+IA64_TASK_SIZE,r16
3403bc207d2SFenghua Yu	;;
3413bc207d2SFenghua Yu	ld4 r3=[r3]				// M r3 = thread_info->cpu
3423bc207d2SFenghua Yu	ld4 r2=[r2]				// M r2 = thread_info->flags
3433bc207d2SFenghua Yu(p6)    br.cond.spnt.few .fail_einval		// B
3443bc207d2SFenghua Yu	;;
3453bc207d2SFenghua Yu	tnat.nz p7,p0 = r33			// I guard against NaT argument
3463bc207d2SFenghua Yu(p7)    br.cond.spnt.few .fail_einval		// B
3477411d895STony Luck	;;
3487411d895STony Luck	cmp.ne p6,p0=r32,r0
3497411d895STony Luck	cmp.ne p7,p0=r33,r0
3507411d895STony Luck	;;
3513bc207d2SFenghua Yu#ifdef CONFIG_NUMA
3523bc207d2SFenghua Yu	movl r17=cpu_to_node_map
3533bc207d2SFenghua Yu	;;
3547411d895STony LuckEX(.fail_efault, (p6) probe.w.fault r32, 3)		// M This takes 5 cycles
3557411d895STony LuckEX(.fail_efault, (p7) probe.w.fault r33, 3)		// M This takes 5 cycles
3563bc207d2SFenghua Yu	shladd r18=r3,1,r17
3573bc207d2SFenghua Yu	;;
3583bc207d2SFenghua Yu	ld2 r20=[r18]				// r20 = cpu_to_node_map[cpu]
3593bc207d2SFenghua Yu	and r2 = TIF_ALLWORK_MASK,r2
3603bc207d2SFenghua Yu	;;
3613bc207d2SFenghua Yu	cmp.ne p8,p0=0,r2
3623bc207d2SFenghua Yu(p8)	br.spnt.many fsys_fallback_syscall
3633bc207d2SFenghua Yu	;;
3643bc207d2SFenghua Yu	;;
3657411d895STony LuckEX(.fail_efault, (p6) st4 [r32] = r3)
3667411d895STony LuckEX(.fail_efault, (p7) st2 [r33] = r20)
3673bc207d2SFenghua Yu	mov r8=0
3683bc207d2SFenghua Yu	;;
3693bc207d2SFenghua Yu#else
3707411d895STony LuckEX(.fail_efault, (p6) probe.w.fault r32, 3)		// M This takes 5 cycles
3717411d895STony LuckEX(.fail_efault, (p7) probe.w.fault r33, 3)		// M This takes 5 cycles
3723bc207d2SFenghua Yu	and r2 = TIF_ALLWORK_MASK,r2
3733bc207d2SFenghua Yu	;;
3743bc207d2SFenghua Yu	cmp.ne p8,p0=0,r2
3753bc207d2SFenghua Yu(p8)	br.spnt.many fsys_fallback_syscall
3763bc207d2SFenghua Yu	;;
3777411d895STony LuckEX(.fail_efault, (p6) st4 [r32] = r3)
3787411d895STony LuckEX(.fail_efault, (p7) st2 [r33] = r0)
3793bc207d2SFenghua Yu	mov r8=0
3803bc207d2SFenghua Yu	;;
3813bc207d2SFenghua Yu#endif
3823bc207d2SFenghua Yu	FSYS_RETURN
3833bc207d2SFenghua YuEND(fsys_getcpu)
3843bc207d2SFenghua Yu
3851da177e4SLinus TorvaldsENTRY(fsys_fallback_syscall)
3861da177e4SLinus Torvalds	.prologue
3871da177e4SLinus Torvalds	.altrp b6
3881da177e4SLinus Torvalds	.body
3891da177e4SLinus Torvalds	/*
3901da177e4SLinus Torvalds	 * We only get here from light-weight syscall handlers.  Thus, we already
3911da177e4SLinus Torvalds	 * know that r15 contains a valid syscall number.  No need to re-check.
3921da177e4SLinus Torvalds	 */
3931da177e4SLinus Torvalds	adds r17=-1024,r15
3941da177e4SLinus Torvalds	movl r14=sys_call_table
3951da177e4SLinus Torvalds	;;
39684b8857aSIsaku Yamahata	RSM_PSR_I(p0, r26, r27)
3971da177e4SLinus Torvalds	shladd r18=r17,3,r14
3981da177e4SLinus Torvalds	;;
3991da177e4SLinus Torvalds	ld8 r18=[r18]				// load normal (heavy-weight) syscall entry-point
40084b8857aSIsaku Yamahata	MOV_FROM_PSR(p0, r29, r26)		// read psr (12 cyc load latency)
4011da177e4SLinus Torvalds	mov r27=ar.rsc
4021da177e4SLinus Torvalds	mov r21=ar.fpsr
4031da177e4SLinus Torvalds	mov r26=ar.pfs
4041da177e4SLinus TorvaldsEND(fsys_fallback_syscall)
4051da177e4SLinus Torvalds	/* FALL THROUGH */
406e55645ecSLuis R. RodriguezGLOBAL_ENTRY(fsys_bubble_down)
4071da177e4SLinus Torvalds	.prologue
4081da177e4SLinus Torvalds	.altrp b6
4091da177e4SLinus Torvalds	.body
4101da177e4SLinus Torvalds	/*
411fbf7192bSDavid Mosberger-Tang	 * We get here for syscalls that don't have a lightweight
412fbf7192bSDavid Mosberger-Tang	 * handler.  For those, we need to bubble down into the kernel
413fbf7192bSDavid Mosberger-Tang	 * and that requires setting up a minimal pt_regs structure,
414fbf7192bSDavid Mosberger-Tang	 * and initializing the CPU state more or less as if an
415fbf7192bSDavid Mosberger-Tang	 * interruption had occurred.  To make syscall-restarts work,
416fbf7192bSDavid Mosberger-Tang	 * we setup pt_regs such that cr_iip points to the second
417fbf7192bSDavid Mosberger-Tang	 * instruction in syscall_via_break.  Decrementing the IP
418fbf7192bSDavid Mosberger-Tang	 * hence will restart the syscall via break and not
419fbf7192bSDavid Mosberger-Tang	 * decrementing IP will return us to the caller, as usual.
420fbf7192bSDavid Mosberger-Tang	 * Note that we preserve the value of psr.pp rather than
421fbf7192bSDavid Mosberger-Tang	 * initializing it from dcr.pp.  This makes it possible to
422fbf7192bSDavid Mosberger-Tang	 * distinguish fsyscall execution from other privileged
423fbf7192bSDavid Mosberger-Tang	 * execution.
4241da177e4SLinus Torvalds	 *
4251da177e4SLinus Torvalds	 * On entry:
426fbf7192bSDavid Mosberger-Tang	 *	- normal fsyscall handler register usage, except
427fbf7192bSDavid Mosberger-Tang	 *	  that we also have:
4281da177e4SLinus Torvalds	 *	- r18: address of syscall entry point
4291da177e4SLinus Torvalds	 *	- r21: ar.fpsr
4301da177e4SLinus Torvalds	 *	- r26: ar.pfs
4311da177e4SLinus Torvalds	 *	- r27: ar.rsc
4321da177e4SLinus Torvalds	 *	- r29: psr
433fbf7192bSDavid Mosberger-Tang	 *
434fbf7192bSDavid Mosberger-Tang	 * We used to clear some PSR bits here but that requires slow
4353eac094bSBhaskar Chowdhury	 * serialization.  Fortunately, that isn't really necessary.
436fbf7192bSDavid Mosberger-Tang	 * The rationale is as follows: we used to clear bits
437fbf7192bSDavid Mosberger-Tang	 * ~PSR_PRESERVED_BITS in PSR.L.  Since
438fbf7192bSDavid Mosberger-Tang	 * PSR_PRESERVED_BITS==PSR.{UP,MFL,MFH,PK,DT,PP,SP,RT,IC}, we
439fbf7192bSDavid Mosberger-Tang	 * ended up clearing PSR.{BE,AC,I,DFL,DFH,DI,DB,SI,TB}.
440fbf7192bSDavid Mosberger-Tang	 * However,
441fbf7192bSDavid Mosberger-Tang	 *
442fbf7192bSDavid Mosberger-Tang	 * PSR.BE : already is turned off in __kernel_syscall_via_epc()
443fbf7192bSDavid Mosberger-Tang	 * PSR.AC : don't care (kernel normally turns PSR.AC on)
444e55645ecSLuis R. Rodriguez	 * PSR.I  : already turned off by the time fsys_bubble_down gets
445fbf7192bSDavid Mosberger-Tang	 *	    invoked
446fbf7192bSDavid Mosberger-Tang	 * PSR.DFL: always 0 (kernel never turns it on)
447fbf7192bSDavid Mosberger-Tang	 * PSR.DFH: don't care --- kernel never touches f32-f127 on its own
448fbf7192bSDavid Mosberger-Tang	 *	    initiative
449fbf7192bSDavid Mosberger-Tang	 * PSR.DI : always 0 (kernel never turns it on)
450fbf7192bSDavid Mosberger-Tang	 * PSR.SI : always 0 (kernel never turns it on)
451fbf7192bSDavid Mosberger-Tang	 * PSR.DB : don't care --- kernel never enables kernel-level
452fbf7192bSDavid Mosberger-Tang	 *	    breakpoints
453fbf7192bSDavid Mosberger-Tang	 * PSR.TB : must be 0 already; if it wasn't zero on entry to
454e55645ecSLuis R. Rodriguez	 *          __kernel_syscall_via_epc, the branch to fsys_bubble_down
455fbf7192bSDavid Mosberger-Tang	 *          will trigger a taken branch; the taken-trap-handler then
456fbf7192bSDavid Mosberger-Tang	 *          converts the syscall into a break-based system-call.
4571da177e4SLinus Torvalds	 */
4581da177e4SLinus Torvalds	/*
459fbf7192bSDavid Mosberger-Tang	 * Reading psr.l gives us only bits 0-31, psr.it, and psr.mc.
460fbf7192bSDavid Mosberger-Tang	 * The rest we have to synthesize.
4611da177e4SLinus Torvalds	 */
462fbf7192bSDavid Mosberger-Tang#	define PSR_ONE_BITS		((3 << IA64_PSR_CPL0_BIT)	\
463fbf7192bSDavid Mosberger-Tang					 | (0x1 << IA64_PSR_RI_BIT)	\
4641da177e4SLinus Torvalds					 | IA64_PSR_BN | IA64_PSR_I)
4651da177e4SLinus Torvalds
466fbf7192bSDavid Mosberger-Tang	invala					// M0|1
467fbf7192bSDavid Mosberger-Tang	movl r14=ia64_ret_from_syscall		// X
4681da177e4SLinus Torvalds
4691ba7be7dSDavid Mosberger-Tang	nop.m 0
470fbf7192bSDavid Mosberger-Tang	movl r28=__kernel_syscall_via_break	// X	create cr.iip
4711da177e4SLinus Torvalds	;;
4721da177e4SLinus Torvalds
473fbf7192bSDavid Mosberger-Tang	mov r2=r16				// A    get task addr to addl-addressable register
474fbf7192bSDavid Mosberger-Tang	adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16 // A
475fbf7192bSDavid Mosberger-Tang	mov r31=pr				// I0   save pr (2 cyc)
4761da177e4SLinus Torvalds	;;
477fbf7192bSDavid Mosberger-Tang	st1 [r16]=r0				// M2|3 clear current->thread.on_ustack flag
478fbf7192bSDavid Mosberger-Tang	addl r22=IA64_RBS_OFFSET,r2		// A    compute base of RBS
479fbf7192bSDavid Mosberger-Tang	add r3=TI_FLAGS+IA64_TASK_SIZE,r2	// A
4801da177e4SLinus Torvalds	;;
481fbf7192bSDavid Mosberger-Tang	ld4 r3=[r3]				// M0|1 r3 = current_thread_info()->flags
482fbf7192bSDavid Mosberger-Tang	lfetch.fault.excl.nt1 [r22]		// M0|1 prefetch register backing-store
4831ba7be7dSDavid Mosberger-Tang	nop.i 0
4841ba7be7dSDavid Mosberger-Tang	;;
485fbf7192bSDavid Mosberger-Tang	mov ar.rsc=0				// M2   set enforced lazy mode, pl 0, LE, loadrs=0
486abf917cdSFrederic Weisbecker#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
48794752a79SIsaku Yamahata	MOV_FROM_ITC(p0, p6, r30, r23)		// M    get cycle for accounting
488b64f34cdSHidetoshi Seto#else
4891ba7be7dSDavid Mosberger-Tang	nop.m 0
490b64f34cdSHidetoshi Seto#endif
4911ba7be7dSDavid Mosberger-Tang	nop.i 0
4921ba7be7dSDavid Mosberger-Tang	;;
493fbf7192bSDavid Mosberger-Tang	mov r23=ar.bspstore			// M2 (12 cyc) save ar.bspstore
494fbf7192bSDavid Mosberger-Tang	mov.m r24=ar.rnat			// M2 (5 cyc) read ar.rnat (dual-issues!)
4951ba7be7dSDavid Mosberger-Tang	nop.i 0
4961ba7be7dSDavid Mosberger-Tang	;;
497fbf7192bSDavid Mosberger-Tang	mov ar.bspstore=r22			// M2 (6 cyc) switch to kernel RBS
4981ba7be7dSDavid Mosberger-Tang	movl r8=PSR_ONE_BITS			// X
4991ba7be7dSDavid Mosberger-Tang	;;
500fbf7192bSDavid Mosberger-Tang	mov r25=ar.unat				// M2 (5 cyc) save ar.unat
501fbf7192bSDavid Mosberger-Tang	mov r19=b6				// I0   save b6 (2 cyc)
502fbf7192bSDavid Mosberger-Tang	mov r20=r1				// A    save caller's gp in r20
5031ba7be7dSDavid Mosberger-Tang	;;
504fbf7192bSDavid Mosberger-Tang	or r29=r8,r29				// A    construct cr.ipsr value to save
505fbf7192bSDavid Mosberger-Tang	mov b6=r18				// I0   copy syscall entry-point to b6 (7 cyc)
506fbf7192bSDavid Mosberger-Tang	addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 // A compute base of memory stack
5071ba7be7dSDavid Mosberger-Tang
508fbf7192bSDavid Mosberger-Tang	mov r18=ar.bsp				// M2   save (kernel) ar.bsp (12 cyc)
509fbf7192bSDavid Mosberger-Tang	cmp.ne pKStk,pUStk=r0,r0		// A    set pKStk <- 0, pUStk <- 1
510fbf7192bSDavid Mosberger-Tang	br.call.sptk.many b7=ia64_syscall_setup	// B
5111da177e4SLinus Torvalds	;;
512abf917cdSFrederic Weisbecker#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
513b64f34cdSHidetoshi Seto	// mov.m r30=ar.itc is called in advance
514b64f34cdSHidetoshi Seto	add r16=TI_AC_STAMP+IA64_TASK_SIZE,r2
515b64f34cdSHidetoshi Seto	add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r2
516b64f34cdSHidetoshi Seto	;;
517b64f34cdSHidetoshi Seto	ld8 r18=[r16],TI_AC_STIME-TI_AC_STAMP	// time at last check in kernel
518b64f34cdSHidetoshi Seto	ld8 r19=[r17],TI_AC_UTIME-TI_AC_LEAVE	// time at leave kernel
519b64f34cdSHidetoshi Seto	;;
520b64f34cdSHidetoshi Seto	ld8 r20=[r16],TI_AC_STAMP-TI_AC_STIME	// cumulated stime
521b64f34cdSHidetoshi Seto	ld8 r21=[r17]				// cumulated utime
522b64f34cdSHidetoshi Seto	sub r22=r19,r18				// stime before leave kernel
523b64f34cdSHidetoshi Seto	;;
524b64f34cdSHidetoshi Seto	st8 [r16]=r30,TI_AC_STIME-TI_AC_STAMP	// update stamp
525b64f34cdSHidetoshi Seto	sub r18=r30,r19				// elapsed time in user mode
526b64f34cdSHidetoshi Seto	;;
527b64f34cdSHidetoshi Seto	add r20=r20,r22				// sum stime
528b64f34cdSHidetoshi Seto	add r21=r21,r18				// sum utime
529b64f34cdSHidetoshi Seto	;;
530b64f34cdSHidetoshi Seto	st8 [r16]=r20				// update stime
531b64f34cdSHidetoshi Seto	st8 [r17]=r21				// update utime
532b64f34cdSHidetoshi Seto	;;
533b64f34cdSHidetoshi Seto#endif
534fbf7192bSDavid Mosberger-Tang	mov ar.rsc=0x3				// M2   set eager mode, pl 0, LE, loadrs=0
535fbf7192bSDavid Mosberger-Tang	mov rp=r14				// I0   set the real return addr
536ebcc80c1SDavid Mosberger-Tang	and r3=_TIF_SYSCALL_TRACEAUDIT,r3	// A
5371ba7be7dSDavid Mosberger-Tang	;;
53884b8857aSIsaku Yamahata	SSM_PSR_I(p0, p6, r22)			// M2   we're on kernel stacks now, reenable irqs
539ebcc80c1SDavid Mosberger-Tang	cmp.eq p8,p0=r3,r0			// A
540fbf7192bSDavid Mosberger-Tang(p10)	br.cond.spnt.many ia64_ret_from_syscall	// B    return if bad call-frame or r15 is a NaT
5411ba7be7dSDavid Mosberger-Tang
5421ba7be7dSDavid Mosberger-Tang	nop.m 0
543fbf7192bSDavid Mosberger-Tang(p8)	br.call.sptk.many b6=b6			// B    (ignore return address)
544fbf7192bSDavid Mosberger-Tang	br.cond.spnt ia64_trace_syscall		// B
545e55645ecSLuis R. RodriguezEND(fsys_bubble_down)
5461da177e4SLinus Torvalds
5471da177e4SLinus Torvalds	.rodata
5481da177e4SLinus Torvalds	.align 8
549e55645ecSLuis R. Rodriguez	.globl fsyscall_table
5501da177e4SLinus Torvalds
551e55645ecSLuis R. Rodriguez	data8 fsys_bubble_down
552e55645ecSLuis R. Rodriguezfsyscall_table:
5531da177e4SLinus Torvalds	data8 fsys_ni_syscall
5541da177e4SLinus Torvalds	data8 0				// exit			// 1025
5551da177e4SLinus Torvalds	data8 0				// read
5561da177e4SLinus Torvalds	data8 0				// write
5571da177e4SLinus Torvalds	data8 0				// open
5581da177e4SLinus Torvalds	data8 0				// close
5591da177e4SLinus Torvalds	data8 0				// creat		// 1030
5601da177e4SLinus Torvalds	data8 0				// link
5611da177e4SLinus Torvalds	data8 0				// unlink
5621da177e4SLinus Torvalds	data8 0				// execve
5631da177e4SLinus Torvalds	data8 0				// chdir
5641da177e4SLinus Torvalds	data8 0				// fchdir		// 1035
5651da177e4SLinus Torvalds	data8 0				// utimes
5661da177e4SLinus Torvalds	data8 0				// mknod
5671da177e4SLinus Torvalds	data8 0				// chmod
5681da177e4SLinus Torvalds	data8 0				// chown
5691da177e4SLinus Torvalds	data8 0				// lseek		// 1040
5701da177e4SLinus Torvalds	data8 fsys_getpid		// getpid
571deb60015SEric W. Biederman	data8 0				// getppid
5721da177e4SLinus Torvalds	data8 0				// mount
5731da177e4SLinus Torvalds	data8 0				// umount
5741da177e4SLinus Torvalds	data8 0				// setuid		// 1045
5751da177e4SLinus Torvalds	data8 0				// getuid
5761da177e4SLinus Torvalds	data8 0				// geteuid
5771da177e4SLinus Torvalds	data8 0				// ptrace
5781da177e4SLinus Torvalds	data8 0				// access
5791da177e4SLinus Torvalds	data8 0				// sync			// 1050
5801da177e4SLinus Torvalds	data8 0				// fsync
5811da177e4SLinus Torvalds	data8 0				// fdatasync
5821da177e4SLinus Torvalds	data8 0				// kill
5831da177e4SLinus Torvalds	data8 0				// rename
5841da177e4SLinus Torvalds	data8 0				// mkdir		// 1055
5851da177e4SLinus Torvalds	data8 0				// rmdir
5861da177e4SLinus Torvalds	data8 0				// dup
5871da177e4SLinus Torvalds	data8 0				// pipe
5881da177e4SLinus Torvalds	data8 0				// times
5891da177e4SLinus Torvalds	data8 0				// brk			// 1060
5901da177e4SLinus Torvalds	data8 0				// setgid
5911da177e4SLinus Torvalds	data8 0				// getgid
5921da177e4SLinus Torvalds	data8 0				// getegid
5931da177e4SLinus Torvalds	data8 0				// acct
5941da177e4SLinus Torvalds	data8 0				// ioctl		// 1065
5951da177e4SLinus Torvalds	data8 0				// fcntl
5961da177e4SLinus Torvalds	data8 0				// umask
5971da177e4SLinus Torvalds	data8 0				// chroot
5981da177e4SLinus Torvalds	data8 0				// ustat
5991da177e4SLinus Torvalds	data8 0				// dup2			// 1070
6001da177e4SLinus Torvalds	data8 0				// setreuid
6011da177e4SLinus Torvalds	data8 0				// setregid
6021da177e4SLinus Torvalds	data8 0				// getresuid
6031da177e4SLinus Torvalds	data8 0				// setresuid
6041da177e4SLinus Torvalds	data8 0				// getresgid		// 1075
6051da177e4SLinus Torvalds	data8 0				// setresgid
6061da177e4SLinus Torvalds	data8 0				// getgroups
6071da177e4SLinus Torvalds	data8 0				// setgroups
6081da177e4SLinus Torvalds	data8 0				// getpgid
6091da177e4SLinus Torvalds	data8 0				// setpgid		// 1080
6101da177e4SLinus Torvalds	data8 0				// setsid
6111da177e4SLinus Torvalds	data8 0				// getsid
6121da177e4SLinus Torvalds	data8 0				// sethostname
6131da177e4SLinus Torvalds	data8 0				// setrlimit
6141da177e4SLinus Torvalds	data8 0				// getrlimit		// 1085
6151da177e4SLinus Torvalds	data8 0				// getrusage
6161da177e4SLinus Torvalds	data8 fsys_gettimeofday		// gettimeofday
6171da177e4SLinus Torvalds	data8 0				// settimeofday
6181da177e4SLinus Torvalds	data8 0				// select
6191da177e4SLinus Torvalds	data8 0				// poll			// 1090
6201da177e4SLinus Torvalds	data8 0				// symlink
6211da177e4SLinus Torvalds	data8 0				// readlink
6221da177e4SLinus Torvalds	data8 0				// uselib
6231da177e4SLinus Torvalds	data8 0				// swapon
6241da177e4SLinus Torvalds	data8 0				// swapoff		// 1095
6251da177e4SLinus Torvalds	data8 0				// reboot
6261da177e4SLinus Torvalds	data8 0				// truncate
6271da177e4SLinus Torvalds	data8 0				// ftruncate
6281da177e4SLinus Torvalds	data8 0				// fchmod
6291da177e4SLinus Torvalds	data8 0				// fchown		// 1100
6301da177e4SLinus Torvalds	data8 0				// getpriority
6311da177e4SLinus Torvalds	data8 0				// setpriority
6321da177e4SLinus Torvalds	data8 0				// statfs
6331da177e4SLinus Torvalds	data8 0				// fstatfs
6341da177e4SLinus Torvalds	data8 0				// gettid		// 1105
6351da177e4SLinus Torvalds	data8 0				// semget
6361da177e4SLinus Torvalds	data8 0				// semop
6371da177e4SLinus Torvalds	data8 0				// semctl
6381da177e4SLinus Torvalds	data8 0				// msgget
6391da177e4SLinus Torvalds	data8 0				// msgsnd		// 1110
6401da177e4SLinus Torvalds	data8 0				// msgrcv
6411da177e4SLinus Torvalds	data8 0				// msgctl
6421da177e4SLinus Torvalds	data8 0				// shmget
6431da177e4SLinus Torvalds	data8 0				// shmat
6441da177e4SLinus Torvalds	data8 0				// shmdt		// 1115
6451da177e4SLinus Torvalds	data8 0				// shmctl
6461da177e4SLinus Torvalds	data8 0				// syslog
6471da177e4SLinus Torvalds	data8 0				// setitimer
6481da177e4SLinus Torvalds	data8 0				// getitimer
6491da177e4SLinus Torvalds	data8 0					 		// 1120
6501da177e4SLinus Torvalds	data8 0
6511da177e4SLinus Torvalds	data8 0
6521da177e4SLinus Torvalds	data8 0				// vhangup
6531da177e4SLinus Torvalds	data8 0				// lchown
6541da177e4SLinus Torvalds	data8 0				// remap_file_pages	// 1125
6551da177e4SLinus Torvalds	data8 0				// wait4
6561da177e4SLinus Torvalds	data8 0				// sysinfo
6571da177e4SLinus Torvalds	data8 0				// clone
6581da177e4SLinus Torvalds	data8 0				// setdomainname
6591da177e4SLinus Torvalds	data8 0				// newuname		// 1130
6601da177e4SLinus Torvalds	data8 0				// adjtimex
6611da177e4SLinus Torvalds	data8 0
6621da177e4SLinus Torvalds	data8 0				// init_module
6631da177e4SLinus Torvalds	data8 0				// delete_module
6641da177e4SLinus Torvalds	data8 0							// 1135
6651da177e4SLinus Torvalds	data8 0
6661da177e4SLinus Torvalds	data8 0				// quotactl
6671da177e4SLinus Torvalds	data8 0				// bdflush
6681da177e4SLinus Torvalds	data8 0				// sysfs
6691da177e4SLinus Torvalds	data8 0				// personality		// 1140
6701da177e4SLinus Torvalds	data8 0				// afs_syscall
6711da177e4SLinus Torvalds	data8 0				// setfsuid
6721da177e4SLinus Torvalds	data8 0				// setfsgid
6731da177e4SLinus Torvalds	data8 0				// getdents
6741da177e4SLinus Torvalds	data8 0				// flock		// 1145
6751da177e4SLinus Torvalds	data8 0				// readv
6761da177e4SLinus Torvalds	data8 0				// writev
6771da177e4SLinus Torvalds	data8 0				// pread64
6781da177e4SLinus Torvalds	data8 0				// pwrite64
6791da177e4SLinus Torvalds	data8 0				// sysctl		// 1150
6801da177e4SLinus Torvalds	data8 0				// mmap
6811da177e4SLinus Torvalds	data8 0				// munmap
6821da177e4SLinus Torvalds	data8 0				// mlock
6831da177e4SLinus Torvalds	data8 0				// mlockall
6841da177e4SLinus Torvalds	data8 0				// mprotect		// 1155
6851da177e4SLinus Torvalds	data8 0				// mremap
6861da177e4SLinus Torvalds	data8 0				// msync
6871da177e4SLinus Torvalds	data8 0				// munlock
6881da177e4SLinus Torvalds	data8 0				// munlockall
6891da177e4SLinus Torvalds	data8 0				// sched_getparam	// 1160
6901da177e4SLinus Torvalds	data8 0				// sched_setparam
6911da177e4SLinus Torvalds	data8 0				// sched_getscheduler
6921da177e4SLinus Torvalds	data8 0				// sched_setscheduler
6931da177e4SLinus Torvalds	data8 0				// sched_yield
6941da177e4SLinus Torvalds	data8 0				// sched_get_priority_max	// 1165
6951da177e4SLinus Torvalds	data8 0				// sched_get_priority_min
6961da177e4SLinus Torvalds	data8 0				// sched_rr_get_interval
6971da177e4SLinus Torvalds	data8 0				// nanosleep
6981da177e4SLinus Torvalds	data8 0				// nfsservctl
6991da177e4SLinus Torvalds	data8 0				// prctl		// 1170
7001da177e4SLinus Torvalds	data8 0				// getpagesize
7011da177e4SLinus Torvalds	data8 0				// mmap2
7021da177e4SLinus Torvalds	data8 0				// pciconfig_read
7031da177e4SLinus Torvalds	data8 0				// pciconfig_write
7041da177e4SLinus Torvalds	data8 0				// perfmonctl		// 1175
7051da177e4SLinus Torvalds	data8 0				// sigaltstack
7061da177e4SLinus Torvalds	data8 0				// rt_sigaction
7071da177e4SLinus Torvalds	data8 0				// rt_sigpending
7084035c6dbSAndi Kleen	data8 0				// rt_sigprocmask
7091da177e4SLinus Torvalds	data8 0				// rt_sigqueueinfo	// 1180
7101da177e4SLinus Torvalds	data8 0				// rt_sigreturn
7111da177e4SLinus Torvalds	data8 0				// rt_sigsuspend
7121da177e4SLinus Torvalds	data8 0				// rt_sigtimedwait
7131da177e4SLinus Torvalds	data8 0				// getcwd
7141da177e4SLinus Torvalds	data8 0				// capget		// 1185
7151da177e4SLinus Torvalds	data8 0				// capset
7161da177e4SLinus Torvalds	data8 0				// sendfile
7171da177e4SLinus Torvalds	data8 0
7181da177e4SLinus Torvalds	data8 0
7191da177e4SLinus Torvalds	data8 0				// socket		// 1190
7201da177e4SLinus Torvalds	data8 0				// bind
7211da177e4SLinus Torvalds	data8 0				// connect
7221da177e4SLinus Torvalds	data8 0				// listen
7231da177e4SLinus Torvalds	data8 0				// accept
7241da177e4SLinus Torvalds	data8 0				// getsockname		// 1195
7251da177e4SLinus Torvalds	data8 0				// getpeername
7261da177e4SLinus Torvalds	data8 0				// socketpair
7271da177e4SLinus Torvalds	data8 0				// send
7281da177e4SLinus Torvalds	data8 0				// sendto
7291da177e4SLinus Torvalds	data8 0				// recv			// 1200
7301da177e4SLinus Torvalds	data8 0				// recvfrom
7311da177e4SLinus Torvalds	data8 0				// shutdown
7321da177e4SLinus Torvalds	data8 0				// setsockopt
7331da177e4SLinus Torvalds	data8 0				// getsockopt
7341da177e4SLinus Torvalds	data8 0				// sendmsg		// 1205
7351da177e4SLinus Torvalds	data8 0				// recvmsg
7361da177e4SLinus Torvalds	data8 0				// pivot_root
7371da177e4SLinus Torvalds	data8 0				// mincore
7381da177e4SLinus Torvalds	data8 0				// madvise
7391da177e4SLinus Torvalds	data8 0				// newstat		// 1210
7401da177e4SLinus Torvalds	data8 0				// newlstat
7411da177e4SLinus Torvalds	data8 0				// newfstat
7421da177e4SLinus Torvalds	data8 0				// clone2
7431da177e4SLinus Torvalds	data8 0				// getdents64
7441da177e4SLinus Torvalds	data8 0				// getunwind		// 1215
7451da177e4SLinus Torvalds	data8 0				// readahead
7461da177e4SLinus Torvalds	data8 0				// setxattr
7471da177e4SLinus Torvalds	data8 0				// lsetxattr
7481da177e4SLinus Torvalds	data8 0				// fsetxattr
7491da177e4SLinus Torvalds	data8 0				// getxattr		// 1220
7501da177e4SLinus Torvalds	data8 0				// lgetxattr
7511da177e4SLinus Torvalds	data8 0				// fgetxattr
7521da177e4SLinus Torvalds	data8 0				// listxattr
7531da177e4SLinus Torvalds	data8 0				// llistxattr
7541da177e4SLinus Torvalds	data8 0				// flistxattr		// 1225
7551da177e4SLinus Torvalds	data8 0				// removexattr
7561da177e4SLinus Torvalds	data8 0				// lremovexattr
7571da177e4SLinus Torvalds	data8 0				// fremovexattr
7581da177e4SLinus Torvalds	data8 0				// tkill
7591da177e4SLinus Torvalds	data8 0				// futex		// 1230
7601da177e4SLinus Torvalds	data8 0				// sched_setaffinity
7611da177e4SLinus Torvalds	data8 0				// sched_getaffinity
7621da177e4SLinus Torvalds	data8 fsys_set_tid_address	// set_tid_address
7631da177e4SLinus Torvalds	data8 0				// fadvise64_64
7641da177e4SLinus Torvalds	data8 0				// tgkill		// 1235
7651da177e4SLinus Torvalds	data8 0				// exit_group
7661da177e4SLinus Torvalds	data8 0				// lookup_dcookie
7671da177e4SLinus Torvalds	data8 0				// io_setup
7681da177e4SLinus Torvalds	data8 0				// io_destroy
7691da177e4SLinus Torvalds	data8 0				// io_getevents		// 1240
7701da177e4SLinus Torvalds	data8 0				// io_submit
7711da177e4SLinus Torvalds	data8 0				// io_cancel
7721da177e4SLinus Torvalds	data8 0				// epoll_create
7731da177e4SLinus Torvalds	data8 0				// epoll_ctl
7741da177e4SLinus Torvalds	data8 0				// epoll_wait		// 1245
7751da177e4SLinus Torvalds	data8 0				// restart_syscall
7761da177e4SLinus Torvalds	data8 0				// semtimedop
7771da177e4SLinus Torvalds	data8 0				// timer_create
7781da177e4SLinus Torvalds	data8 0				// timer_settime
7791da177e4SLinus Torvalds	data8 0				// timer_gettime 	// 1250
7801da177e4SLinus Torvalds	data8 0				// timer_getoverrun
7811da177e4SLinus Torvalds	data8 0				// timer_delete
7821da177e4SLinus Torvalds	data8 0				// clock_settime
7831da177e4SLinus Torvalds	data8 fsys_clock_gettime	// clock_gettime
7843bc207d2SFenghua Yu	data8 0				// clock_getres		// 1255
7853bc207d2SFenghua Yu	data8 0				// clock_nanosleep
7863bc207d2SFenghua Yu	data8 0				// fstatfs64
7873bc207d2SFenghua Yu	data8 0				// statfs64
7883bc207d2SFenghua Yu	data8 0				// mbind
7893bc207d2SFenghua Yu	data8 0				// get_mempolicy	// 1260
7903bc207d2SFenghua Yu	data8 0				// set_mempolicy
7913bc207d2SFenghua Yu	data8 0				// mq_open
7923bc207d2SFenghua Yu	data8 0				// mq_unlink
7933bc207d2SFenghua Yu	data8 0				// mq_timedsend
7943bc207d2SFenghua Yu	data8 0				// mq_timedreceive	// 1265
7953bc207d2SFenghua Yu	data8 0				// mq_notify
7963bc207d2SFenghua Yu	data8 0				// mq_getsetattr
7973bc207d2SFenghua Yu	data8 0				// kexec_load
7983bc207d2SFenghua Yu	data8 0				// vserver
7993bc207d2SFenghua Yu	data8 0				// waitid		// 1270
8003bc207d2SFenghua Yu	data8 0				// add_key
8013bc207d2SFenghua Yu	data8 0				// request_key
8023bc207d2SFenghua Yu	data8 0				// keyctl
8033bc207d2SFenghua Yu	data8 0				// ioprio_set
8043bc207d2SFenghua Yu	data8 0				// ioprio_get		// 1275
8053bc207d2SFenghua Yu	data8 0				// move_pages
8063bc207d2SFenghua Yu	data8 0				// inotify_init
8073bc207d2SFenghua Yu	data8 0				// inotify_add_watch
8083bc207d2SFenghua Yu	data8 0				// inotify_rm_watch
8093bc207d2SFenghua Yu	data8 0				// migrate_pages	// 1280
8103bc207d2SFenghua Yu	data8 0				// openat
8113bc207d2SFenghua Yu	data8 0				// mkdirat
8123bc207d2SFenghua Yu	data8 0				// mknodat
8133bc207d2SFenghua Yu	data8 0				// fchownat
8143bc207d2SFenghua Yu	data8 0				// futimesat		// 1285
8153bc207d2SFenghua Yu	data8 0				// newfstatat
8163bc207d2SFenghua Yu	data8 0				// unlinkat
8173bc207d2SFenghua Yu	data8 0				// renameat
8183bc207d2SFenghua Yu	data8 0				// linkat
8193bc207d2SFenghua Yu	data8 0				// symlinkat		// 1290
8203bc207d2SFenghua Yu	data8 0				// readlinkat
8213bc207d2SFenghua Yu	data8 0				// fchmodat
8223bc207d2SFenghua Yu	data8 0				// faccessat
8233bc207d2SFenghua Yu	data8 0
8243bc207d2SFenghua Yu	data8 0							// 1295
8253bc207d2SFenghua Yu	data8 0				// unshare
8263bc207d2SFenghua Yu	data8 0				// splice
8273bc207d2SFenghua Yu	data8 0				// set_robust_list
8283bc207d2SFenghua Yu	data8 0				// get_robust_list
8293bc207d2SFenghua Yu	data8 0				// sync_file_range	// 1300
8303bc207d2SFenghua Yu	data8 0				// tee
8313bc207d2SFenghua Yu	data8 0				// vmsplice
8323bc207d2SFenghua Yu	data8 0
8333bc207d2SFenghua Yu	data8 fsys_getcpu		// getcpu		// 1304
8349ed2ad86SChen, Kenneth W
835c8c1635fSKen Chen	// fill in zeros for the remaining entries
836c8c1635fSKen Chen	.zero:
837e55645ecSLuis R. Rodriguez	.space fsyscall_table + 8*NR_syscalls - .zero, 0
838