entry.s
来自「linux-2.4.29操作系统的源码」· S 代码 · 共 2,106 行 · 第 1/4 页
S
2,106 行
/* * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * arch/sh64/kernel/entry.S * * Copyright (C) 2000, 2001 Paolo Alberelli * */#include <linux/config.h>#include <linux/errno.h>#include <linux/sys.h>#include <asm/processor.h>#include <asm/registers.h>#include <asm/unistd.h>/* * A few defines that ought to come from sched.h referring * to the task structure. Byte offsets within the task * structure and related flags. */#define flags 4#define sigpending 8#define need_resched 20#define ptrace 24#define PT_TRACESYS 0x00000002/* * SR fields. */#define SR_ASID_MASK 0x00ff0000#define SR_FD_MASK 0x00008000#define SR_SS 0x08000000#define SR_BL 0x10000000#define SR_MD 0x40000000#define SR_MMU 0x80000000/* * Event code. */#define EVENT_INTERRUPT 0#define EVENT_FAULT_TLB 1#define EVENT_FAULT_NOT_TLB 2#define EVENT_DEBUG 3/* EXPEVT values */#define RESET_CAUSE 0x20#define DEBUGSS_CAUSE 0x980/* * Frame layout. Quad index. */#define FRAME_T(x) FRAME_TBASE+(x*8)#define FRAME_R(x) FRAME_RBASE+(x*8)#define FRAME_S(x) FRAME_SBASE+(x*8)#define FSPC 0#define FSSR 1#define FSYSCALL_ID 2/* Arrange the save frame to be a multiple of 32 bytes long */#define FRAME_SBASE 0#define FRAME_RBASE (FRAME_SBASE+(3*8)) /* SYSCALL_ID - SSR - SPC */#define FRAME_TBASE (FRAME_RBASE+(63*8)) /* r0 - r62 */#define FRAME_PBASE (FRAME_TBASE+(8*8)) /* t0 -t7 */#define FRAME_SIZE (FRAME_PBASE+(2*8)) /* pad0-pad1 */#define FP_FRAME_SIZE FP_FRAME_BASE+(33*8) /* dr0 - dr31 + fpscr */#define FP_FRAME_BASE 0#define SAVED_R2 0*8#define SAVED_R3 1*8#define SAVED_R4 2*8#define SAVED_R5 3*8#define SAVED_R18 4*8#define SAVED_R6 5*8#define SAVED_T0 6*8/* These are the registers saved in the TLB path that aren't saved in the first level of the normal one. */#define TLB_SAVED_R25 7*8#define TLB_SAVED_T1 8*8#define TLB_SAVED_T2 9*8#define TLB_SAVED_T3 10*8#define TLB_SAVED_T4 11*8/* Save R0/R1 : PT-migrating compiler currently dishounours -ffixed-r0 and -ffixed-r1 causing breakage otherwise. */#define TLB_SAVED_R0 12*8#define TLB_SAVED_R1 13*8#define STI() \ getcon SR, r6; \ andi r6, ~0xf0, r6; \ putcon r6, SR; .section .data, "aw"#define FAST_TLBMISS_STACK_CACHELINES 4#define FAST_TLBMISS_STACK_QUADWORDS (4*FAST_TLBMISS_STACK_CACHELINES)/* Register back-up area for all exceptions */ .balign 32 /* Allow for 16 quadwords to be pushed by fast tlbmiss handling * register saves etc. */ .fill FAST_TLBMISS_STACK_QUADWORDS, 8, 0x0/* This is 32 byte aligned by construction *//* Register back-up area for all exceptions */reg_save_area: .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .quad 0/* Save area for RESVEC exceptions. We cannot use reg_save_area because of * reentrancy. Note this area may be accessed via physical address. * Align so this fits a whole single cache line, for ease of purging. */ .balign 32,0,32resvec_save_area: .quad 0 .quad 0 .quad 0 .quad 0 .quad 0 .balign 32,0,32/* Jump table of 3rd level handlers */trap_jtable: .long do_exception_error /* 0x000 */ .long do_exception_error /* 0x020 */ .long tlb_miss_load /* 0x040 */ .long tlb_miss_store /* 0x060 */ .long do_exception_error /* 0x080 */ .long tlb_miss_load /* 0x0A0 */ .long tlb_miss_store /* 0x0C0 */ .long do_address_error_load /* 0x0E0 */ .long do_address_error_store /* 0x100 */#ifndef CONFIG_NOFPU_SUPPORT .long do_fpu_error /* 0x120 */#else .long do_exception_error /* 0x120 */#endif .long do_exception_error /* 0x140 */ .long system_call /* 0x160 */ .long do_reserved_inst /* 0x180 */ .long do_illegal_slot_inst /* 0x1A0 */ .long do_NMI /* 0x1C0 */ .long do_exception_error /* 0x1E0 */ .rept 15 .long do_IRQ /* 0x200 - 0x3C0 */ .endr .long do_exception_error /* 0x3E0 */ .rept 32 .long do_IRQ /* 0x400 - 0x7E0 */ .endr .long fpu_error_or_IRQA /* 0x800 */ .long fpu_error_or_IRQB /* 0x820 */ .long do_IRQ /* 0x840 */ .long do_IRQ /* 0x860 */ .rept 6 .long do_exception_error /* 0x880 - 0x920 */ .endr .long do_software_break_point /* 0x940 */ .long do_exception_error /* 0x960 */ .long do_single_step /* 0x980 */ .rept 3 .long do_exception_error /* 0x9A0 - 0x9E0 */ .endr .long do_IRQ /* 0xA00 */ .long do_IRQ /* 0xA20 */ .long itlb_miss_or_IRQ /* 0xA40 */ .long do_IRQ /* 0xA60 */ .long do_IRQ /* 0xA80 */ .long itlb_miss_or_IRQ /* 0xAA0 */ .long do_exception_error /* 0xAC0 */ .long do_address_error_exec /* 0xAE0 */ .rept 8 .long do_exception_error /* 0xB00 - 0xBE0 */ .endr .rept 18 .long do_IRQ /* 0xC00 - 0xE20 */ .endr/* System calls jump table */.globl sys_call_tablesys_call_table: .long sys_ni_syscall /* 0 - old "setup()" system call */ .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 /* 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_ni_syscall /* sys_oldselect */ .long sys_symlink .long sys_lstat .long sys_readlink /* 85 */ .long sys_uselib .long sys_swapon .long sys_reboot .long 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 /* Obsolete implementation of socket syscall */ .long sys_syslog .long sys_setitimer .long sys_getitimer /* 105 */ .long sys_newstat .long sys_newlstat .long sys_newfstat .long sys_uname .long sys_ni_syscall /* 110 */ /* iopl */ .long sys_vhangup .long sys_ni_syscall /* idle */ .long sys_ni_syscall /* vm86old */ .long sys_wait4 .long sys_swapoff /* 115 */ .long sys_sysinfo .long sys_ipc /* Obsolete ipc syscall implementation */ .long sys_fsync .long sys_sigreturn .long sys_clone /* 120 */ .long sys_setdomainname .long sys_newuname .long sys_ni_syscall /* sys_modify_ldt */ .long sys_adjtimex .long sys_mprotect /* 125 */ .long sys_sigprocmask .long sys_create_module .long sys_init_module .long sys_delete_module .long sys_get_kernel_syms /* 130 */ .long sys_quotactl .long sys_getpgid .long sys_fchdir .long sys_bdflush .long sys_sysfs /* 135 */ .long sys_personality .long sys_ni_syscall /* 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_query_module .long sys_poll .long sys_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_pread /* 180 */ .long sys_pwrite .long sys_chown16 .long sys_getcwd .long sys_capget .long sys_capset /* 185 */ .long sys_sigaltstack .long sys_sendfile .long sys_ni_syscall /* streams1 */ .long sys_ni_syscall /* streams2 */ .long sys_vfork /* 190 */ .long sys_getrlimit .long sys_mmap2 .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_socket /* 220 */ .long sys_bind .long sys_connect .long sys_listen .long sys_accept .long sys_getsockname /* 225 */ .long sys_getpeername .long sys_socketpair .long sys_send .long sys_sendto .long sys_recv /* 230*/ .long sys_recvfrom .long sys_shutdown .long sys_setsockopt .long sys_getsockopt .long sys_sendmsg /* 235 */ .long sys_recvmsg .long sys_semop /* New ipc syscall implementation */ .long sys_semget .long sys_semctl .long sys_msgsnd /* 240 */ .long sys_msgrcv .long sys_msgget .long sys_msgctl .long sys_shmatcall .long sys_shmdt /* 245 */ .long sys_shmget .long sys_shmctl /* * NOTE!! This doesn't have to be exact - we just have * to make sure we have _enough_ of the "sys_ni_syscall" * entries. Don't panic if you notice that this hasn't * been shrunk every time we add a new system call. */ .rept NR_syscalls-247 .long sys_ni_syscall .endr .section .text64, "ax"/* * --- Exception/Interrupt/Event Handling Section *//* * VBR and RESVEC blocks. * * First level handler for VBR-based exceptions. * * To avoid waste of space, align to the maximum text block size. * This is assumed to be at most 128 bytes or 32 instructions. * DO NOT EXCEED 32 instructions on the first level handlers ! * * Also note that RESVEC is contained within the VBR block * where the room left (1KB - TEXT_SIZE) allows placing * the RESVEC block (at most 512B + TEXT_SIZE). * * So first (and only) level handler for RESVEC-based exceptions. * * Where the fault/interrupt is handled (not_a_tlb_miss, tlb_miss * and interrupt) we are a lot tight with register space until * saving onto the stack frame, which is done in handle_exception(). * */#define TEXT_SIZE 128#define BLOCK_SIZE 1664 /* Dynamic check, 13*128 */ .balign TEXT_SIZELVBR_block: .space 256, 0 /* Power-on class handler, */ /* not required here */not_a_tlb_miss: /* Save original stack pointer into KCR1 */ putcon SP, KCR1 /* Save other original registers into reg_save_area */ _loada reg_save_area, SP st.q SP, SAVED_R2, r2 st.q SP, SAVED_R3, r3 st.q SP, SAVED_R4, r4 st.q SP, SAVED_R5, r5 st.q SP, SAVED_R6, r6 st.q SP, SAVED_R18, r18 gettr t0, r3 st.q SP, SAVED_T0, r3#ifdef CONFIG_SH64_PAGE_TABLE_AUDIT /* This use of DCR is not really legal, but there's nowhere else convenient to store this and it's only for last-resort debug anyway. */ movi 0x100, r3 putcon r3, dcr#endif /* Set args for Non-debug, Not a TLB miss class handler */ getcon EXPEVT, r2 _loada ret_from_exception, r3 ori r3, 1, r3 movi EVENT_FAULT_NOT_TLB, r4 or SP, ZERO, r5
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?