diff options
Diffstat (limited to 'arch/mn10300/kernel/entry.S')
-rw-r--r-- | arch/mn10300/kernel/entry.S | 772 |
1 files changed, 0 insertions, 772 deletions
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S deleted file mode 100644 index 177d61de51c9..000000000000 --- a/arch/mn10300/kernel/entry.S +++ /dev/null @@ -1,772 +0,0 @@ -############################################################################### -# -# MN10300 Exception and interrupt entry points -# -# Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. -# Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. -# Modified by David Howells (dhowells@redhat.com) -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public Licence -# as published by the Free Software Foundation; either version -# 2 of the Licence, or (at your option) any later version. -# -############################################################################### -#include <linux/sys.h> -#include <linux/linkage.h> -#include <asm/smp.h> -#include <asm/irqflags.h> -#include <asm/thread_info.h> -#include <asm/intctl-regs.h> -#include <asm/busctl-regs.h> -#include <asm/timer-regs.h> -#include <unit/leds.h> -#include <asm/page.h> -#include <asm/pgtable.h> -#include <asm/errno.h> -#include <asm/asm-offsets.h> -#include <asm/frame.inc> - -#if defined(CONFIG_SMP) && defined(CONFIG_GDBSTUB) -#include <asm/gdb-stub.h> -#endif /* CONFIG_SMP && CONFIG_GDBSTUB */ - -#ifdef CONFIG_PREEMPT -#define preempt_stop LOCAL_IRQ_DISABLE -#else -#define preempt_stop -#define resume_kernel restore_all -#endif - - .am33_2 - -############################################################################### -# -# the return path for a forked child -# - on entry, D0 holds the address of the previous task to run -# -############################################################################### -ENTRY(ret_from_fork) - call schedule_tail[],0 - GET_THREAD_INFO a2 - - # return 0 to indicate child process - clr d0 - mov d0,(REG_D0,fp) - jmp syscall_exit - -ENTRY(ret_from_kernel_thread) - call schedule_tail[],0 - mov (REG_D0,fp),d0 - mov (REG_A0,fp),a0 - calls (a0) - GET_THREAD_INFO a2 # A2 must be set on return from sys_exit() - clr d0 - mov d0,(REG_D0,fp) - jmp syscall_exit - -############################################################################### -# -# system call handler -# -############################################################################### -ENTRY(system_call) - add -4,sp - SAVE_ALL - mov d0,(REG_ORIG_D0,fp) - GET_THREAD_INFO a2 - cmp nr_syscalls,d0 - bcc syscall_badsys - btst _TIF_SYSCALL_TRACE,(TI_flags,a2) - bne syscall_entry_trace -syscall_call: - add d0,d0,a1 - add a1,a1 - mov (REG_A0,fp),d0 - mov (sys_call_table,a1),a0 - calls (a0) - mov d0,(REG_D0,fp) -syscall_exit: - # make sure we don't miss an interrupt setting need_resched or - # sigpending between sampling and the rti - LOCAL_IRQ_DISABLE - mov (TI_flags,a2),d2 - btst _TIF_ALLWORK_MASK,d2 - bne syscall_exit_work -restore_all: - RESTORE_ALL - -############################################################################### -# -# perform work that needs to be done immediately before resumption and syscall -# tracing -# -############################################################################### - ALIGN -syscall_exit_work: - mov (REG_EPSW,fp),d0 - and EPSW_nSL,d0 - beq resume_kernel # returning to supervisor mode - - LOCAL_IRQ_ENABLE # could let syscall_trace_exit() call - # schedule() instead - btst _TIF_SYSCALL_TRACE,d2 - beq work_pending - mov fp,d0 - call syscall_trace_exit[],0 # do_syscall_trace(regs) - jmp resume_userspace - - ALIGN -work_pending: - btst _TIF_NEED_RESCHED,d2 - beq work_notifysig - -work_resched: - call schedule[],0 - -resume_userspace: - # make sure we don't miss an interrupt setting need_resched or - # sigpending between sampling and the rti - LOCAL_IRQ_DISABLE - - # is there any work to be done other than syscall tracing? - mov (TI_flags,a2),d2 - btst _TIF_WORK_MASK,d2 - beq restore_all - - LOCAL_IRQ_ENABLE - btst _TIF_NEED_RESCHED,d2 - bne work_resched - - # deal with pending signals and notify-resume requests -work_notifysig: - mov fp,d0 - mov d2,d1 - call do_notify_resume[],0 - jmp resume_userspace - - # perform syscall entry tracing -syscall_entry_trace: - mov -ENOSYS,d0 - mov d0,(REG_D0,fp) - mov fp,d0 - call syscall_trace_entry[],0 # returns the syscall number to actually use - mov (REG_D1,fp),d1 - cmp nr_syscalls,d0 - bcs syscall_call - jmp syscall_exit - -syscall_badsys: - mov -ENOSYS,d0 - mov d0,(REG_D0,fp) - jmp resume_userspace - - # userspace resumption stub bypassing syscall exit tracing - .globl ret_from_exception, ret_from_intr - ALIGN -ret_from_exception: - preempt_stop -ret_from_intr: - GET_THREAD_INFO a2 - mov (REG_EPSW,fp),d0 # need to deliver signals before - # returning to userspace - and EPSW_nSL,d0 - bne resume_userspace # returning to userspace - -#ifdef CONFIG_PREEMPT -resume_kernel: - LOCAL_IRQ_DISABLE - mov (TI_preempt_count,a2),d0 # non-zero preempt_count ? - cmp 0,d0 - bne restore_all - -need_resched: - btst _TIF_NEED_RESCHED,(TI_flags,a2) - beq restore_all - mov (REG_EPSW,fp),d0 - and EPSW_IM,d0 - cmp EPSW_IM_7,d0 # interrupts off (exception path) ? - bne restore_all - call preempt_schedule_irq[],0 - jmp need_resched -#else - jmp resume_kernel -#endif - - -############################################################################### -# -# IRQ handler entry point -# - intended to be entered at multiple priorities -# -############################################################################### -ENTRY(irq_handler) - add -4,sp - SAVE_ALL - - # it's not a syscall - mov 0xffffffff,d0 - mov d0,(REG_ORIG_D0,fp) - - mov fp,d0 - call do_IRQ[],0 # do_IRQ(regs) - - jmp ret_from_intr - -############################################################################### -# -# Double Fault handler entry point -# - note that there will not be a stack, D0/A0 will hold EPSW/PC as were -# -############################################################################### - .section .bss - .balign THREAD_SIZE - .space THREAD_SIZE -__df_stack: - .previous - -ENTRY(double_fault) - mov a0,(__df_stack-4) # PC as was - mov d0,(__df_stack-8) # EPSW as was - mn10300_set_dbfleds # display 'db-f' on the LEDs - mov 0xaa55aa55,d0 - mov d0,(__df_stack-12) # no ORIG_D0 - mov sp,a0 # save corrupted SP - mov __df_stack-12,sp # emergency supervisor stack - SAVE_ALL - mov a0,(REG_A0,fp) # save corrupted SP as A0 (which got - # clobbered by the CPU) - mov fp,d0 - calls do_double_fault -double_fault_loop: - bra double_fault_loop - -############################################################################### -# -# Bus Error handler entry point -# - handle external (async) bus errors separately -# -############################################################################### -ENTRY(raw_bus_error) - add -4,sp - mov d0,(sp) -#if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) - mov (MMUCTR),d0 - mov d0,(MMUCTR) -#endif - mov (BCBERR),d0 # what - btst BCBERR_BEMR_DMA,d0 # see if it was an external bus error - beq __common_exception_aux # it wasn't - - SAVE_ALL - mov (BCBEAR),d1 # destination of erroneous access - - mov (REG_ORIG_D0,fp),d2 - mov d2,(REG_D0,fp) - mov -1,d2 - mov d2,(REG_ORIG_D0,fp) - - add -4,sp - mov fp,(12,sp) # frame pointer - call io_bus_error[],0 - jmp restore_all - -############################################################################### -# -# NMI exception entry points -# -# This is used by ordinary interrupt channels that have the GxICR_NMI bit set -# in addition to the main NMI and Watchdog channels. SMP NMI IPIs use this -# facility. -# -############################################################################### -ENTRY(nmi_handler) - add -4,sp - mov d0,(sp) - mov (TBR),d0 - -#ifdef CONFIG_SMP - add -4,sp - mov d0,(sp) # save d0(TBR) - movhu (NMIAGR),d0 - and NMIAGR_GN,d0 - lsr 0x2,d0 - cmp CALL_FUNCTION_NMI_IPI,d0 - bne nmi_not_smp_callfunc # if not call function, jump - - # function call nmi ipi - add 4,sp # no need to store TBR - mov GxICR_DETECT,d0 # clear NMI request - movbu d0,(GxICR(CALL_FUNCTION_NMI_IPI)) - movhu (GxICR(CALL_FUNCTION_NMI_IPI)),d0 - and ~EPSW_NMID,epsw # enable NMI - - mov (sp),d0 # restore d0 - SAVE_ALL - call smp_nmi_call_function_interrupt[],0 - RESTORE_ALL - -nmi_not_smp_callfunc: -#ifdef CONFIG_KERNEL_DEBUGGER - cmp DEBUGGER_NMI_IPI,d0 - bne nmi_not_debugger # if not kernel debugger NMI IPI, jump - - # kernel debugger NMI IPI - add 4,sp # no need to store TBR - mov GxICR_DETECT,d0 # clear NMI - movbu d0,(GxICR(DEBUGGER_NMI_IPI)) - movhu (GxICR(DEBUGGER_NMI_IPI)),d0 - and ~EPSW_NMID,epsw # enable NMI - - mov (sp),d0 - SAVE_ALL - mov fp,d0 # arg 0: stacked register file - mov a2,d1 # arg 1: exception number - call debugger_nmi_interrupt[],0 - RESTORE_ALL - -nmi_not_debugger: -#endif /* CONFIG_KERNEL_DEBUGGER */ - mov (sp),d0 # restore TBR to d0 - add 4,sp -#endif /* CONFIG_SMP */ - - bra __common_exception_nonmi - -############################################################################### -# -# General exception entry point -# -############################################################################### -ENTRY(__common_exception) - add -4,sp - mov d0,(sp) -#if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) - mov (MMUCTR),d0 - mov d0,(MMUCTR) -#endif - -__common_exception_aux: - mov (TBR),d0 - and ~EPSW_NMID,epsw # turn NMIs back on if not NMI - or EPSW_IE,epsw - -__common_exception_nonmi: - and 0x0000FFFF,d0 # turn the exception code into a vector - # table index - - btst 0x00000007,d0 - bne 1f - cmp 0x00000400,d0 - bge 1f - - SAVE_ALL # build the stack frame - - mov (REG_D0,fp),a2 # get the exception number - mov (REG_ORIG_D0,fp),d0 - mov d0,(REG_D0,fp) - mov -1,d0 - mov d0,(REG_ORIG_D0,fp) - -#ifdef CONFIG_GDBSTUB -#ifdef CONFIG_SMP - call gdbstub_busy_check[],0 - and d0,d0 # check return value - beq 2f -#else /* CONFIG_SMP */ - btst 0x01,(gdbstub_busy) - beq 2f -#endif /* CONFIG_SMP */ - and ~EPSW_IE,epsw - mov fp,d0 - mov a2,d1 - call gdbstub_exception[],0 # gdbstub itself caused an exception - bra restore_all -2: -#endif /* CONFIG_GDBSTUB */ - - mov fp,d0 # arg 0: stacked register file - mov a2,d1 # arg 1: exception number - lsr 1,a2 - - mov (exception_table,a2),a2 - calls (a2) - jmp ret_from_exception - -1: pi # BUG() equivalent - -############################################################################### -# -# Exception handler functions table -# -############################################################################### - .data -ENTRY(exception_table) - .rept 0x400>>1 - .long uninitialised_exception - .endr - .previous - -############################################################################### -# -# Change an entry in the exception table -# - D0 exception code, D1 handler -# -############################################################################### -ENTRY(set_excp_vector) - lsr 1,d0 - add exception_table,d0 - mov d1,(d0) - mov 4,d1 - ret [],0 - -############################################################################### -# -# System call table -# -############################################################################### - .data -ENTRY(sys_call_table) - .long sys_restart_syscall /* 0 */ - .long sys_exit - .long sys_fork - .long sys_read - .long sys_write - .long sys_open /* 5 */ - .long sys_close - .long sys_waitpid - .long sys_creat - .long sys_link - .long sys_unlink /* 10 */ - .long sys_execve - .long sys_chdir - .long sys_time - .long sys_mknod - .long sys_chmod /* 15 */ - .long sys_lchown16 - .long sys_ni_syscall /* old break syscall holder */ - .long sys_stat - .long sys_lseek - .long sys_getpid /* 20 */ - .long sys_mount - .long sys_oldumount - .long sys_setuid16 - .long sys_getuid16 - .long sys_stime /* 25 */ - .long sys_ptrace - .long sys_alarm - .long sys_fstat - .long sys_pause - .long sys_utime /* 30 */ - .long sys_ni_syscall /* old stty syscall holder */ - .long sys_ni_syscall /* old gtty syscall holder */ - .long sys_access - .long sys_nice - .long sys_ni_syscall /* 35 - old ftime syscall holder */ - .long sys_sync - .long sys_kill - .long sys_rename - .long sys_mkdir - .long sys_rmdir /* 40 */ - .long sys_dup - .long sys_pipe - .long sys_times - .long sys_ni_syscall /* old prof syscall holder */ - .long sys_brk /* 45 */ - .long sys_setgid16 - .long sys_getgid16 - .long sys_signal - .long sys_geteuid16 - .long sys_getegid16 /* 50 */ - .long sys_acct - .long sys_umount /* recycled never used phys() */ - .long sys_ni_syscall /* old lock syscall holder */ - .long sys_ioctl - .long sys_fcntl /* 55 */ - .long sys_ni_syscall /* old mpx syscall holder */ - .long sys_setpgid - .long sys_ni_syscall /* old ulimit syscall holder */ - .long sys_ni_syscall /* old sys_olduname */ - .long sys_umask /* 60 */ - .long sys_chroot - .long sys_ustat - .long sys_dup2 - .long sys_getppid - .long sys_getpgrp /* 65 */ - .long sys_setsid - .long sys_sigaction - .long sys_sgetmask - .long sys_ssetmask - .long sys_setreuid16 /* 70 */ - .long sys_setregid16 - .long sys_sigsuspend - .long sys_sigpending - .long sys_sethostname - .long sys_setrlimit /* 75 */ - .long sys_old_getrlimit - .long sys_getrusage - .long sys_gettimeofday - .long sys_settimeofday - .long sys_getgroups16 /* 80 */ - .long sys_setgroups16 - .long sys_old_select - .long sys_symlink - .long sys_lstat - .long sys_readlink /* 85 */ - .long sys_uselib - .long sys_swapon - .long sys_reboot - .long sys_old_readdir - .long old_mmap /* 90 */ - .long sys_munmap - .long sys_truncate - .long sys_ftruncate - .long sys_fchmod - .long sys_fchown16 /* 95 */ - .long sys_getpriority - .long sys_setpriority - .long sys_ni_syscall /* old profil syscall holder */ - .long sys_statfs - .long sys_fstatfs /* 100 */ - .long sys_ni_syscall /* ioperm */ - .long sys_socketcall - .long sys_syslog - .long sys_setitimer - .long sys_getitimer /* 105 */ - .long sys_newstat - .long sys_newlstat - .long sys_newfstat - .long sys_ni_syscall /* old sys_uname */ - .long sys_ni_syscall /* 110 - iopl */ - .long sys_vhangup - .long sys_ni_syscall /* old "idle" system call */ - .long sys_ni_syscall /* vm86old */ - .long sys_wait4 - .long sys_swapoff /* 115 */ - .long sys_sysinfo - .long sys_ipc - .long sys_fsync - .long sys_sigreturn - .long sys_clone /* 120 */ - .long sys_setdomainname - .long sys_newuname - .long sys_ni_syscall /* modify_ldt */ - .long sys_adjtimex - .long sys_mprotect /* 125 */ - .long sys_sigprocmask - .long sys_ni_syscall /* old "create_module" */ - .long sys_init_module - .long sys_delete_module - .long sys_ni_syscall /* 130: old "get_kernel_syms" */ - .long sys_quotactl - .long sys_getpgid - .long sys_fchdir - .long sys_bdflush - .long sys_sysfs /* 135 */ - .long sys_personality - .long sys_ni_syscall /* reserved for afs_syscall */ - .long sys_setfsuid16 - .long sys_setfsgid16 - .long sys_llseek /* 140 */ - .long sys_getdents - .long sys_select - .long sys_flock - .long sys_msync - .long sys_readv /* 145 */ - .long sys_writev - .long sys_getsid - .long sys_fdatasync - .long sys_sysctl - .long sys_mlock /* 150 */ - .long sys_munlock - .long sys_mlockall - .long sys_munlockall - .long sys_sched_setparam - .long sys_sched_getparam /* 155 */ - .long sys_sched_setscheduler - .long sys_sched_getscheduler - .long sys_sched_yield - .long sys_sched_get_priority_max - .long sys_sched_get_priority_min /* 160 */ - .long sys_sched_rr_get_interval - .long sys_nanosleep - .long sys_mremap - .long sys_setresuid16 - .long sys_getresuid16 /* 165 */ - .long sys_ni_syscall /* vm86 */ - .long sys_ni_syscall /* Old sys_query_module */ - .long sys_poll - .long sys_ni_syscall /* was nfsservctl */ - .long sys_setresgid16 /* 170 */ - .long sys_getresgid16 - .long sys_prctl - .long sys_rt_sigreturn - .long sys_rt_sigaction - .long sys_rt_sigprocmask /* 175 */ - .long sys_rt_sigpending - .long sys_rt_sigtimedwait - .long sys_rt_sigqueueinfo - .long sys_rt_sigsuspend - .long sys_pread64 /* 180 */ - .long sys_pwrite64 - .long sys_chown16 - .long sys_getcwd - .long sys_capget - .long sys_capset /* 185 */ - .long sys_sigaltstack - .long sys_sendfile - .long sys_ni_syscall /* reserved for streams1 */ - .long sys_ni_syscall /* reserved for streams2 */ - .long sys_vfork /* 190 */ - .long sys_getrlimit - .long sys_mmap_pgoff - .long sys_truncate64 - .long sys_ftruncate64 - .long sys_stat64 /* 195 */ - .long sys_lstat64 - .long sys_fstat64 - .long sys_lchown - .long sys_getuid - .long sys_getgid /* 200 */ - .long sys_geteuid - .long sys_getegid - .long sys_setreuid - .long sys_setregid - .long sys_getgroups /* 205 */ - .long sys_setgroups - .long sys_fchown - .long sys_setresuid - .long sys_getresuid - .long sys_setresgid /* 210 */ - .long sys_getresgid - .long sys_chown - .long sys_setuid - .long sys_setgid - .long sys_setfsuid /* 215 */ - .long sys_setfsgid - .long sys_pivot_root - .long sys_mincore - .long sys_madvise - .long sys_getdents64 /* 220 */ - .long sys_fcntl64 - .long sys_ni_syscall /* reserved for TUX */ - .long sys_ni_syscall - .long sys_gettid - .long sys_readahead /* 225 */ - .long sys_setxattr - .long sys_lsetxattr - .long sys_fsetxattr - .long sys_getxattr - .long sys_lgetxattr /* 230 */ - .long sys_fgetxattr - .long sys_listxattr - .long sys_llistxattr - .long sys_flistxattr - .long sys_removexattr /* 235 */ - .long sys_lremovexattr - .long sys_fremovexattr - .long sys_tkill - .long sys_sendfile64 - .long sys_futex /* 240 */ - .long sys_sched_setaffinity - .long sys_sched_getaffinity - .long sys_ni_syscall /* sys_set_thread_area */ - .long sys_ni_syscall /* sys_get_thread_area */ - .long sys_io_setup /* 245 */ - .long sys_io_destroy - .long sys_io_getevents - .long sys_io_submit - .long sys_io_cancel - .long sys_fadvise64 /* 250 */ - .long sys_ni_syscall - .long sys_exit_group - .long sys_lookup_dcookie - .long sys_epoll_create - .long sys_epoll_ctl /* 255 */ - .long sys_epoll_wait - .long sys_remap_file_pages - .long sys_set_tid_address - .long sys_timer_create - .long sys_timer_settime /* 260 */ - .long sys_timer_gettime - .long sys_timer_getoverrun - .long sys_timer_delete - .long sys_clock_settime - .long sys_clock_gettime /* 265 */ - .long sys_clock_getres - .long sys_clock_nanosleep - .long sys_statfs64 - .long sys_fstatfs64 - .long sys_tgkill /* 270 */ - .long sys_utimes - .long sys_fadvise64_64 - .long sys_ni_syscall /* sys_vserver */ - .long sys_mbind - .long sys_get_mempolicy /* 275 */ - .long sys_set_mempolicy - .long sys_mq_open - .long sys_mq_unlink - .long sys_mq_timedsend - .long sys_mq_timedreceive /* 280 */ - .long sys_mq_notify - .long sys_mq_getsetattr - .long sys_kexec_load - .long sys_waitid - .long sys_ni_syscall /* 285 */ /* available */ - .long sys_add_key - .long sys_request_key - .long sys_keyctl - .long sys_cacheflush - .long sys_ioprio_set /* 290 */ - .long sys_ioprio_get - .long sys_inotify_init - .long sys_inotify_add_watch - .long sys_inotify_rm_watch - .long sys_migrate_pages /* 295 */ - .long sys_openat - .long sys_mkdirat - .long sys_mknodat - .long sys_fchownat - .long sys_futimesat /* 300 */ - .long sys_fstatat64 - .long sys_unlinkat - .long sys_renameat - .long sys_linkat - .long sys_symlinkat /* 305 */ - .long sys_readlinkat - .long sys_fchmodat - .long sys_faccessat - .long sys_pselect6 - .long sys_ppoll /* 310 */ - .long sys_unshare - .long sys_set_robust_list - .long sys_get_robust_list - .long sys_splice - .long sys_sync_file_range /* 315 */ - .long sys_tee - .long sys_vmsplice - .long sys_move_pages - .long sys_getcpu - .long sys_epoll_pwait /* 320 */ - .long sys_utimensat - .long sys_signalfd - .long sys_timerfd_create - .long sys_eventfd - .long sys_fallocate /* 325 */ - .long sys_timerfd_settime - .long sys_timerfd_gettime - .long sys_signalfd4 - .long sys_eventfd2 - .long sys_epoll_create1 /* 330 */ - .long sys_dup3 - .long sys_pipe2 - .long sys_inotify_init1 - .long sys_preadv - .long sys_pwritev /* 335 */ - .long sys_rt_tgsigqueueinfo - .long sys_perf_event_open - .long sys_recvmmsg - .long sys_setns - - -nr_syscalls=(.-sys_call_table)/4 |