blob: 727fb8a1b0ebda80e28fb3f21749fe5a023f6139 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02 by Ralf Baechle
7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
8 * Copyright (C) 2001 MIPS Technologies, Inc.
9 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070010#include <linux/errno.h>
11#include <asm/asm.h>
12#include <asm/asmmacro.h>
Ralf Baechle192ef362006-07-07 14:07:18 +010013#include <asm/irqflags.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070014#include <asm/mipsregs.h>
15#include <asm/regdef.h>
16#include <asm/stackframe.h>
Sam Ravnborg048eb582005-09-09 22:32:31 +020017#include <asm/asm-offsets.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <asm/sysmips.h>
19#include <asm/thread_info.h>
20#include <asm/unistd.h>
21#include <asm/war.h>
22
23#ifndef CONFIG_BINFMT_ELF32
24/* Neither O32 nor N32, so define handle_sys here */
25#define handle_sys64 handle_sys
26#endif
27
Ralf Baechle70342282013-01-22 12:59:30 +010028 .align 5
Linus Torvalds1da177e2005-04-16 15:20:36 -070029NESTED(handle_sys64, PT_SIZE, sp)
30#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
31 /*
32 * When 32-bit compatibility is configured scall_o32.S
33 * already did this.
34 */
35 .set noat
36 SAVE_SOME
Atsushi Nemotoeae6c0d2006-09-26 23:43:40 +090037 TRACE_IRQS_ON_RELOAD
Linus Torvalds1da177e2005-04-16 15:20:36 -070038 STI
39 .set at
40#endif
41
Linus Torvalds1da177e2005-04-16 15:20:36 -070042#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
43 ld t1, PT_EPC(sp) # skip syscall on return
44 daddiu t1, 4 # skip to next instruction
45 sd t1, PT_EPC(sp)
46#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
48 sd a3, PT_R26(sp) # save a3 for syscall restarting
49
Ralf Baechlee7f3b482013-05-29 01:02:18 +020050 li t1, _TIF_WORK_SYSCALL_ENTRY
Linus Torvalds1da177e2005-04-16 15:20:36 -070051 LONG_L t0, TI_FLAGS($28) # syscall tracing enabled?
52 and t0, t1, t0
53 bnez t0, syscall_trace_entry
54
Markos Chandrasd218af72015-09-25 08:17:42 +010055syscall_common:
56 dsubu t2, v0, __NR_64_Linux
Firoz Khanbe856432018-12-13 14:37:36 +053057 sltiu t0, t2, __NR_64_Linux_syscalls
Markos Chandrasd218af72015-09-25 08:17:42 +010058 beqz t0, illegal_syscall
59
60 dsll t0, t2, 3 # offset into table
61 dla t2, sys_call_table
62 daddu t0, t2, t0
63 ld t2, (t0) # syscall routine
64 beqz t2, illegal_syscall
65
Linus Torvalds1da177e2005-04-16 15:20:36 -070066 jalr t2 # Do The Real Thing (TM)
67
68 li t0, -EMAXERRNO - 1 # error?
69 sltu t0, t0, v0
70 sd t0, PT_R7(sp) # set error flag
71 beqz t0, 1f
72
Al Viro8f5a00eb2010-09-28 18:50:37 +010073 ld t1, PT_R2(sp) # syscall number
Linus Torvalds1da177e2005-04-16 15:20:36 -070074 dnegu v0 # error
Al Viro8f5a00eb2010-09-28 18:50:37 +010075 sd t1, PT_R0(sp) # save it for syscall restarting
Linus Torvalds1da177e2005-04-16 15:20:36 -0700761: sd v0, PT_R2(sp) # result
77
78n64_syscall_exit:
Al Viro02f884e2012-05-05 16:11:35 -040079 j syscall_exit_partial
Linus Torvalds1da177e2005-04-16 15:20:36 -070080
81/* ------------------------------------------------------------------------ */
82
83syscall_trace_entry:
84 SAVE_STATIC
Linus Torvalds1da177e2005-04-16 15:20:36 -070085 move a0, sp
Markos Chandras9f161432015-08-13 08:47:59 +010086 move a1, v0
Ralf Baechle8b659a32011-05-19 09:21:29 +010087 jal syscall_trace_enter
Linus Torvalds1da177e2005-04-16 15:20:36 -070088
Markos Chandrasd218af72015-09-25 08:17:42 +010089 bltz v0, 1f # seccomp failed? Skip syscall
Markos Chandras9d37c402014-01-22 14:40:02 +000090
Ralf Baechle04a70522005-11-30 16:24:57 +000091 RESTORE_STATIC
Matt Redfearna400bed2016-03-29 09:35:31 +010092 ld v0, PT_R2(sp) # Restore syscall (maybe modified)
Linus Torvalds1da177e2005-04-16 15:20:36 -070093 ld a0, PT_R4(sp) # Restore argument registers
94 ld a1, PT_R5(sp)
95 ld a2, PT_R6(sp)
96 ld a3, PT_R7(sp)
97 ld a4, PT_R8(sp)
98 ld a5, PT_R9(sp)
Markos Chandrasd218af72015-09-25 08:17:42 +010099 j syscall_common
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100
Markos Chandrasd218af72015-09-25 08:17:42 +01001011: j syscall_exit
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
103illegal_syscall:
104 /* This also isn't a 64-bit syscall, throw an error. */
Atsushi Nemotobda82292008-10-25 01:17:22 +0900105 li v0, ENOSYS # error
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106 sd v0, PT_R2(sp)
107 li t0, 1 # set error flag
108 sd t0, PT_R7(sp)
109 j n64_syscall_exit
110 END(handle_sys64)
111
Firoz Khan99bf73e2018-12-13 14:37:39 +0530112#define __SYSCALL(nr, entry, nargs) PTR entry
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113 .align 3
Ralf Baechle03b94e22012-07-12 14:06:46 +0200114 .type sys_call_table, @object
115EXPORT(sys_call_table)
Firoz Khan99bf73e2018-12-13 14:37:39 +0530116#include <asm/syscall_table_64_n64.h>
117#undef __SYSCALL