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