162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * This file contains the light-weight system call handlers (fsyscall-handlers).
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2003 Hewlett-Packard Co
662306a36Sopenharmony_ci * 	David Mosberger-Tang <davidm@hpl.hp.com>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * 25-Sep-03 davidm	Implement fsys_rt_sigprocmask().
962306a36Sopenharmony_ci * 18-Feb-03 louisk	Implement fsys_gettimeofday().
1062306a36Sopenharmony_ci * 28-Feb-03 davidm	Fixed several bugs in fsys_gettimeofday().  Tuned it some more,
1162306a36Sopenharmony_ci *			probably broke it along the way... ;-)
1262306a36Sopenharmony_ci * 13-Jul-04 clameter   Implement fsys_clock_gettime and revise fsys_gettimeofday to make
1362306a36Sopenharmony_ci *                      it capable of using memory based clocks without falling back to C code.
1462306a36Sopenharmony_ci * 08-Feb-07 Fenghua Yu Implement fsys_getcpu.
1562306a36Sopenharmony_ci *
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <asm/asmmacro.h>
1962306a36Sopenharmony_ci#include <asm/errno.h>
2062306a36Sopenharmony_ci#include <asm/asm-offsets.h>
2162306a36Sopenharmony_ci#include <asm/percpu.h>
2262306a36Sopenharmony_ci#include <asm/thread_info.h>
2362306a36Sopenharmony_ci#include <asm/sal.h>
2462306a36Sopenharmony_ci#include <asm/signal.h>
2562306a36Sopenharmony_ci#include <asm/unistd.h>
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#include "entry.h"
2862306a36Sopenharmony_ci#include <asm/native/inst.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/*
3162306a36Sopenharmony_ci * See Documentation/arch/ia64/fsys.rst for details on fsyscalls.
3262306a36Sopenharmony_ci *
3362306a36Sopenharmony_ci * On entry to an fsyscall handler:
3462306a36Sopenharmony_ci *   r10	= 0 (i.e., defaults to "successful syscall return")
3562306a36Sopenharmony_ci *   r11	= saved ar.pfs (a user-level value)
3662306a36Sopenharmony_ci *   r15	= system call number
3762306a36Sopenharmony_ci *   r16	= "current" task pointer (in normal kernel-mode, this is in r13)
3862306a36Sopenharmony_ci *   r32-r39	= system call arguments
3962306a36Sopenharmony_ci *   b6		= return address (a user-level value)
4062306a36Sopenharmony_ci *   ar.pfs	= previous frame-state (a user-level value)
4162306a36Sopenharmony_ci *   PSR.be	= cleared to zero (i.e., little-endian byte order is in effect)
4262306a36Sopenharmony_ci *   all other registers may contain values passed in from user-mode
4362306a36Sopenharmony_ci *
4462306a36Sopenharmony_ci * On return from an fsyscall handler:
4562306a36Sopenharmony_ci *   r11	= saved ar.pfs (as passed into the fsyscall handler)
4662306a36Sopenharmony_ci *   r15	= system call number (as passed into the fsyscall handler)
4762306a36Sopenharmony_ci *   r32-r39	= system call arguments (as passed into the fsyscall handler)
4862306a36Sopenharmony_ci *   b6		= return address (as passed into the fsyscall handler)
4962306a36Sopenharmony_ci *   ar.pfs	= previous frame-state (as passed into the fsyscall handler)
5062306a36Sopenharmony_ci */
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciENTRY(fsys_ni_syscall)
5362306a36Sopenharmony_ci	.prologue
5462306a36Sopenharmony_ci	.altrp b6
5562306a36Sopenharmony_ci	.body
5662306a36Sopenharmony_ci	mov r8=ENOSYS
5762306a36Sopenharmony_ci	mov r10=-1
5862306a36Sopenharmony_ci	FSYS_RETURN
5962306a36Sopenharmony_ciEND(fsys_ni_syscall)
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ciENTRY(fsys_getpid)
6262306a36Sopenharmony_ci	.prologue
6362306a36Sopenharmony_ci	.altrp b6
6462306a36Sopenharmony_ci	.body
6562306a36Sopenharmony_ci	add r17=IA64_TASK_SIGNAL_OFFSET,r16
6662306a36Sopenharmony_ci	;;
6762306a36Sopenharmony_ci	ld8 r17=[r17]				// r17 = current->signal
6862306a36Sopenharmony_ci	add r9=TI_FLAGS+IA64_TASK_SIZE,r16
6962306a36Sopenharmony_ci	;;
7062306a36Sopenharmony_ci	ld4 r9=[r9]
7162306a36Sopenharmony_ci	add r17=IA64_SIGNAL_PIDS_TGID_OFFSET,r17
7262306a36Sopenharmony_ci	;;
7362306a36Sopenharmony_ci	and r9=TIF_ALLWORK_MASK,r9
7462306a36Sopenharmony_ci	ld8 r17=[r17]				// r17 = current->signal->pids[PIDTYPE_TGID]
7562306a36Sopenharmony_ci	;;
7662306a36Sopenharmony_ci	add r8=IA64_PID_LEVEL_OFFSET,r17
7762306a36Sopenharmony_ci	;;
7862306a36Sopenharmony_ci	ld4 r8=[r8]				// r8 = pid->level
7962306a36Sopenharmony_ci	add r17=IA64_PID_UPID_OFFSET,r17	// r17 = &pid->numbers[0]
8062306a36Sopenharmony_ci	;;
8162306a36Sopenharmony_ci	shl r8=r8,IA64_UPID_SHIFT
8262306a36Sopenharmony_ci	;;
8362306a36Sopenharmony_ci	add r17=r17,r8				// r17 = &pid->numbers[pid->level]
8462306a36Sopenharmony_ci	;;
8562306a36Sopenharmony_ci	ld4 r8=[r17]				// r8 = pid->numbers[pid->level].nr
8662306a36Sopenharmony_ci	;;
8762306a36Sopenharmony_ci	mov r17=0
8862306a36Sopenharmony_ci	;;
8962306a36Sopenharmony_ci	cmp.ne p8,p0=0,r9
9062306a36Sopenharmony_ci(p8)	br.spnt.many fsys_fallback_syscall
9162306a36Sopenharmony_ci	FSYS_RETURN
9262306a36Sopenharmony_ciEND(fsys_getpid)
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ciENTRY(fsys_set_tid_address)
9562306a36Sopenharmony_ci	.prologue
9662306a36Sopenharmony_ci	.altrp b6
9762306a36Sopenharmony_ci	.body
9862306a36Sopenharmony_ci	add r9=TI_FLAGS+IA64_TASK_SIZE,r16
9962306a36Sopenharmony_ci	add r17=IA64_TASK_THREAD_PID_OFFSET,r16
10062306a36Sopenharmony_ci	;;
10162306a36Sopenharmony_ci	ld4 r9=[r9]
10262306a36Sopenharmony_ci	tnat.z p6,p7=r32		// check argument register for being NaT
10362306a36Sopenharmony_ci	ld8 r17=[r17]				// r17 = current->thread_pid
10462306a36Sopenharmony_ci	;;
10562306a36Sopenharmony_ci	and r9=TIF_ALLWORK_MASK,r9
10662306a36Sopenharmony_ci	add r8=IA64_PID_LEVEL_OFFSET,r17
10762306a36Sopenharmony_ci	add r18=IA64_TASK_CLEAR_CHILD_TID_OFFSET,r16
10862306a36Sopenharmony_ci	;;
10962306a36Sopenharmony_ci	ld4 r8=[r8]				// r8 = pid->level
11062306a36Sopenharmony_ci	add r17=IA64_PID_UPID_OFFSET,r17	// r17 = &pid->numbers[0]
11162306a36Sopenharmony_ci	;;
11262306a36Sopenharmony_ci	shl r8=r8,IA64_UPID_SHIFT
11362306a36Sopenharmony_ci	;;
11462306a36Sopenharmony_ci	add r17=r17,r8				// r17 = &pid->numbers[pid->level]
11562306a36Sopenharmony_ci	;;
11662306a36Sopenharmony_ci	ld4 r8=[r17]				// r8 = pid->numbers[pid->level].nr
11762306a36Sopenharmony_ci	;;
11862306a36Sopenharmony_ci	cmp.ne p8,p0=0,r9
11962306a36Sopenharmony_ci	mov r17=-1
12062306a36Sopenharmony_ci	;;
12162306a36Sopenharmony_ci(p6)	st8 [r18]=r32
12262306a36Sopenharmony_ci(p7)	st8 [r18]=r17
12362306a36Sopenharmony_ci(p8)	br.spnt.many fsys_fallback_syscall
12462306a36Sopenharmony_ci	;;
12562306a36Sopenharmony_ci	mov r17=0			// i must not leak kernel bits...
12662306a36Sopenharmony_ci	mov r18=0			// i must not leak kernel bits...
12762306a36Sopenharmony_ci	FSYS_RETURN
12862306a36Sopenharmony_ciEND(fsys_set_tid_address)
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci#if IA64_GTOD_SEQ_OFFSET !=0
13162306a36Sopenharmony_ci#error fsys_gettimeofday incompatible with changes to struct fsyscall_gtod_data_t
13262306a36Sopenharmony_ci#endif
13362306a36Sopenharmony_ci#if IA64_ITC_JITTER_OFFSET !=0
13462306a36Sopenharmony_ci#error fsys_gettimeofday incompatible with changes to struct itc_jitter_data_t
13562306a36Sopenharmony_ci#endif
13662306a36Sopenharmony_ci#define CLOCK_REALTIME 0
13762306a36Sopenharmony_ci#define CLOCK_MONOTONIC 1
13862306a36Sopenharmony_ci#define CLOCK_DIVIDE_BY_1000 0x4000
13962306a36Sopenharmony_ci#define CLOCK_ADD_MONOTONIC 0x8000
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciENTRY(fsys_gettimeofday)
14262306a36Sopenharmony_ci	.prologue
14362306a36Sopenharmony_ci	.altrp b6
14462306a36Sopenharmony_ci	.body
14562306a36Sopenharmony_ci	mov r31 = r32
14662306a36Sopenharmony_ci	tnat.nz p6,p0 = r33		// guard against NaT argument
14762306a36Sopenharmony_ci(p6)    br.cond.spnt.few .fail_einval
14862306a36Sopenharmony_ci	mov r30 = CLOCK_DIVIDE_BY_1000
14962306a36Sopenharmony_ci	;;
15062306a36Sopenharmony_ci.gettime:
15162306a36Sopenharmony_ci	// Register map
15262306a36Sopenharmony_ci	// Incoming r31 = pointer to address where to place result
15362306a36Sopenharmony_ci	//          r30 = flags determining how time is processed
15462306a36Sopenharmony_ci	// r2,r3 = temp r4-r7 preserved
15562306a36Sopenharmony_ci	// r8 = result nanoseconds
15662306a36Sopenharmony_ci	// r9 = result seconds
15762306a36Sopenharmony_ci	// r10 = temporary storage for clock difference
15862306a36Sopenharmony_ci	// r11 = preserved: saved ar.pfs
15962306a36Sopenharmony_ci	// r12 = preserved: memory stack
16062306a36Sopenharmony_ci	// r13 = preserved: thread pointer
16162306a36Sopenharmony_ci	// r14 = address of mask / mask value
16262306a36Sopenharmony_ci	// r15 = preserved: system call number
16362306a36Sopenharmony_ci	// r16 = preserved: current task pointer
16462306a36Sopenharmony_ci	// r17 = (not used)
16562306a36Sopenharmony_ci	// r18 = (not used)
16662306a36Sopenharmony_ci	// r19 = address of itc_lastcycle
16762306a36Sopenharmony_ci	// r20 = struct fsyscall_gtod_data (= address of gtod_lock.sequence)
16862306a36Sopenharmony_ci	// r21 = address of mmio_ptr
16962306a36Sopenharmony_ci	// r22 = address of wall_time or monotonic_time
17062306a36Sopenharmony_ci	// r23 = address of shift / value
17162306a36Sopenharmony_ci	// r24 = address mult factor / cycle_last value
17262306a36Sopenharmony_ci	// r25 = itc_lastcycle value
17362306a36Sopenharmony_ci	// r26 = address clocksource cycle_last
17462306a36Sopenharmony_ci	// r27 = (not used)
17562306a36Sopenharmony_ci	// r28 = sequence number at the beginning of critical section
17662306a36Sopenharmony_ci	// r29 = address of itc_jitter
17762306a36Sopenharmony_ci	// r30 = time processing flags / memory address
17862306a36Sopenharmony_ci	// r31 = pointer to result
17962306a36Sopenharmony_ci	// Predicates
18062306a36Sopenharmony_ci	// p6,p7 short term use
18162306a36Sopenharmony_ci	// p8 = timesource ar.itc
18262306a36Sopenharmony_ci	// p9 = timesource mmio64
18362306a36Sopenharmony_ci	// p10 = timesource mmio32 - not used
18462306a36Sopenharmony_ci	// p11 = timesource not to be handled by asm code
18562306a36Sopenharmony_ci	// p12 = memory time source ( = p9 | p10) - not used
18662306a36Sopenharmony_ci	// p13 = do cmpxchg with itc_lastcycle
18762306a36Sopenharmony_ci	// p14 = Divide by 1000
18862306a36Sopenharmony_ci	// p15 = Add monotonic
18962306a36Sopenharmony_ci	//
19062306a36Sopenharmony_ci	// Note that instructions are optimized for McKinley. McKinley can
19162306a36Sopenharmony_ci	// process two bundles simultaneously and therefore we continuously
19262306a36Sopenharmony_ci	// try to feed the CPU two bundles and then a stop.
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	add r2 = TI_FLAGS+IA64_TASK_SIZE,r16
19562306a36Sopenharmony_ci	tnat.nz p6,p0 = r31		// guard against Nat argument
19662306a36Sopenharmony_ci(p6)	br.cond.spnt.few .fail_einval
19762306a36Sopenharmony_ci	movl r20 = fsyscall_gtod_data // load fsyscall gettimeofday data address
19862306a36Sopenharmony_ci	;;
19962306a36Sopenharmony_ci	ld4 r2 = [r2]			// process work pending flags
20062306a36Sopenharmony_ci	movl r29 = itc_jitter_data	// itc_jitter
20162306a36Sopenharmony_ci	add r22 = IA64_GTOD_WALL_TIME_OFFSET,r20	// wall_time
20262306a36Sopenharmony_ci	add r21 = IA64_CLKSRC_MMIO_OFFSET,r20
20362306a36Sopenharmony_ci	mov pr = r30,0xc000	// Set predicates according to function
20462306a36Sopenharmony_ci	;;
20562306a36Sopenharmony_ci	and r2 = TIF_ALLWORK_MASK,r2
20662306a36Sopenharmony_ci	add r19 = IA64_ITC_LASTCYCLE_OFFSET,r29
20762306a36Sopenharmony_ci(p15)	add r22 = IA64_GTOD_MONO_TIME_OFFSET,r20	// monotonic_time
20862306a36Sopenharmony_ci	;;
20962306a36Sopenharmony_ci	add r26 = IA64_CLKSRC_CYCLE_LAST_OFFSET,r20	// clksrc_cycle_last
21062306a36Sopenharmony_ci	cmp.ne p6, p0 = 0, r2	// Fallback if work is scheduled
21162306a36Sopenharmony_ci(p6)	br.cond.spnt.many fsys_fallback_syscall
21262306a36Sopenharmony_ci	;;
21362306a36Sopenharmony_ci	// Begin critical section
21462306a36Sopenharmony_ci.time_redo:
21562306a36Sopenharmony_ci	ld4.acq r28 = [r20]	// gtod_lock.sequence, Must take first
21662306a36Sopenharmony_ci	;;
21762306a36Sopenharmony_ci	and r28 = ~1,r28	// And make sequence even to force retry if odd
21862306a36Sopenharmony_ci	;;
21962306a36Sopenharmony_ci	ld8 r30 = [r21]		// clocksource->mmio_ptr
22062306a36Sopenharmony_ci	add r24 = IA64_CLKSRC_MULT_OFFSET,r20
22162306a36Sopenharmony_ci	ld4 r2 = [r29]		// itc_jitter value
22262306a36Sopenharmony_ci	add r23 = IA64_CLKSRC_SHIFT_OFFSET,r20
22362306a36Sopenharmony_ci	add r14 = IA64_CLKSRC_MASK_OFFSET,r20
22462306a36Sopenharmony_ci	;;
22562306a36Sopenharmony_ci	ld4 r3 = [r24]		// clocksource mult value
22662306a36Sopenharmony_ci	ld8 r14 = [r14]         // clocksource mask value
22762306a36Sopenharmony_ci	cmp.eq p8,p9 = 0,r30	// use cpu timer if no mmio_ptr
22862306a36Sopenharmony_ci	;;
22962306a36Sopenharmony_ci	setf.sig f7 = r3	// Setup for mult scaling of counter
23062306a36Sopenharmony_ci(p8)	cmp.ne p13,p0 = r2,r0	// need itc_jitter compensation, set p13
23162306a36Sopenharmony_ci	ld4 r23 = [r23]		// clocksource shift value
23262306a36Sopenharmony_ci	ld8 r24 = [r26]		// get clksrc_cycle_last value
23362306a36Sopenharmony_ci(p9)	cmp.eq p13,p0 = 0,r30	// if mmio_ptr, clear p13 jitter control
23462306a36Sopenharmony_ci	;;
23562306a36Sopenharmony_ci	.pred.rel.mutex p8,p9
23662306a36Sopenharmony_ci	MOV_FROM_ITC(p8, p6, r2, r10)	// CPU_TIMER. 36 clocks latency!!!
23762306a36Sopenharmony_ci(p9)	ld8 r2 = [r30]		// MMIO_TIMER. Could also have latency issues..
23862306a36Sopenharmony_ci(p13)	ld8 r25 = [r19]		// get itc_lastcycle value
23962306a36Sopenharmony_ci	ld8 r9 = [r22],IA64_TIME_SN_SPEC_SNSEC_OFFSET	// sec
24062306a36Sopenharmony_ci	;;
24162306a36Sopenharmony_ci	ld8 r8 = [r22],-IA64_TIME_SN_SPEC_SNSEC_OFFSET	// snsec
24262306a36Sopenharmony_ci(p13)	sub r3 = r25,r2		// Diff needed before comparison (thanks davidm)
24362306a36Sopenharmony_ci	;;
24462306a36Sopenharmony_ci(p13)	cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared
24562306a36Sopenharmony_ci	sub r10 = r2,r24	// current_cycle - last_cycle
24662306a36Sopenharmony_ci	;;
24762306a36Sopenharmony_ci(p6)	sub r10 = r25,r24	// time we got was less than last_cycle
24862306a36Sopenharmony_ci(p7)	mov ar.ccv = r25	// more than last_cycle. Prep for cmpxchg
24962306a36Sopenharmony_ci	;;
25062306a36Sopenharmony_ci(p7)	cmpxchg8.rel r3 = [r19],r2,ar.ccv
25162306a36Sopenharmony_ci	;;
25262306a36Sopenharmony_ci(p7)	cmp.ne p7,p0 = r25,r3	// if cmpxchg not successful
25362306a36Sopenharmony_ci	;;
25462306a36Sopenharmony_ci(p7)	sub r10 = r3,r24	// then use new last_cycle instead
25562306a36Sopenharmony_ci	;;
25662306a36Sopenharmony_ci	and r10 = r10,r14	// Apply mask
25762306a36Sopenharmony_ci	;;
25862306a36Sopenharmony_ci	setf.sig f8 = r10
25962306a36Sopenharmony_ci	nop.i 123
26062306a36Sopenharmony_ci	;;
26162306a36Sopenharmony_ci	// fault check takes 5 cycles and we have spare time
26262306a36Sopenharmony_ciEX(.fail_efault, probe.w.fault r31, 3)
26362306a36Sopenharmony_ci	xmpy.l f8 = f8,f7	// nsec_per_cyc*(counter-last_counter)
26462306a36Sopenharmony_ci	;;
26562306a36Sopenharmony_ci	getf.sig r2 = f8
26662306a36Sopenharmony_ci	mf
26762306a36Sopenharmony_ci	;;
26862306a36Sopenharmony_ci	ld4 r10 = [r20]		// gtod_lock.sequence
26962306a36Sopenharmony_ci	add r8 = r8,r2		// Add xtime.nsecs
27062306a36Sopenharmony_ci	;;
27162306a36Sopenharmony_ci	shr.u r8 = r8,r23	// shift by factor
27262306a36Sopenharmony_ci	cmp4.ne p7,p0 = r28,r10
27362306a36Sopenharmony_ci(p7)	br.cond.dpnt.few .time_redo	// sequence number changed, redo
27462306a36Sopenharmony_ci	// End critical section.
27562306a36Sopenharmony_ci	// Now r8=tv->tv_nsec and r9=tv->tv_sec
27662306a36Sopenharmony_ci	mov r10 = r0
27762306a36Sopenharmony_ci	movl r2 = 1000000000
27862306a36Sopenharmony_ci	add r23 = IA64_TIMESPEC_TV_NSEC_OFFSET, r31
27962306a36Sopenharmony_ci(p14)	movl r3 = 2361183241434822607	// Prep for / 1000 hack
28062306a36Sopenharmony_ci	;;
28162306a36Sopenharmony_ci.time_normalize:
28262306a36Sopenharmony_ci	mov r21 = r8
28362306a36Sopenharmony_ci	cmp.ge p6,p0 = r8,r2
28462306a36Sopenharmony_ci(p14)	shr.u r20 = r8, 3 // We can repeat this if necessary just wasting time
28562306a36Sopenharmony_ci	;;
28662306a36Sopenharmony_ci(p14)	setf.sig f8 = r20
28762306a36Sopenharmony_ci(p6)	sub r8 = r8,r2
28862306a36Sopenharmony_ci(p6)	add r9 = 1,r9		// two nops before the branch.
28962306a36Sopenharmony_ci(p14)	setf.sig f7 = r3	// Chances for repeats are 1 in 10000 for gettod
29062306a36Sopenharmony_ci(p6)	br.cond.dpnt.few .time_normalize
29162306a36Sopenharmony_ci	;;
29262306a36Sopenharmony_ci	// Divided by 8 though shift. Now divide by 125
29362306a36Sopenharmony_ci	// The compiler was able to do that with a multiply
29462306a36Sopenharmony_ci	// and a shift and we do the same
29562306a36Sopenharmony_ciEX(.fail_efault, probe.w.fault r23, 3)	// This also costs 5 cycles
29662306a36Sopenharmony_ci(p14)	xmpy.hu f8 = f8, f7		// xmpy has 5 cycles latency so use it
29762306a36Sopenharmony_ci	;;
29862306a36Sopenharmony_ci(p14)	getf.sig r2 = f8
29962306a36Sopenharmony_ci	;;
30062306a36Sopenharmony_ci	mov r8 = r0
30162306a36Sopenharmony_ci(p14)	shr.u r21 = r2, 4
30262306a36Sopenharmony_ci	;;
30362306a36Sopenharmony_ciEX(.fail_efault, st8 [r31] = r9)
30462306a36Sopenharmony_ciEX(.fail_efault, st8 [r23] = r21)
30562306a36Sopenharmony_ci	FSYS_RETURN
30662306a36Sopenharmony_ci.fail_einval:
30762306a36Sopenharmony_ci	mov r8 = EINVAL
30862306a36Sopenharmony_ci	mov r10 = -1
30962306a36Sopenharmony_ci	FSYS_RETURN
31062306a36Sopenharmony_ci.fail_efault:
31162306a36Sopenharmony_ci	mov r8 = EFAULT
31262306a36Sopenharmony_ci	mov r10 = -1
31362306a36Sopenharmony_ci	FSYS_RETURN
31462306a36Sopenharmony_ciEND(fsys_gettimeofday)
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ciENTRY(fsys_clock_gettime)
31762306a36Sopenharmony_ci	.prologue
31862306a36Sopenharmony_ci	.altrp b6
31962306a36Sopenharmony_ci	.body
32062306a36Sopenharmony_ci	cmp4.ltu p6, p0 = CLOCK_MONOTONIC, r32
32162306a36Sopenharmony_ci	// Fallback if this is not CLOCK_REALTIME or CLOCK_MONOTONIC
32262306a36Sopenharmony_ci(p6)	br.spnt.few fsys_fallback_syscall
32362306a36Sopenharmony_ci	mov r31 = r33
32462306a36Sopenharmony_ci	shl r30 = r32,15
32562306a36Sopenharmony_ci	br.many .gettime
32662306a36Sopenharmony_ciEND(fsys_clock_gettime)
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/*
32962306a36Sopenharmony_ci * fsys_getcpu doesn't use the third parameter in this implementation. It reads
33062306a36Sopenharmony_ci * current_thread_info()->cpu and corresponding node in cpu_to_node_map.
33162306a36Sopenharmony_ci */
33262306a36Sopenharmony_ciENTRY(fsys_getcpu)
33362306a36Sopenharmony_ci	.prologue
33462306a36Sopenharmony_ci	.altrp b6
33562306a36Sopenharmony_ci	.body
33662306a36Sopenharmony_ci	;;
33762306a36Sopenharmony_ci	add r2=TI_FLAGS+IA64_TASK_SIZE,r16
33862306a36Sopenharmony_ci	tnat.nz p6,p0 = r32			// guard against NaT argument
33962306a36Sopenharmony_ci	add r3=TI_CPU+IA64_TASK_SIZE,r16
34062306a36Sopenharmony_ci	;;
34162306a36Sopenharmony_ci	ld4 r3=[r3]				// M r3 = thread_info->cpu
34262306a36Sopenharmony_ci	ld4 r2=[r2]				// M r2 = thread_info->flags
34362306a36Sopenharmony_ci(p6)    br.cond.spnt.few .fail_einval		// B
34462306a36Sopenharmony_ci	;;
34562306a36Sopenharmony_ci	tnat.nz p7,p0 = r33			// I guard against NaT argument
34662306a36Sopenharmony_ci(p7)    br.cond.spnt.few .fail_einval		// B
34762306a36Sopenharmony_ci	;;
34862306a36Sopenharmony_ci	cmp.ne p6,p0=r32,r0
34962306a36Sopenharmony_ci	cmp.ne p7,p0=r33,r0
35062306a36Sopenharmony_ci	;;
35162306a36Sopenharmony_ci#ifdef CONFIG_NUMA
35262306a36Sopenharmony_ci	movl r17=cpu_to_node_map
35362306a36Sopenharmony_ci	;;
35462306a36Sopenharmony_ciEX(.fail_efault, (p6) probe.w.fault r32, 3)		// M This takes 5 cycles
35562306a36Sopenharmony_ciEX(.fail_efault, (p7) probe.w.fault r33, 3)		// M This takes 5 cycles
35662306a36Sopenharmony_ci	shladd r18=r3,1,r17
35762306a36Sopenharmony_ci	;;
35862306a36Sopenharmony_ci	ld2 r20=[r18]				// r20 = cpu_to_node_map[cpu]
35962306a36Sopenharmony_ci	and r2 = TIF_ALLWORK_MASK,r2
36062306a36Sopenharmony_ci	;;
36162306a36Sopenharmony_ci	cmp.ne p8,p0=0,r2
36262306a36Sopenharmony_ci(p8)	br.spnt.many fsys_fallback_syscall
36362306a36Sopenharmony_ci	;;
36462306a36Sopenharmony_ci	;;
36562306a36Sopenharmony_ciEX(.fail_efault, (p6) st4 [r32] = r3)
36662306a36Sopenharmony_ciEX(.fail_efault, (p7) st2 [r33] = r20)
36762306a36Sopenharmony_ci	mov r8=0
36862306a36Sopenharmony_ci	;;
36962306a36Sopenharmony_ci#else
37062306a36Sopenharmony_ciEX(.fail_efault, (p6) probe.w.fault r32, 3)		// M This takes 5 cycles
37162306a36Sopenharmony_ciEX(.fail_efault, (p7) probe.w.fault r33, 3)		// M This takes 5 cycles
37262306a36Sopenharmony_ci	and r2 = TIF_ALLWORK_MASK,r2
37362306a36Sopenharmony_ci	;;
37462306a36Sopenharmony_ci	cmp.ne p8,p0=0,r2
37562306a36Sopenharmony_ci(p8)	br.spnt.many fsys_fallback_syscall
37662306a36Sopenharmony_ci	;;
37762306a36Sopenharmony_ciEX(.fail_efault, (p6) st4 [r32] = r3)
37862306a36Sopenharmony_ciEX(.fail_efault, (p7) st2 [r33] = r0)
37962306a36Sopenharmony_ci	mov r8=0
38062306a36Sopenharmony_ci	;;
38162306a36Sopenharmony_ci#endif
38262306a36Sopenharmony_ci	FSYS_RETURN
38362306a36Sopenharmony_ciEND(fsys_getcpu)
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ciENTRY(fsys_fallback_syscall)
38662306a36Sopenharmony_ci	.prologue
38762306a36Sopenharmony_ci	.altrp b6
38862306a36Sopenharmony_ci	.body
38962306a36Sopenharmony_ci	/*
39062306a36Sopenharmony_ci	 * We only get here from light-weight syscall handlers.  Thus, we already
39162306a36Sopenharmony_ci	 * know that r15 contains a valid syscall number.  No need to re-check.
39262306a36Sopenharmony_ci	 */
39362306a36Sopenharmony_ci	adds r17=-1024,r15
39462306a36Sopenharmony_ci	movl r14=sys_call_table
39562306a36Sopenharmony_ci	;;
39662306a36Sopenharmony_ci	RSM_PSR_I(p0, r26, r27)
39762306a36Sopenharmony_ci	shladd r18=r17,3,r14
39862306a36Sopenharmony_ci	;;
39962306a36Sopenharmony_ci	ld8 r18=[r18]				// load normal (heavy-weight) syscall entry-point
40062306a36Sopenharmony_ci	MOV_FROM_PSR(p0, r29, r26)		// read psr (12 cyc load latency)
40162306a36Sopenharmony_ci	mov r27=ar.rsc
40262306a36Sopenharmony_ci	mov r21=ar.fpsr
40362306a36Sopenharmony_ci	mov r26=ar.pfs
40462306a36Sopenharmony_ciEND(fsys_fallback_syscall)
40562306a36Sopenharmony_ci	/* FALL THROUGH */
40662306a36Sopenharmony_ciGLOBAL_ENTRY(fsys_bubble_down)
40762306a36Sopenharmony_ci	.prologue
40862306a36Sopenharmony_ci	.altrp b6
40962306a36Sopenharmony_ci	.body
41062306a36Sopenharmony_ci	/*
41162306a36Sopenharmony_ci	 * We get here for syscalls that don't have a lightweight
41262306a36Sopenharmony_ci	 * handler.  For those, we need to bubble down into the kernel
41362306a36Sopenharmony_ci	 * and that requires setting up a minimal pt_regs structure,
41462306a36Sopenharmony_ci	 * and initializing the CPU state more or less as if an
41562306a36Sopenharmony_ci	 * interruption had occurred.  To make syscall-restarts work,
41662306a36Sopenharmony_ci	 * we setup pt_regs such that cr_iip points to the second
41762306a36Sopenharmony_ci	 * instruction in syscall_via_break.  Decrementing the IP
41862306a36Sopenharmony_ci	 * hence will restart the syscall via break and not
41962306a36Sopenharmony_ci	 * decrementing IP will return us to the caller, as usual.
42062306a36Sopenharmony_ci	 * Note that we preserve the value of psr.pp rather than
42162306a36Sopenharmony_ci	 * initializing it from dcr.pp.  This makes it possible to
42262306a36Sopenharmony_ci	 * distinguish fsyscall execution from other privileged
42362306a36Sopenharmony_ci	 * execution.
42462306a36Sopenharmony_ci	 *
42562306a36Sopenharmony_ci	 * On entry:
42662306a36Sopenharmony_ci	 *	- normal fsyscall handler register usage, except
42762306a36Sopenharmony_ci	 *	  that we also have:
42862306a36Sopenharmony_ci	 *	- r18: address of syscall entry point
42962306a36Sopenharmony_ci	 *	- r21: ar.fpsr
43062306a36Sopenharmony_ci	 *	- r26: ar.pfs
43162306a36Sopenharmony_ci	 *	- r27: ar.rsc
43262306a36Sopenharmony_ci	 *	- r29: psr
43362306a36Sopenharmony_ci	 *
43462306a36Sopenharmony_ci	 * We used to clear some PSR bits here but that requires slow
43562306a36Sopenharmony_ci	 * serialization.  Fortunately, that isn't really necessary.
43662306a36Sopenharmony_ci	 * The rationale is as follows: we used to clear bits
43762306a36Sopenharmony_ci	 * ~PSR_PRESERVED_BITS in PSR.L.  Since
43862306a36Sopenharmony_ci	 * PSR_PRESERVED_BITS==PSR.{UP,MFL,MFH,PK,DT,PP,SP,RT,IC}, we
43962306a36Sopenharmony_ci	 * ended up clearing PSR.{BE,AC,I,DFL,DFH,DI,DB,SI,TB}.
44062306a36Sopenharmony_ci	 * However,
44162306a36Sopenharmony_ci	 *
44262306a36Sopenharmony_ci	 * PSR.BE : already is turned off in __kernel_syscall_via_epc()
44362306a36Sopenharmony_ci	 * PSR.AC : don't care (kernel normally turns PSR.AC on)
44462306a36Sopenharmony_ci	 * PSR.I  : already turned off by the time fsys_bubble_down gets
44562306a36Sopenharmony_ci	 *	    invoked
44662306a36Sopenharmony_ci	 * PSR.DFL: always 0 (kernel never turns it on)
44762306a36Sopenharmony_ci	 * PSR.DFH: don't care --- kernel never touches f32-f127 on its own
44862306a36Sopenharmony_ci	 *	    initiative
44962306a36Sopenharmony_ci	 * PSR.DI : always 0 (kernel never turns it on)
45062306a36Sopenharmony_ci	 * PSR.SI : always 0 (kernel never turns it on)
45162306a36Sopenharmony_ci	 * PSR.DB : don't care --- kernel never enables kernel-level
45262306a36Sopenharmony_ci	 *	    breakpoints
45362306a36Sopenharmony_ci	 * PSR.TB : must be 0 already; if it wasn't zero on entry to
45462306a36Sopenharmony_ci	 *          __kernel_syscall_via_epc, the branch to fsys_bubble_down
45562306a36Sopenharmony_ci	 *          will trigger a taken branch; the taken-trap-handler then
45662306a36Sopenharmony_ci	 *          converts the syscall into a break-based system-call.
45762306a36Sopenharmony_ci	 */
45862306a36Sopenharmony_ci	/*
45962306a36Sopenharmony_ci	 * Reading psr.l gives us only bits 0-31, psr.it, and psr.mc.
46062306a36Sopenharmony_ci	 * The rest we have to synthesize.
46162306a36Sopenharmony_ci	 */
46262306a36Sopenharmony_ci#	define PSR_ONE_BITS		((3 << IA64_PSR_CPL0_BIT)	\
46362306a36Sopenharmony_ci					 | (0x1 << IA64_PSR_RI_BIT)	\
46462306a36Sopenharmony_ci					 | IA64_PSR_BN | IA64_PSR_I)
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci	invala					// M0|1
46762306a36Sopenharmony_ci	movl r14=ia64_ret_from_syscall		// X
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	nop.m 0
47062306a36Sopenharmony_ci	movl r28=__kernel_syscall_via_break	// X	create cr.iip
47162306a36Sopenharmony_ci	;;
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci	mov r2=r16				// A    get task addr to addl-addressable register
47462306a36Sopenharmony_ci	adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16 // A
47562306a36Sopenharmony_ci	mov r31=pr				// I0   save pr (2 cyc)
47662306a36Sopenharmony_ci	;;
47762306a36Sopenharmony_ci	st1 [r16]=r0				// M2|3 clear current->thread.on_ustack flag
47862306a36Sopenharmony_ci	addl r22=IA64_RBS_OFFSET,r2		// A    compute base of RBS
47962306a36Sopenharmony_ci	add r3=TI_FLAGS+IA64_TASK_SIZE,r2	// A
48062306a36Sopenharmony_ci	;;
48162306a36Sopenharmony_ci	ld4 r3=[r3]				// M0|1 r3 = current_thread_info()->flags
48262306a36Sopenharmony_ci	lfetch.fault.excl.nt1 [r22]		// M0|1 prefetch register backing-store
48362306a36Sopenharmony_ci	nop.i 0
48462306a36Sopenharmony_ci	;;
48562306a36Sopenharmony_ci	mov ar.rsc=0				// M2   set enforced lazy mode, pl 0, LE, loadrs=0
48662306a36Sopenharmony_ci#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
48762306a36Sopenharmony_ci	MOV_FROM_ITC(p0, p6, r30, r23)		// M    get cycle for accounting
48862306a36Sopenharmony_ci#else
48962306a36Sopenharmony_ci	nop.m 0
49062306a36Sopenharmony_ci#endif
49162306a36Sopenharmony_ci	nop.i 0
49262306a36Sopenharmony_ci	;;
49362306a36Sopenharmony_ci	mov r23=ar.bspstore			// M2 (12 cyc) save ar.bspstore
49462306a36Sopenharmony_ci	mov.m r24=ar.rnat			// M2 (5 cyc) read ar.rnat (dual-issues!)
49562306a36Sopenharmony_ci	nop.i 0
49662306a36Sopenharmony_ci	;;
49762306a36Sopenharmony_ci	mov ar.bspstore=r22			// M2 (6 cyc) switch to kernel RBS
49862306a36Sopenharmony_ci	movl r8=PSR_ONE_BITS			// X
49962306a36Sopenharmony_ci	;;
50062306a36Sopenharmony_ci	mov r25=ar.unat				// M2 (5 cyc) save ar.unat
50162306a36Sopenharmony_ci	mov r19=b6				// I0   save b6 (2 cyc)
50262306a36Sopenharmony_ci	mov r20=r1				// A    save caller's gp in r20
50362306a36Sopenharmony_ci	;;
50462306a36Sopenharmony_ci	or r29=r8,r29				// A    construct cr.ipsr value to save
50562306a36Sopenharmony_ci	mov b6=r18				// I0   copy syscall entry-point to b6 (7 cyc)
50662306a36Sopenharmony_ci	addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 // A compute base of memory stack
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci	mov r18=ar.bsp				// M2   save (kernel) ar.bsp (12 cyc)
50962306a36Sopenharmony_ci	cmp.ne pKStk,pUStk=r0,r0		// A    set pKStk <- 0, pUStk <- 1
51062306a36Sopenharmony_ci	br.call.sptk.many b7=ia64_syscall_setup	// B
51162306a36Sopenharmony_ci	;;
51262306a36Sopenharmony_ci#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
51362306a36Sopenharmony_ci	// mov.m r30=ar.itc is called in advance
51462306a36Sopenharmony_ci	add r16=TI_AC_STAMP+IA64_TASK_SIZE,r2
51562306a36Sopenharmony_ci	add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r2
51662306a36Sopenharmony_ci	;;
51762306a36Sopenharmony_ci	ld8 r18=[r16],TI_AC_STIME-TI_AC_STAMP	// time at last check in kernel
51862306a36Sopenharmony_ci	ld8 r19=[r17],TI_AC_UTIME-TI_AC_LEAVE	// time at leave kernel
51962306a36Sopenharmony_ci	;;
52062306a36Sopenharmony_ci	ld8 r20=[r16],TI_AC_STAMP-TI_AC_STIME	// cumulated stime
52162306a36Sopenharmony_ci	ld8 r21=[r17]				// cumulated utime
52262306a36Sopenharmony_ci	sub r22=r19,r18				// stime before leave kernel
52362306a36Sopenharmony_ci	;;
52462306a36Sopenharmony_ci	st8 [r16]=r30,TI_AC_STIME-TI_AC_STAMP	// update stamp
52562306a36Sopenharmony_ci	sub r18=r30,r19				// elapsed time in user mode
52662306a36Sopenharmony_ci	;;
52762306a36Sopenharmony_ci	add r20=r20,r22				// sum stime
52862306a36Sopenharmony_ci	add r21=r21,r18				// sum utime
52962306a36Sopenharmony_ci	;;
53062306a36Sopenharmony_ci	st8 [r16]=r20				// update stime
53162306a36Sopenharmony_ci	st8 [r17]=r21				// update utime
53262306a36Sopenharmony_ci	;;
53362306a36Sopenharmony_ci#endif
53462306a36Sopenharmony_ci	mov ar.rsc=0x3				// M2   set eager mode, pl 0, LE, loadrs=0
53562306a36Sopenharmony_ci	mov rp=r14				// I0   set the real return addr
53662306a36Sopenharmony_ci	and r3=_TIF_SYSCALL_TRACEAUDIT,r3	// A
53762306a36Sopenharmony_ci	;;
53862306a36Sopenharmony_ci	SSM_PSR_I(p0, p6, r22)			// M2   we're on kernel stacks now, reenable irqs
53962306a36Sopenharmony_ci	cmp.eq p8,p0=r3,r0			// A
54062306a36Sopenharmony_ci(p10)	br.cond.spnt.many ia64_ret_from_syscall	// B    return if bad call-frame or r15 is a NaT
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_ci	nop.m 0
54362306a36Sopenharmony_ci(p8)	br.call.sptk.many b6=b6			// B    (ignore return address)
54462306a36Sopenharmony_ci	br.cond.spnt ia64_trace_syscall		// B
54562306a36Sopenharmony_ciEND(fsys_bubble_down)
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci	.rodata
54862306a36Sopenharmony_ci	.align 8
54962306a36Sopenharmony_ci	.globl fsyscall_table
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci	data8 fsys_bubble_down
55262306a36Sopenharmony_cifsyscall_table:
55362306a36Sopenharmony_ci	data8 fsys_ni_syscall
55462306a36Sopenharmony_ci	data8 0				// exit			// 1025
55562306a36Sopenharmony_ci	data8 0				// read
55662306a36Sopenharmony_ci	data8 0				// write
55762306a36Sopenharmony_ci	data8 0				// open
55862306a36Sopenharmony_ci	data8 0				// close
55962306a36Sopenharmony_ci	data8 0				// creat		// 1030
56062306a36Sopenharmony_ci	data8 0				// link
56162306a36Sopenharmony_ci	data8 0				// unlink
56262306a36Sopenharmony_ci	data8 0				// execve
56362306a36Sopenharmony_ci	data8 0				// chdir
56462306a36Sopenharmony_ci	data8 0				// fchdir		// 1035
56562306a36Sopenharmony_ci	data8 0				// utimes
56662306a36Sopenharmony_ci	data8 0				// mknod
56762306a36Sopenharmony_ci	data8 0				// chmod
56862306a36Sopenharmony_ci	data8 0				// chown
56962306a36Sopenharmony_ci	data8 0				// lseek		// 1040
57062306a36Sopenharmony_ci	data8 fsys_getpid		// getpid
57162306a36Sopenharmony_ci	data8 0				// getppid
57262306a36Sopenharmony_ci	data8 0				// mount
57362306a36Sopenharmony_ci	data8 0				// umount
57462306a36Sopenharmony_ci	data8 0				// setuid		// 1045
57562306a36Sopenharmony_ci	data8 0				// getuid
57662306a36Sopenharmony_ci	data8 0				// geteuid
57762306a36Sopenharmony_ci	data8 0				// ptrace
57862306a36Sopenharmony_ci	data8 0				// access
57962306a36Sopenharmony_ci	data8 0				// sync			// 1050
58062306a36Sopenharmony_ci	data8 0				// fsync
58162306a36Sopenharmony_ci	data8 0				// fdatasync
58262306a36Sopenharmony_ci	data8 0				// kill
58362306a36Sopenharmony_ci	data8 0				// rename
58462306a36Sopenharmony_ci	data8 0				// mkdir		// 1055
58562306a36Sopenharmony_ci	data8 0				// rmdir
58662306a36Sopenharmony_ci	data8 0				// dup
58762306a36Sopenharmony_ci	data8 0				// pipe
58862306a36Sopenharmony_ci	data8 0				// times
58962306a36Sopenharmony_ci	data8 0				// brk			// 1060
59062306a36Sopenharmony_ci	data8 0				// setgid
59162306a36Sopenharmony_ci	data8 0				// getgid
59262306a36Sopenharmony_ci	data8 0				// getegid
59362306a36Sopenharmony_ci	data8 0				// acct
59462306a36Sopenharmony_ci	data8 0				// ioctl		// 1065
59562306a36Sopenharmony_ci	data8 0				// fcntl
59662306a36Sopenharmony_ci	data8 0				// umask
59762306a36Sopenharmony_ci	data8 0				// chroot
59862306a36Sopenharmony_ci	data8 0				// ustat
59962306a36Sopenharmony_ci	data8 0				// dup2			// 1070
60062306a36Sopenharmony_ci	data8 0				// setreuid
60162306a36Sopenharmony_ci	data8 0				// setregid
60262306a36Sopenharmony_ci	data8 0				// getresuid
60362306a36Sopenharmony_ci	data8 0				// setresuid
60462306a36Sopenharmony_ci	data8 0				// getresgid		// 1075
60562306a36Sopenharmony_ci	data8 0				// setresgid
60662306a36Sopenharmony_ci	data8 0				// getgroups
60762306a36Sopenharmony_ci	data8 0				// setgroups
60862306a36Sopenharmony_ci	data8 0				// getpgid
60962306a36Sopenharmony_ci	data8 0				// setpgid		// 1080
61062306a36Sopenharmony_ci	data8 0				// setsid
61162306a36Sopenharmony_ci	data8 0				// getsid
61262306a36Sopenharmony_ci	data8 0				// sethostname
61362306a36Sopenharmony_ci	data8 0				// setrlimit
61462306a36Sopenharmony_ci	data8 0				// getrlimit		// 1085
61562306a36Sopenharmony_ci	data8 0				// getrusage
61662306a36Sopenharmony_ci	data8 fsys_gettimeofday		// gettimeofday
61762306a36Sopenharmony_ci	data8 0				// settimeofday
61862306a36Sopenharmony_ci	data8 0				// select
61962306a36Sopenharmony_ci	data8 0				// poll			// 1090
62062306a36Sopenharmony_ci	data8 0				// symlink
62162306a36Sopenharmony_ci	data8 0				// readlink
62262306a36Sopenharmony_ci	data8 0				// uselib
62362306a36Sopenharmony_ci	data8 0				// swapon
62462306a36Sopenharmony_ci	data8 0				// swapoff		// 1095
62562306a36Sopenharmony_ci	data8 0				// reboot
62662306a36Sopenharmony_ci	data8 0				// truncate
62762306a36Sopenharmony_ci	data8 0				// ftruncate
62862306a36Sopenharmony_ci	data8 0				// fchmod
62962306a36Sopenharmony_ci	data8 0				// fchown		// 1100
63062306a36Sopenharmony_ci	data8 0				// getpriority
63162306a36Sopenharmony_ci	data8 0				// setpriority
63262306a36Sopenharmony_ci	data8 0				// statfs
63362306a36Sopenharmony_ci	data8 0				// fstatfs
63462306a36Sopenharmony_ci	data8 0				// gettid		// 1105
63562306a36Sopenharmony_ci	data8 0				// semget
63662306a36Sopenharmony_ci	data8 0				// semop
63762306a36Sopenharmony_ci	data8 0				// semctl
63862306a36Sopenharmony_ci	data8 0				// msgget
63962306a36Sopenharmony_ci	data8 0				// msgsnd		// 1110
64062306a36Sopenharmony_ci	data8 0				// msgrcv
64162306a36Sopenharmony_ci	data8 0				// msgctl
64262306a36Sopenharmony_ci	data8 0				// shmget
64362306a36Sopenharmony_ci	data8 0				// shmat
64462306a36Sopenharmony_ci	data8 0				// shmdt		// 1115
64562306a36Sopenharmony_ci	data8 0				// shmctl
64662306a36Sopenharmony_ci	data8 0				// syslog
64762306a36Sopenharmony_ci	data8 0				// setitimer
64862306a36Sopenharmony_ci	data8 0				// getitimer
64962306a36Sopenharmony_ci	data8 0					 		// 1120
65062306a36Sopenharmony_ci	data8 0
65162306a36Sopenharmony_ci	data8 0
65262306a36Sopenharmony_ci	data8 0				// vhangup
65362306a36Sopenharmony_ci	data8 0				// lchown
65462306a36Sopenharmony_ci	data8 0				// remap_file_pages	// 1125
65562306a36Sopenharmony_ci	data8 0				// wait4
65662306a36Sopenharmony_ci	data8 0				// sysinfo
65762306a36Sopenharmony_ci	data8 0				// clone
65862306a36Sopenharmony_ci	data8 0				// setdomainname
65962306a36Sopenharmony_ci	data8 0				// newuname		// 1130
66062306a36Sopenharmony_ci	data8 0				// adjtimex
66162306a36Sopenharmony_ci	data8 0
66262306a36Sopenharmony_ci	data8 0				// init_module
66362306a36Sopenharmony_ci	data8 0				// delete_module
66462306a36Sopenharmony_ci	data8 0							// 1135
66562306a36Sopenharmony_ci	data8 0
66662306a36Sopenharmony_ci	data8 0				// quotactl
66762306a36Sopenharmony_ci	data8 0				// bdflush
66862306a36Sopenharmony_ci	data8 0				// sysfs
66962306a36Sopenharmony_ci	data8 0				// personality		// 1140
67062306a36Sopenharmony_ci	data8 0				// afs_syscall
67162306a36Sopenharmony_ci	data8 0				// setfsuid
67262306a36Sopenharmony_ci	data8 0				// setfsgid
67362306a36Sopenharmony_ci	data8 0				// getdents
67462306a36Sopenharmony_ci	data8 0				// flock		// 1145
67562306a36Sopenharmony_ci	data8 0				// readv
67662306a36Sopenharmony_ci	data8 0				// writev
67762306a36Sopenharmony_ci	data8 0				// pread64
67862306a36Sopenharmony_ci	data8 0				// pwrite64
67962306a36Sopenharmony_ci	data8 0				// sysctl		// 1150
68062306a36Sopenharmony_ci	data8 0				// mmap
68162306a36Sopenharmony_ci	data8 0				// munmap
68262306a36Sopenharmony_ci	data8 0				// mlock
68362306a36Sopenharmony_ci	data8 0				// mlockall
68462306a36Sopenharmony_ci	data8 0				// mprotect		// 1155
68562306a36Sopenharmony_ci	data8 0				// mremap
68662306a36Sopenharmony_ci	data8 0				// msync
68762306a36Sopenharmony_ci	data8 0				// munlock
68862306a36Sopenharmony_ci	data8 0				// munlockall
68962306a36Sopenharmony_ci	data8 0				// sched_getparam	// 1160
69062306a36Sopenharmony_ci	data8 0				// sched_setparam
69162306a36Sopenharmony_ci	data8 0				// sched_getscheduler
69262306a36Sopenharmony_ci	data8 0				// sched_setscheduler
69362306a36Sopenharmony_ci	data8 0				// sched_yield
69462306a36Sopenharmony_ci	data8 0				// sched_get_priority_max	// 1165
69562306a36Sopenharmony_ci	data8 0				// sched_get_priority_min
69662306a36Sopenharmony_ci	data8 0				// sched_rr_get_interval
69762306a36Sopenharmony_ci	data8 0				// nanosleep
69862306a36Sopenharmony_ci	data8 0				// nfsservctl
69962306a36Sopenharmony_ci	data8 0				// prctl		// 1170
70062306a36Sopenharmony_ci	data8 0				// getpagesize
70162306a36Sopenharmony_ci	data8 0				// mmap2
70262306a36Sopenharmony_ci	data8 0				// pciconfig_read
70362306a36Sopenharmony_ci	data8 0				// pciconfig_write
70462306a36Sopenharmony_ci	data8 0				// perfmonctl		// 1175
70562306a36Sopenharmony_ci	data8 0				// sigaltstack
70662306a36Sopenharmony_ci	data8 0				// rt_sigaction
70762306a36Sopenharmony_ci	data8 0				// rt_sigpending
70862306a36Sopenharmony_ci	data8 0				// rt_sigprocmask
70962306a36Sopenharmony_ci	data8 0				// rt_sigqueueinfo	// 1180
71062306a36Sopenharmony_ci	data8 0				// rt_sigreturn
71162306a36Sopenharmony_ci	data8 0				// rt_sigsuspend
71262306a36Sopenharmony_ci	data8 0				// rt_sigtimedwait
71362306a36Sopenharmony_ci	data8 0				// getcwd
71462306a36Sopenharmony_ci	data8 0				// capget		// 1185
71562306a36Sopenharmony_ci	data8 0				// capset
71662306a36Sopenharmony_ci	data8 0				// sendfile
71762306a36Sopenharmony_ci	data8 0
71862306a36Sopenharmony_ci	data8 0
71962306a36Sopenharmony_ci	data8 0				// socket		// 1190
72062306a36Sopenharmony_ci	data8 0				// bind
72162306a36Sopenharmony_ci	data8 0				// connect
72262306a36Sopenharmony_ci	data8 0				// listen
72362306a36Sopenharmony_ci	data8 0				// accept
72462306a36Sopenharmony_ci	data8 0				// getsockname		// 1195
72562306a36Sopenharmony_ci	data8 0				// getpeername
72662306a36Sopenharmony_ci	data8 0				// socketpair
72762306a36Sopenharmony_ci	data8 0				// send
72862306a36Sopenharmony_ci	data8 0				// sendto
72962306a36Sopenharmony_ci	data8 0				// recv			// 1200
73062306a36Sopenharmony_ci	data8 0				// recvfrom
73162306a36Sopenharmony_ci	data8 0				// shutdown
73262306a36Sopenharmony_ci	data8 0				// setsockopt
73362306a36Sopenharmony_ci	data8 0				// getsockopt
73462306a36Sopenharmony_ci	data8 0				// sendmsg		// 1205
73562306a36Sopenharmony_ci	data8 0				// recvmsg
73662306a36Sopenharmony_ci	data8 0				// pivot_root
73762306a36Sopenharmony_ci	data8 0				// mincore
73862306a36Sopenharmony_ci	data8 0				// madvise
73962306a36Sopenharmony_ci	data8 0				// newstat		// 1210
74062306a36Sopenharmony_ci	data8 0				// newlstat
74162306a36Sopenharmony_ci	data8 0				// newfstat
74262306a36Sopenharmony_ci	data8 0				// clone2
74362306a36Sopenharmony_ci	data8 0				// getdents64
74462306a36Sopenharmony_ci	data8 0				// getunwind		// 1215
74562306a36Sopenharmony_ci	data8 0				// readahead
74662306a36Sopenharmony_ci	data8 0				// setxattr
74762306a36Sopenharmony_ci	data8 0				// lsetxattr
74862306a36Sopenharmony_ci	data8 0				// fsetxattr
74962306a36Sopenharmony_ci	data8 0				// getxattr		// 1220
75062306a36Sopenharmony_ci	data8 0				// lgetxattr
75162306a36Sopenharmony_ci	data8 0				// fgetxattr
75262306a36Sopenharmony_ci	data8 0				// listxattr
75362306a36Sopenharmony_ci	data8 0				// llistxattr
75462306a36Sopenharmony_ci	data8 0				// flistxattr		// 1225
75562306a36Sopenharmony_ci	data8 0				// removexattr
75662306a36Sopenharmony_ci	data8 0				// lremovexattr
75762306a36Sopenharmony_ci	data8 0				// fremovexattr
75862306a36Sopenharmony_ci	data8 0				// tkill
75962306a36Sopenharmony_ci	data8 0				// futex		// 1230
76062306a36Sopenharmony_ci	data8 0				// sched_setaffinity
76162306a36Sopenharmony_ci	data8 0				// sched_getaffinity
76262306a36Sopenharmony_ci	data8 fsys_set_tid_address	// set_tid_address
76362306a36Sopenharmony_ci	data8 0				// fadvise64_64
76462306a36Sopenharmony_ci	data8 0				// tgkill		// 1235
76562306a36Sopenharmony_ci	data8 0				// exit_group
76662306a36Sopenharmony_ci	data8 0				// lookup_dcookie
76762306a36Sopenharmony_ci	data8 0				// io_setup
76862306a36Sopenharmony_ci	data8 0				// io_destroy
76962306a36Sopenharmony_ci	data8 0				// io_getevents		// 1240
77062306a36Sopenharmony_ci	data8 0				// io_submit
77162306a36Sopenharmony_ci	data8 0				// io_cancel
77262306a36Sopenharmony_ci	data8 0				// epoll_create
77362306a36Sopenharmony_ci	data8 0				// epoll_ctl
77462306a36Sopenharmony_ci	data8 0				// epoll_wait		// 1245
77562306a36Sopenharmony_ci	data8 0				// restart_syscall
77662306a36Sopenharmony_ci	data8 0				// semtimedop
77762306a36Sopenharmony_ci	data8 0				// timer_create
77862306a36Sopenharmony_ci	data8 0				// timer_settime
77962306a36Sopenharmony_ci	data8 0				// timer_gettime 	// 1250
78062306a36Sopenharmony_ci	data8 0				// timer_getoverrun
78162306a36Sopenharmony_ci	data8 0				// timer_delete
78262306a36Sopenharmony_ci	data8 0				// clock_settime
78362306a36Sopenharmony_ci	data8 fsys_clock_gettime	// clock_gettime
78462306a36Sopenharmony_ci	data8 0				// clock_getres		// 1255
78562306a36Sopenharmony_ci	data8 0				// clock_nanosleep
78662306a36Sopenharmony_ci	data8 0				// fstatfs64
78762306a36Sopenharmony_ci	data8 0				// statfs64
78862306a36Sopenharmony_ci	data8 0				// mbind
78962306a36Sopenharmony_ci	data8 0				// get_mempolicy	// 1260
79062306a36Sopenharmony_ci	data8 0				// set_mempolicy
79162306a36Sopenharmony_ci	data8 0				// mq_open
79262306a36Sopenharmony_ci	data8 0				// mq_unlink
79362306a36Sopenharmony_ci	data8 0				// mq_timedsend
79462306a36Sopenharmony_ci	data8 0				// mq_timedreceive	// 1265
79562306a36Sopenharmony_ci	data8 0				// mq_notify
79662306a36Sopenharmony_ci	data8 0				// mq_getsetattr
79762306a36Sopenharmony_ci	data8 0				// kexec_load
79862306a36Sopenharmony_ci	data8 0				// vserver
79962306a36Sopenharmony_ci	data8 0				// waitid		// 1270
80062306a36Sopenharmony_ci	data8 0				// add_key
80162306a36Sopenharmony_ci	data8 0				// request_key
80262306a36Sopenharmony_ci	data8 0				// keyctl
80362306a36Sopenharmony_ci	data8 0				// ioprio_set
80462306a36Sopenharmony_ci	data8 0				// ioprio_get		// 1275
80562306a36Sopenharmony_ci	data8 0				// move_pages
80662306a36Sopenharmony_ci	data8 0				// inotify_init
80762306a36Sopenharmony_ci	data8 0				// inotify_add_watch
80862306a36Sopenharmony_ci	data8 0				// inotify_rm_watch
80962306a36Sopenharmony_ci	data8 0				// migrate_pages	// 1280
81062306a36Sopenharmony_ci	data8 0				// openat
81162306a36Sopenharmony_ci	data8 0				// mkdirat
81262306a36Sopenharmony_ci	data8 0				// mknodat
81362306a36Sopenharmony_ci	data8 0				// fchownat
81462306a36Sopenharmony_ci	data8 0				// futimesat		// 1285
81562306a36Sopenharmony_ci	data8 0				// newfstatat
81662306a36Sopenharmony_ci	data8 0				// unlinkat
81762306a36Sopenharmony_ci	data8 0				// renameat
81862306a36Sopenharmony_ci	data8 0				// linkat
81962306a36Sopenharmony_ci	data8 0				// symlinkat		// 1290
82062306a36Sopenharmony_ci	data8 0				// readlinkat
82162306a36Sopenharmony_ci	data8 0				// fchmodat
82262306a36Sopenharmony_ci	data8 0				// faccessat
82362306a36Sopenharmony_ci	data8 0
82462306a36Sopenharmony_ci	data8 0							// 1295
82562306a36Sopenharmony_ci	data8 0				// unshare
82662306a36Sopenharmony_ci	data8 0				// splice
82762306a36Sopenharmony_ci	data8 0				// set_robust_list
82862306a36Sopenharmony_ci	data8 0				// get_robust_list
82962306a36Sopenharmony_ci	data8 0				// sync_file_range	// 1300
83062306a36Sopenharmony_ci	data8 0				// tee
83162306a36Sopenharmony_ci	data8 0				// vmsplice
83262306a36Sopenharmony_ci	data8 0
83362306a36Sopenharmony_ci	data8 fsys_getcpu		// getcpu		// 1304
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_ci	// fill in zeros for the remaining entries
83662306a36Sopenharmony_ci	.zero:
83762306a36Sopenharmony_ci	.space fsyscall_table + 8*NR_syscalls - .zero, 0
838