xref: /openbmc/linux/arch/mips/kernel/scall64-n64.S (revision e0d77d0f38aa60ca61b3ce6e60d64fad2aa0853d)
16d92c268SFiroz Khan/*
26d92c268SFiroz Khan * This file is subject to the terms and conditions of the GNU General Public
36d92c268SFiroz Khan * License.  See the file "COPYING" in the main directory of this archive
46d92c268SFiroz Khan * for more details.
56d92c268SFiroz Khan *
66d92c268SFiroz Khan * Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02 by Ralf Baechle
76d92c268SFiroz Khan * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
86d92c268SFiroz Khan * Copyright (C) 2001 MIPS Technologies, Inc.
96d92c268SFiroz Khan */
106d92c268SFiroz Khan#include <linux/errno.h>
116d92c268SFiroz Khan#include <asm/asm.h>
126d92c268SFiroz Khan#include <asm/asmmacro.h>
136d92c268SFiroz Khan#include <asm/irqflags.h>
146d92c268SFiroz Khan#include <asm/mipsregs.h>
156d92c268SFiroz Khan#include <asm/regdef.h>
166d92c268SFiroz Khan#include <asm/stackframe.h>
176d92c268SFiroz Khan#include <asm/asm-offsets.h>
186d92c268SFiroz Khan#include <asm/sysmips.h>
196d92c268SFiroz Khan#include <asm/thread_info.h>
206d92c268SFiroz Khan#include <asm/unistd.h>
216d92c268SFiroz Khan
220bb87f05SAl Viro#ifndef CONFIG_MIPS32_COMPAT
236d92c268SFiroz Khan/* Neither O32 nor N32, so define handle_sys here */
246d92c268SFiroz Khan#define handle_sys64 handle_sys
256d92c268SFiroz Khan#endif
266d92c268SFiroz Khan
276d92c268SFiroz Khan	.align	5
286d92c268SFiroz KhanNESTED(handle_sys64, PT_SIZE, sp)
296d92c268SFiroz Khan#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
306d92c268SFiroz Khan	/*
316d92c268SFiroz Khan	 * When 32-bit compatibility is configured scall_o32.S
326d92c268SFiroz Khan	 * already did this.
336d92c268SFiroz Khan	 */
346d92c268SFiroz Khan	.set	noat
356d92c268SFiroz Khan	SAVE_SOME
366d92c268SFiroz Khan	TRACE_IRQS_ON_RELOAD
376d92c268SFiroz Khan	STI
386d92c268SFiroz Khan	.set	at
396d92c268SFiroz Khan#endif
406d92c268SFiroz Khan
416d92c268SFiroz Khan#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
426d92c268SFiroz Khan	ld	t1, PT_EPC(sp)		# skip syscall on return
436d92c268SFiroz Khan	daddiu	t1, 4			# skip to next instruction
446d92c268SFiroz Khan	sd	t1, PT_EPC(sp)
456d92c268SFiroz Khan#endif
466d92c268SFiroz Khan
476d92c268SFiroz Khan	sd	a3, PT_R26(sp)		# save a3 for syscall restarting
486d92c268SFiroz Khan
49*f91955daSJiaxun Yang	LONG_S	v0, TI_SYSCALL($28)     # Store syscall number
50*f91955daSJiaxun Yang
516d92c268SFiroz Khan	li	t1, _TIF_WORK_SYSCALL_ENTRY
526d92c268SFiroz Khan	LONG_L	t0, TI_FLAGS($28)	# syscall tracing enabled?
536d92c268SFiroz Khan	and	t0, t1, t0
546d92c268SFiroz Khan	bnez	t0, syscall_trace_entry
556d92c268SFiroz Khan
566d92c268SFiroz Khansyscall_common:
576d92c268SFiroz Khan	dsubu	t2, v0, __NR_64_Linux
58be856439SFiroz Khan	sltiu   t0, t2, __NR_64_Linux_syscalls
596d92c268SFiroz Khan	beqz	t0, illegal_syscall
606d92c268SFiroz Khan
616d92c268SFiroz Khan	dsll	t0, t2, 3		# offset into table
626d92c268SFiroz Khan	dla	t2, sys_call_table
636d92c268SFiroz Khan	daddu	t0, t2, t0
646d92c268SFiroz Khan	ld	t2, (t0)		# syscall routine
656d92c268SFiroz Khan	beqz	t2, illegal_syscall
666d92c268SFiroz Khan
676d92c268SFiroz Khan	jalr	t2			# Do The Real Thing (TM)
686d92c268SFiroz Khan
696d92c268SFiroz Khan	li	t0, -EMAXERRNO - 1	# error?
706d92c268SFiroz Khan	sltu	t0, t0, v0
716d92c268SFiroz Khan	sd	t0, PT_R7(sp)		# set error flag
726d92c268SFiroz Khan	beqz	t0, 1f
736d92c268SFiroz Khan
746d92c268SFiroz Khan	ld	t1, PT_R2(sp)		# syscall number
756d92c268SFiroz Khan	dnegu	v0			# error
766d92c268SFiroz Khan	sd	t1, PT_R0(sp)		# save it for syscall restarting
776d92c268SFiroz Khan1:	sd	v0, PT_R2(sp)		# result
786d92c268SFiroz Khan
796d92c268SFiroz Khann64_syscall_exit:
806d92c268SFiroz Khan	j	syscall_exit_partial
816d92c268SFiroz Khan
826d92c268SFiroz Khan/* ------------------------------------------------------------------------ */
836d92c268SFiroz Khan
846d92c268SFiroz Khansyscall_trace_entry:
856d92c268SFiroz Khan	SAVE_STATIC
866d92c268SFiroz Khan	move	a0, sp
876d92c268SFiroz Khan	jal	syscall_trace_enter
886d92c268SFiroz Khan
896d92c268SFiroz Khan	bltz	v0, 1f			# seccomp failed? Skip syscall
906d92c268SFiroz Khan
916d92c268SFiroz Khan	RESTORE_STATIC
926d92c268SFiroz Khan	ld	v0, PT_R2(sp)		# Restore syscall (maybe modified)
936d92c268SFiroz Khan	ld	a0, PT_R4(sp)		# Restore argument registers
946d92c268SFiroz Khan	ld	a1, PT_R5(sp)
956d92c268SFiroz Khan	ld	a2, PT_R6(sp)
966d92c268SFiroz Khan	ld	a3, PT_R7(sp)
976d92c268SFiroz Khan	ld	a4, PT_R8(sp)
986d92c268SFiroz Khan	ld	a5, PT_R9(sp)
996d92c268SFiroz Khan	j	syscall_common
1006d92c268SFiroz Khan
1016d92c268SFiroz Khan1:	j	syscall_exit
1026d92c268SFiroz Khan
1036d92c268SFiroz Khanillegal_syscall:
1046d92c268SFiroz Khan	/* This also isn't a 64-bit syscall, throw an error.  */
1056d92c268SFiroz Khan	li	v0, ENOSYS			# error
1066d92c268SFiroz Khan	sd	v0, PT_R2(sp)
1076d92c268SFiroz Khan	li	t0, 1				# set error flag
1086d92c268SFiroz Khan	sd	t0, PT_R7(sp)
1096d92c268SFiroz Khan	j	n64_syscall_exit
1106d92c268SFiroz Khan	END(handle_sys64)
1116d92c268SFiroz Khan
112fa62f39dSThomas Bogendoerfer#define __SYSCALL(nr, entry)	PTR_WD entry
1136d92c268SFiroz Khan	.align	3
1146d92c268SFiroz Khan	.type	sys_call_table, @object
1156d92c268SFiroz KhanEXPORT(sys_call_table)
116ecbba30fSMasahiro Yamada#include <asm/syscall_table_n64.h>
117