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