11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/arch/m32r/kernel/entry.S
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (c) 2001, 2002  Hirokazu Takata, Hitoshi Yamamoto, H. Kondo
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (c) 2003  Hitoshi Yamamoto
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (c) 2004  Hirokazu Takata <takata at linux-m32r.org>
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Taken from i386 version.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    Copyright (C) 1991, 1992  Linus Torvalds
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * entry.S contains the system-call and fault low-level handling routines.
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This also contains the timer-interrupt handler, as well as all interrupts
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and faults that can result in a task-switch.
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: This code handles signal-recognition, which happens every time
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * after a timer-interrupt and after each system call.
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Stack layout in 'ret_from_system_call':
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 	ptrace needs to have all regs on the stack.
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	if the order here is changed, it needs to be
238e8ff02c0b61d9b7c15c7996a2eddbedf51a105bHirokazu Takata *	updated in fork.c:copy_thread, signal.c:do_signal,
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	ptrace.c and ptrace.h
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
268b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata * M32R/M32Rx/M32R2
278b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(sp)      - r4
288b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x04,sp) - r5
298b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x08,sp) - r6
308b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x0c,sp) - *pt_regs
318b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x10,sp) - r0
328b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x14,sp) - r1
338b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x18,sp) - r2
348b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x1c,sp) - r3
358b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x20,sp) - r7
368b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x24,sp) - r8
378b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x28,sp) - r9
388b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x2c,sp) - r10
398b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x30,sp) - r11
408b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x34,sp) - r12
418b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x38,sp) - syscall_nr
428b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x3c,sp) - acc0h
438b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x40,sp) - acc0l
448b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x44,sp) - acc1h		; ISA_DSP_LEVEL2 only
458b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x48,sp) - acc1l		; ISA_DSP_LEVEL2 only
468b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x4c,sp) - psw
478b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x50,sp) - bpc
488b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x54,sp) - bbpsw
498b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x58,sp) - bbpc
508b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x5c,sp) - spu (cr3)
518b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x60,sp) - fp (r13)
528b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x64,sp) - lr (r14)
538b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x68,sp) - spi (cr2)
548b03a632ef673bf1069ac9c96c97ff2830289312Hirokazu Takata *       @(0x6c,sp) - orig_r0
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/linkage.h>
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/unistd.h>
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/assembler.h>
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/thread_info.h>
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/errno.h>
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/segment.h>
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/smp.h>
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/page.h>
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/m32r.h>
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mmu_context.h>
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if !defined(CONFIG_MMU)
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_madvise		sys_ni_syscall
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_readahead		sys_ni_syscall
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_mprotect		sys_ni_syscall
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_msync		sys_ni_syscall
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_mlock		sys_ni_syscall
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_munlock		sys_ni_syscall
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_mlockall		sys_ni_syscall
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_munlockall		sys_ni_syscall
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_mremap		sys_ni_syscall
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_mincore		sys_ni_syscall
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sys_remap_file_pages	sys_ni_syscall
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_MMU */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R4(reg)			@reg
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R5(reg)			@(0x04,reg)
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R6(reg)			@(0x08,reg)
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PTREGS(reg)		@(0x0C,reg)
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R0(reg)			@(0x10,reg)
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R1(reg)			@(0x14,reg)
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R2(reg)			@(0x18,reg)
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R3(reg)			@(0x1C,reg)
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R7(reg)			@(0x20,reg)
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R8(reg)			@(0x24,reg)
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R9(reg)			@(0x28,reg)
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R10(reg)		@(0x2C,reg)
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R11(reg)		@(0x30,reg)
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R12(reg)		@(0x34,reg)
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYSCALL_NR(reg)		@(0x38,reg)
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACC0H(reg)		@(0x3C,reg)
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACC0L(reg)		@(0x40,reg)
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACC1H(reg)		@(0x44,reg)
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACC1L(reg)		@(0x48,reg)
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PSW(reg)		@(0x4C,reg)
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BPC(reg)		@(0x50,reg)
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BBPSW(reg)		@(0x54,reg)
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BBPC(reg)		@(0x58,reg)
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SPU(reg)		@(0x5C,reg)
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FP(reg)			@(0x60,reg)  /* FP = R13 */
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LR(reg)			@(0x64,reg)
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SP(reg)			@(0x68,reg)
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ORIG_R0(reg)		@(0x6C,reg)
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1129990b48a403fa465b4ff600cd8a7b5108d1bc135Hirokazu Takata#define nr_syscalls ((syscall_table_size)/4)
1139990b48a403fa465b4ff600cd8a7b5108d1bc135Hirokazu Takata
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PREEMPT
1157071b2914a540b43dfcad17f6892a8c115799d50Hirokazu Takata#define preempt_stop(x)		DISABLE_INTERRUPTS(x)
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define preempt_stop(x)
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define resume_kernel		restore_all
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12100b01b246bc2e28763cbd85f0dc949d6c0d38c13Tim Abbott/* how to get the thread information struct from ASM */
12200b01b246bc2e28763cbd85f0dc949d6c0d38c13Tim Abbott#define GET_THREAD_INFO(reg)	GET_THREAD_INFO reg
12300b01b246bc2e28763cbd85f0dc949d6c0d38c13Tim Abbott	.macro GET_THREAD_INFO reg
12400b01b246bc2e28763cbd85f0dc949d6c0d38c13Tim Abbott	ldi	\reg, #-THREAD_SIZE
12500b01b246bc2e28763cbd85f0dc949d6c0d38c13Tim Abbott	and	\reg, sp
12600b01b246bc2e28763cbd85f0dc949d6c0d38c13Tim Abbott	.endm
12700b01b246bc2e28763cbd85f0dc949d6c0d38c13Tim Abbott
128ea4a1da9b2e6f419526b5fde15cd5563096368ebAl ViroENTRY(ret_from_kernel_thread)
129ea4a1da9b2e6f419526b5fde15cd5563096368ebAl Viro	pop	r0
130ea4a1da9b2e6f419526b5fde15cd5563096368ebAl Viro	bl	schedule_tail
131ea4a1da9b2e6f419526b5fde15cd5563096368ebAl Viro	GET_THREAD_INFO(r8)
132ea4a1da9b2e6f419526b5fde15cd5563096368ebAl Viro	ld	r0, R0(r8)
133ea4a1da9b2e6f419526b5fde15cd5563096368ebAl Viro	ld	r1, R1(r8)
134ea4a1da9b2e6f419526b5fde15cd5563096368ebAl Viro	jl	r1
135ea4a1da9b2e6f419526b5fde15cd5563096368ebAl Viro	bra	syscall_exit
136ea4a1da9b2e6f419526b5fde15cd5563096368ebAl Viro
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(ret_from_fork)
1384127272c38619c56f0c1aa01d01c7bd757db70a1Hirokazu Takata	pop	r0
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	schedule_tail
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	GET_THREAD_INFO(r8)
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	syscall_exit
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Return to user mode is not as complex as all this looks,
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but we want the default path for a system call return to
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * go as quickly as possible which is why some of this is
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * less clear than it otherwise should be.
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	; userspace resumption stub bypassing syscall exit tracing
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ALIGN
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsret_from_exception:
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	preempt_stop(r4)
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsret_from_intr:
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r4, PSW(sp)
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_ISA_M32R2
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r4, #0x8800		; check BSM and BPM bits
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r4, #0x8000		; check BSM bit
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r4, resume_kernel
16281e4807303c416a0defdce8b23a6204416d33280Adrian Bunkresume_userspace:
1637071b2914a540b43dfcad17f6892a8c115799d50Hirokazu Takata	DISABLE_INTERRUPTS(r4)		; make sure we don't miss an interrupt
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; setting need_resched or sigpending
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; between sampling and the iret
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	GET_THREAD_INFO(r8)
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r9, @(TI_FLAGS, r8)
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r9, #_TIF_WORK_MASK	; is there any work to be done on
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; int/exception return?
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bnez	r4, work_pending
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	restore_all
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PREEMPT
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(resume_kernel)
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	GET_THREAD_INFO(r8)
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r9, @(TI_PRE_COUNT, r8)	; non-zero preempt_count ?
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bnez	r9, restore_all
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsneed_resched:
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r9, @(TI_FLAGS, r8)	; need_resched set ?
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r9, #_TIF_NEED_RESCHED
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r4, restore_all
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r4, PSW(sp)		; interrupts off (exception path) ?
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r4, #0x4000
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r4, restore_all
185650e4dc2a75959fdca1eecc0147bbb21dbfadf0fThomas Gleixner	bl	preempt_schedule_irq
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	need_resched
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	; system call handler stub
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(system_call)
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SWITCH_TO_KERNEL_STACK
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SAVE_ALL
1937071b2914a540b43dfcad17f6892a8c115799d50Hirokazu Takata	ENABLE_INTERRUPTS(r4)		; Enable interrupt
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st	sp, PTREGS(sp)		; implicit pt_regs parameter
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cmpui	r7, #NR_syscalls
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bnc	syscall_badsys
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st	r7, SYSCALL_NR(sp)	; syscall_nr
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; system call tracing in operation
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	GET_THREAD_INFO(r8)
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r9, @(TI_FLAGS, r8)
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r9, #_TIF_SYSCALL_TRACE
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bnez	r4, syscall_trace_entry
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssyscall_call:
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	slli	r7, #2			; table jump for the system call
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	LDIMM	(r4, sys_call_table)
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	add	r7, r4
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r7, @r7
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	jl	r7			; execute system call
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st	r0, R0(sp)		; save the return value
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssyscall_exit:
2117071b2914a540b43dfcad17f6892a8c115799d50Hirokazu Takata	DISABLE_INTERRUPTS(r4)		; make sure we don't miss an interrupt
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; setting need_resched or sigpending
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; between sampling and the iret
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r9, @(TI_FLAGS, r8)
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r9, #_TIF_ALLWORK_MASK	; current->work
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bnez	r4, syscall_exit_work
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsrestore_all:
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RESTORE_ALL
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	# perform work that needs to be done immediately before resumption
2218e8ff02c0b61d9b7c15c7996a2eddbedf51a105bHirokazu Takata	# r9 : flags
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ALIGN
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswork_pending:
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r9, #_TIF_NEED_RESCHED
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r4, work_notifysig
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswork_resched:
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	schedule
2287071b2914a540b43dfcad17f6892a8c115799d50Hirokazu Takata	DISABLE_INTERRUPTS(r4)		; make sure we don't miss an interrupt
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; setting need_resched or sigpending
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; between sampling and the iret
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r9, @(TI_FLAGS, r8)
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r9, #_TIF_WORK_MASK	; is there any work to be done other
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; than syscall tracing?
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r4, restore_all
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r4, #_TIF_NEED_RESCHED
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bnez	r4, work_resched
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswork_notifysig:				; deal with pending signals and
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; notify-resume requests
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, sp			; arg1 : struct pt_regs *regs
241a748102430f4dbbfca3ff81ac12db6e4f1243677Al Viro	mv	r1, r9			; arg2 : __u32 thread_info_flags
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_notify_resume
243a748102430f4dbbfca3ff81ac12db6e4f1243677Al Viro	bra	resume_userspace
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	; perform syscall exit tracing
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ALIGN
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssyscall_trace_entry:
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ldi	r4, #-ENOSYS
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st	r4, R0(sp)
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_syscall_trace
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r0, ORIG_R0(sp)
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r1, R1(sp)
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r2, R2(sp)
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r3, R3(sp)
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r4, R4(sp)
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r5, R5(sp)
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r6, R6(sp)
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r7, SYSCALL_NR(sp)
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cmpui	r7, #NR_syscalls
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bc	syscall_call
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	syscall_exit
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	; perform syscall exit tracing
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ALIGN
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssyscall_exit_work:
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r9, @(TI_FLAGS, r8)
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r4, r9, #_TIF_SYSCALL_TRACE
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r4, work_pending
2697071b2914a540b43dfcad17f6892a8c115799d50Hirokazu Takata	ENABLE_INTERRUPTS(r4)		; could let do_syscall_trace() call
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					; schedule() instead
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_syscall_trace
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	resume_userspace
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ALIGN
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssyscall_fault:
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SAVE_ALL
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	GET_THREAD_INFO(r8)
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ldi	r4, #-EFAULT
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st	r4, R0(sp)
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	resume_userspace
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ALIGN
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssyscall_badsys:
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ldi	r4, #-ENOSYS
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st	r4, R0(sp)
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	resume_userspace
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.global	eit_vector
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.equ ei_vec_table, eit_vector + 0x0200
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * EI handler routine
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(ei_handler)
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_CHIP_M32700)
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	; WORKAROUND: force to clear SM bit and use the kernel stack (SPI).
2985171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	SWITCH_TO_KERNEL_STACK
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SAVE_ALL
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r1, sp			; arg1(regs)
302de2232edb8d82aca938570eb6f136e2d70a26418Hirokazu Takata	; get ICU status
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seth	r0, #shigh(M32R_ICU_ISTS_ADDR)
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r0, @(low(M32R_ICU_ISTS_ADDR),r0)
3054127272c38619c56f0c1aa01d01c7bd757db70a1Hirokazu Takata	push	r0
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_SMP)
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * If IRQ == 0      --> Nothing to do,  Not write IMASK
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * If IRQ == IPI    --> Do IPI handler, Not write IMASK
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * If IRQ != 0, IPI --> Do do_IRQ(),    Write IMASK
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	slli	r0, #4
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	srli	r0, #24			; r0(irq_num<<2)
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	;; IRQ exist check
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_CHIP_M32700)
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* WORKAROUND: IMASK bug M32700-TS1, TS2 chip. */
3175171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	bnez	r0, 0f
3185171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	ld24	r14, #0x00070000
3195171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	seth	r0, #shigh(M32R_ICU_IMASK_ADDR)
3205171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	st	r14, @(low(M32R_ICU_IMASK_ADDR),r0)
3215171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	bra	1f
3225171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	.fillinsn
3235171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata0:
3245171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#endif /* CONFIG_CHIP_M32700 */
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r0, 1f			; if (!irq_num) goto exit
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	;; IPI check
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cmpi	r0, #(M32R_IRQ_IPI0<<2)	; ISN < IPI0 check
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bc	2f
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cmpi	r0, #((M32R_IRQ_IPI7+1)<<2)	; ISN > IPI7 check
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bnc	2f
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	LDIMM	(r2, ei_vec_table)
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	add	r2, r0
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r2, @r2
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r2, 1f			; if (no IPI handler) goto exit
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, r1			; arg0(regs)
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	jl	r2
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.fillinsn
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds1:
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	addi	sp, #4
340abd0a782359717ded8f663bc5b8e5e9e3cc4f5e7Hirokazu Takata	bra	restore_all
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.fillinsn
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds2:
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	srli	r0, #2
3445171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#else /* not CONFIG_SMP */
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	srli	r0, #22			; r0(irq)
3465171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#endif /* not CONFIG_SMP */
3475171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata
3485171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#if defined(CONFIG_PLAT_HAS_INT1ICU)
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	add3	r2, r0, #-(M32R_IRQ_INT1)	; INT1# interrupt
3505171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	bnez	r2, 3f
3515171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	seth	r0, #shigh(M32R_INT1ICU_ISTS)
3525171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	lduh	r0, @(low(M32R_INT1ICU_ISTS),r0)	; bit10-6 : ISN
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	slli	r0, #21
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	srli	r0, #27				; ISN
3555171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	addi	r0, #(M32R_INT1ICU_IRQ_BASE)
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	check_end
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.fillinsn
3585171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata3:
3595171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#endif /* CONFIG_PLAT_HAS_INT1ICU */
3605171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#if defined(CONFIG_PLAT_HAS_INT0ICU)
3615171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	add3	r2, r0, #-(M32R_IRQ_INT0)	; INT0# interrupt
3625171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	bnez	r2, 4f
3635171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	seth	r0, #shigh(M32R_INT0ICU_ISTS)
3645171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	lduh	r0, @(low(M32R_INT0ICU_ISTS),r0)	; bit10-6 : ISN
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	slli	r0, #21
3665171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	srli	r0, #27				; ISN
36733205613cd603fa4d80bb81464e60b909b7047e1Hirokazu Takata	add3	r0, r0, #(M32R_INT0ICU_IRQ_BASE)
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	check_end
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.fillinsn
3705171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata4:
3715171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#endif /* CONFIG_PLAT_HAS_INT0ICU */
3725171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#if defined(CONFIG_PLAT_HAS_INT2ICU)
3735171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	add3	r2, r0, #-(M32R_IRQ_INT2)	; INT2# interrupt
3745171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	bnez	r2, 5f
3755171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	seth	r0, #shigh(M32R_INT2ICU_ISTS)
3765171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	lduh	r0, @(low(M32R_INT2ICU_ISTS),r0)	; bit10-6 : ISN
3779287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takata	slli	r0, #21
3785171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	srli	r0, #27				; ISN
37933205613cd603fa4d80bb81464e60b909b7047e1Hirokazu Takata	add3	r0, r0, #(M32R_INT2ICU_IRQ_BASE)
3805171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata	; bra	check_end
3819287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takata	.fillinsn
3825171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata5:
3835171b100511513bc52875055f7d900fc3f7c922bHirokazu Takata#endif /* CONFIG_PLAT_HAS_INT2ICU */
384de2232edb8d82aca938570eb6f136e2d70a26418Hirokazu Takata
3859287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takatacheck_end:
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_IRQ
3874127272c38619c56f0c1aa01d01c7bd757db70a1Hirokazu Takata	pop	r14
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seth	r0, #shigh(M32R_ICU_IMASK_ADDR)
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st	r14, @(low(M32R_ICU_IMASK_ADDR),r0)
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra  ret_from_intr
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default EIT handler
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ALIGN
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint_msg:
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.asciz  "Unknown interrupt\n"
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.byte	0
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(default_eit_handler)
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r0
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mvfc	r0, psw
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r1
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r2
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r3
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r0
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	LDIMM	(r0, __KERNEL_DS)
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, r1
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, r2
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	LDIMM	(r0, int_msg)
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	printk
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r0
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r3
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r2
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r1
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mvtc	r0, psw
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r0
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsinfinit:
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	infinit
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Access Exception handler
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(ace_handler)
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SWITCH_TO_KERNEL_STACK
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SAVE_ALL
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seth	r2, #shigh(MMU_REG_BASE)	/* Check status register */
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r4, @(low(MESTS_offset),r2)
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st	r4, @(low(MESTS_offset),r2)
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	srl3	r1, r4, #4
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_CHIP_M32700
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r1, r1, #0x0000ffff
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	; WORKAROUND: ignore TME bit for the M32700(TS1).
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_CHIP_M32700 */
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	beqz	r1, inst
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsoprand:
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ld	r2, @(low(MDEVA_offset),r2)	; set address
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	srli	r1, #1
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	1f
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsinst:
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r1, r4, #2
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	srli	r1, #1
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	or3	r1, r1, #8
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mvfc	r2, bpc				; set address
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.fillinsn
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds1:
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mvfc	r3, psw
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, sp
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	and3	r3, r3, 0x800
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	srli	r3, #9
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	or	r1, r3
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * do_page_fault():
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    r0 : struct pt_regs *regs
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    r1 : unsigned long error-code
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    r2 : unsigned long address
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * error-code:
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    +------+------+------+------+
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    | bit3 | bit2 | bit1 | bit0 |
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    +------+------+------+------+
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    bit 3 == 0:means data,          1:means instruction
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    bit 2 == 0:means kernel,        1:means user-mode
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    bit 1 == 0:means read,          1:means write
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    bit 0 == 0:means no page found  1:means protection fault
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_page_fault
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	ret_from_intr
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif  /* CONFIG_MMU */
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(alignment_check)
475de2232edb8d82aca938570eb6f136e2d70a26418Hirokazu Takata	/* void alignment_check(int error_code) */
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SWITCH_TO_KERNEL_STACK
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SAVE_ALL
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ldi	r1, #0x30			; error_code
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, sp				; pt_regs
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_alignment_check
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldserror_code:
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	ret_from_exception
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(rie_handler)
485de2232edb8d82aca938570eb6f136e2d70a26418Hirokazu Takata	/* void rie_handler(int error_code) */
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SWITCH_TO_KERNEL_STACK
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SAVE_ALL
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ldi	r1, #0x20			; error_code
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, sp				; pt_regs
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_rie_handler
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	error_code
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(pie_handler)
494de2232edb8d82aca938570eb6f136e2d70a26418Hirokazu Takata	/* void pie_handler(int error_code) */
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SWITCH_TO_KERNEL_STACK
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SAVE_ALL
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ldi	r1, #0				; error_code ; FIXME
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, sp				; pt_regs
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_pie_handler
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	error_code
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(debug_trap)
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* void debug_trap(void) */
504de2232edb8d82aca938570eb6f136e2d70a26418Hirokazu Takata	.global	withdraw_debug_trap
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SWITCH_TO_KERNEL_STACK
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SAVE_ALL
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, sp				; pt_regs
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	withdraw_debug_trap
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ldi	r1, #0				; error_code
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mv	r0, sp				; pt_regs
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	do_debug_trap
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bra	error_code
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5149de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu TakataENTRY(ill_trap)
5159de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu Takata	/* void ill_trap(void) */
5169de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu Takata	SWITCH_TO_KERNEL_STACK
5179de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu Takata	SAVE_ALL
5189de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu Takata	ldi	r1, #0				; error_code ; FIXME
5199de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu Takata	mv	r0, sp				; pt_regs
5209de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu Takata	bl	do_ill_trap
5219de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu Takata	bra	error_code
5229de11aab1c8fd87da7e1fb435ce0ff26bacd7909Hirokazu Takata
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsENTRY(cache_flushing_handler)
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* void _flush_cache_all(void); */
525de2232edb8d82aca938570eb6f136e2d70a26418Hirokazu Takata	.global	_flush_cache_all
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SWITCH_TO_KERNEL_STACK
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r0
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r1
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r2
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r3
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r4
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r5
5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r6
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	r7
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	push	lr
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bl	_flush_cache_all
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	lr
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r7
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r6
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r5
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r4
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r3
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r2
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r1
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pop	r0
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	rte
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5489990b48a403fa465b4ff600cd8a7b5108d1bc135Hirokazu Takata	.section .rodata,"a"
5499990b48a403fa465b4ff600cd8a7b5108d1bc135Hirokazu Takata#include "syscall_table.S"
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssyscall_table_size=(.-sys_call_table)
552