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

entry.S (5663B)


      1/*
      2 *  entry.S -- non-mmu 68000 interrupt and exception entry points
      3 *
      4 *  Copyright (C) 1991, 1992  Linus Torvalds
      5 *
      6 * This file is subject to the terms and conditions of the GNU General Public
      7 * License.  See the file README.legal in the main directory of this archive
      8 * for more details.
      9 *
     10 * Linux/m68k support by Hamish Macdonald
     11 */
     12
     13#include <linux/linkage.h>
     14#include <asm/thread_info.h>
     15#include <asm/unistd.h>
     16#include <asm/errno.h>
     17#include <asm/setup.h>
     18#include <asm/traps.h>
     19#include <asm/asm-offsets.h>
     20#include <asm/entry.h>
     21
     22.text
     23
     24.globl system_call
     25.globl resume
     26.globl ret_from_exception
     27.globl sys_call_table
     28.globl bad_interrupt
     29.globl inthandler1
     30.globl inthandler2
     31.globl inthandler3
     32.globl inthandler4
     33.globl inthandler5
     34.globl inthandler6
     35.globl inthandler7
     36
     37badsys:
     38	movel	#-ENOSYS,%sp@(PT_OFF_D0)
     39	jra	ret_from_exception
     40
     41do_trace:
     42	movel	#-ENOSYS,%sp@(PT_OFF_D0) /* needed for strace*/
     43	subql	#4,%sp
     44	SAVE_SWITCH_STACK
     45	jbsr	syscall_trace_enter
     46	RESTORE_SWITCH_STACK
     47	addql	#4,%sp
     48	movel	%sp@(PT_OFF_ORIG_D0),%d1
     49	movel	#-ENOSYS,%d0
     50	cmpl	#NR_syscalls,%d1
     51	jcc	1f
     52	lsl	#2,%d1
     53	lea	sys_call_table, %a0
     54	jbsr	%a0@(%d1)
     55
     561:	movel	%d0,%sp@(PT_OFF_D0)	/* save the return value */
     57	subql	#4,%sp			/* dummy return address */
     58	SAVE_SWITCH_STACK
     59	jbsr	syscall_trace_leave
     60	RESTORE_SWITCH_STACK
     61	addql	#4,%sp
     62	jra	ret_from_exception
     63
     64ENTRY(system_call)
     65	SAVE_ALL_SYS
     66
     67	/* save top of frame*/
     68	pea	%sp@
     69	jbsr	set_esp0
     70	addql	#4,%sp
     71
     72	movel	%sp@(PT_OFF_ORIG_D0),%d0
     73
     74	movel	%sp,%d1			/* get thread_info pointer */
     75	andl	#-THREAD_SIZE,%d1
     76	movel	%d1,%a2
     77	btst	#(TIF_SYSCALL_TRACE%8),%a2@(TINFO_FLAGS+(31-TIF_SYSCALL_TRACE)/8)
     78	jne	do_trace
     79	cmpl	#NR_syscalls,%d0
     80	jcc	badsys
     81	lsl	#2,%d0
     82	lea	sys_call_table,%a0
     83	movel	%a0@(%d0), %a0
     84	jbsr	%a0@
     85	movel	%d0,%sp@(PT_OFF_D0)	/* save the return value*/
     86
     87ret_from_exception:
     88	btst	#5,%sp@(PT_OFF_SR)	/* check if returning to kernel*/
     89	jeq	Luser_return		/* if so, skip resched, signals*/
     90
     91Lkernel_return:
     92	RESTORE_ALL
     93
     94Luser_return:
     95	/* only allow interrupts when we are really the last one on the*/
     96	/* kernel stack, otherwise stack overflow can occur during*/
     97	/* heavy interrupt load*/
     98	andw	#ALLOWINT,%sr
     99
    100	movel	%sp,%d1			/* get thread_info pointer */
    101	andl	#-THREAD_SIZE,%d1
    102	movel	%d1,%a2
    1031:
    104	move	%a2@(TINFO_FLAGS),%d1	/* thread_info->flags */
    105	jne	Lwork_to_do
    106	RESTORE_ALL
    107
    108Lwork_to_do:
    109	movel	%a2@(TINFO_FLAGS),%d1	/* thread_info->flags */
    110	btst	#TIF_NEED_RESCHED,%d1
    111	jne	reschedule
    112
    113Lsignal_return:
    114	subql	#4,%sp			/* dummy return address*/
    115	SAVE_SWITCH_STACK
    116	pea	%sp@(SWITCH_STACK_SIZE)
    117	bsrw	do_notify_resume
    118	addql	#4,%sp
    119	RESTORE_SWITCH_STACK
    120	addql	#4,%sp
    121	jra	1b
    122
    123/*
    124 * This is the main interrupt handler, responsible for calling process_int()
    125 */
    126inthandler1:
    127	SAVE_ALL_INT
    128	movew	%sp@(PT_OFF_FORMATVEC), %d0
    129	and	#0x3ff, %d0
    130
    131	movel	%sp,%sp@-
    132	movel	#65,%sp@- 		/*  put vector # on stack*/
    133	jbsr	process_int		/*  process the IRQ*/
    1343:     	addql	#8,%sp			/*  pop parameters off stack*/
    135	bra	ret_from_exception
    136
    137inthandler2:
    138	SAVE_ALL_INT
    139	movew	%sp@(PT_OFF_FORMATVEC), %d0
    140	and	#0x3ff, %d0
    141
    142	movel	%sp,%sp@-
    143	movel	#66,%sp@- 		/*  put vector # on stack*/
    144	jbsr	process_int		/*  process the IRQ*/
    1453:     	addql	#8,%sp			/*  pop parameters off stack*/
    146	bra	ret_from_exception
    147
    148inthandler3:
    149	SAVE_ALL_INT
    150	movew	%sp@(PT_OFF_FORMATVEC), %d0
    151	and	#0x3ff, %d0
    152
    153	movel	%sp,%sp@-
    154	movel	#67,%sp@- 		/*  put vector # on stack*/
    155	jbsr	process_int		/*  process the IRQ*/
    1563:     	addql	#8,%sp			/*  pop parameters off stack*/
    157	bra	ret_from_exception
    158
    159inthandler4:
    160	SAVE_ALL_INT
    161	movew	%sp@(PT_OFF_FORMATVEC), %d0
    162	and	#0x3ff, %d0
    163
    164	movel	%sp,%sp@-
    165	movel	#68,%sp@- 		/*  put vector # on stack*/
    166	jbsr	process_int		/*  process the IRQ*/
    1673:     	addql	#8,%sp			/*  pop parameters off stack*/
    168	bra	ret_from_exception
    169
    170inthandler5:
    171	SAVE_ALL_INT
    172	movew	%sp@(PT_OFF_FORMATVEC), %d0
    173	and	#0x3ff, %d0
    174
    175	movel	%sp,%sp@-
    176	movel	#69,%sp@- 		/*  put vector # on stack*/
    177	jbsr	process_int		/*  process the IRQ*/
    1783:     	addql	#8,%sp			/*  pop parameters off stack*/
    179	bra	ret_from_exception
    180
    181inthandler6:
    182	SAVE_ALL_INT
    183	movew	%sp@(PT_OFF_FORMATVEC), %d0
    184	and	#0x3ff, %d0
    185
    186	movel	%sp,%sp@-
    187	movel	#70,%sp@- 		/*  put vector # on stack*/
    188	jbsr	process_int		/*  process the IRQ*/
    1893:     	addql	#8,%sp			/*  pop parameters off stack*/
    190	bra	ret_from_exception
    191
    192inthandler7:
    193	SAVE_ALL_INT
    194	movew	%sp@(PT_OFF_FORMATVEC), %d0
    195	and	#0x3ff, %d0
    196
    197	movel	%sp,%sp@-
    198	movel	#71,%sp@- 		/*  put vector # on stack*/
    199	jbsr	process_int		/*  process the IRQ*/
    2003:     	addql	#8,%sp			/*  pop parameters off stack*/
    201	bra	ret_from_exception
    202
    203inthandler:
    204	SAVE_ALL_INT
    205	movew	%sp@(PT_OFF_FORMATVEC), %d0
    206	and	#0x3ff, %d0
    207
    208	movel	%sp,%sp@-
    209	movel	%d0,%sp@- 		/*  put vector # on stack*/
    210	jbsr	process_int		/*  process the IRQ*/
    2113:     	addql	#8,%sp			/*  pop parameters off stack*/
    212	bra	ret_from_exception
    213
    214/*
    215 * Handler for uninitialized and spurious interrupts.
    216 */
    217ENTRY(bad_interrupt)
    218	addql	#1,irq_err_count
    219	rte
    220
    221/*
    222 * Beware - when entering resume, prev (the current task) is
    223 * in a0, next (the new task) is in a1, so don't change these
    224 * registers until their contents are no longer needed.
    225 */
    226ENTRY(resume)
    227	movel	%a0,%d1				/* save prev thread in d1 */
    228	movew	%sr,%a0@(TASK_THREAD+THREAD_SR)	/* save sr */
    229	SAVE_SWITCH_STACK
    230	movel	%sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */
    231	movel	%usp,%a3			/* save usp */
    232	movel	%a3,%a0@(TASK_THREAD+THREAD_USP)
    233
    234	movel	%a1@(TASK_THREAD+THREAD_USP),%a3 /* restore user stack */
    235	movel	%a3,%usp
    236	movel	%a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */
    237	RESTORE_SWITCH_STACK
    238	movew	%a1@(TASK_THREAD+THREAD_SR),%sr	/* restore thread status reg */
    239	rts
    240