cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

scall64-n64.S (2752B)


      1/*
      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 */
     10#include <linux/errno.h>
     11#include <asm/asm.h>
     12#include <asm/asmmacro.h>
     13#include <asm/irqflags.h>
     14#include <asm/mipsregs.h>
     15#include <asm/regdef.h>
     16#include <asm/stackframe.h>
     17#include <asm/asm-offsets.h>
     18#include <asm/sysmips.h>
     19#include <asm/thread_info.h>
     20#include <asm/unistd.h>
     21
     22#ifndef CONFIG_MIPS32_COMPAT
     23/* Neither O32 nor N32, so define handle_sys here */
     24#define handle_sys64 handle_sys
     25#endif
     26
     27	.align	5
     28NESTED(handle_sys64, PT_SIZE, sp)
     29#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
     30	/*
     31	 * When 32-bit compatibility is configured scall_o32.S
     32	 * already did this.
     33	 */
     34	.set	noat
     35	SAVE_SOME
     36	TRACE_IRQS_ON_RELOAD
     37	STI
     38	.set	at
     39#endif
     40
     41#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
     42	ld	t1, PT_EPC(sp)		# skip syscall on return
     43	daddiu	t1, 4			# skip to next instruction
     44	sd	t1, PT_EPC(sp)
     45#endif
     46
     47	sd	a3, PT_R26(sp)		# save a3 for syscall restarting
     48
     49	li	t1, _TIF_WORK_SYSCALL_ENTRY
     50	LONG_L	t0, TI_FLAGS($28)	# syscall tracing enabled?
     51	and	t0, t1, t0
     52	bnez	t0, syscall_trace_entry
     53
     54syscall_common:
     55	dsubu	t2, v0, __NR_64_Linux
     56	sltiu   t0, t2, __NR_64_Linux_syscalls
     57	beqz	t0, illegal_syscall
     58
     59	dsll	t0, t2, 3		# offset into table
     60	dla	t2, sys_call_table
     61	daddu	t0, t2, t0
     62	ld	t2, (t0)		# syscall routine
     63	beqz	t2, illegal_syscall
     64
     65	jalr	t2			# Do The Real Thing (TM)
     66
     67	li	t0, -EMAXERRNO - 1	# error?
     68	sltu	t0, t0, v0
     69	sd	t0, PT_R7(sp)		# set error flag
     70	beqz	t0, 1f
     71
     72	ld	t1, PT_R2(sp)		# syscall number
     73	dnegu	v0			# error
     74	sd	t1, PT_R0(sp)		# save it for syscall restarting
     751:	sd	v0, PT_R2(sp)		# result
     76
     77n64_syscall_exit:
     78	j	syscall_exit_partial
     79
     80/* ------------------------------------------------------------------------ */
     81
     82syscall_trace_entry:
     83	SAVE_STATIC
     84	move	a0, sp
     85	move	a1, v0
     86	jal	syscall_trace_enter
     87
     88	bltz	v0, 1f			# seccomp failed? Skip syscall
     89
     90	RESTORE_STATIC
     91	ld	v0, PT_R2(sp)		# Restore syscall (maybe modified)
     92	ld	a0, PT_R4(sp)		# Restore argument registers
     93	ld	a1, PT_R5(sp)
     94	ld	a2, PT_R6(sp)
     95	ld	a3, PT_R7(sp)
     96	ld	a4, PT_R8(sp)
     97	ld	a5, PT_R9(sp)
     98	j	syscall_common
     99
    1001:	j	syscall_exit
    101
    102illegal_syscall:
    103	/* This also isn't a 64-bit syscall, throw an error.  */
    104	li	v0, ENOSYS			# error
    105	sd	v0, PT_R2(sp)
    106	li	t0, 1				# set error flag
    107	sd	t0, PT_R7(sp)
    108	j	n64_syscall_exit
    109	END(handle_sys64)
    110
    111#define __SYSCALL(nr, entry)	PTR_WD entry
    112	.align	3
    113	.type	sys_call_table, @object
    114EXPORT(sys_call_table)
    115#include <asm/syscall_table_n64.h>