📄 entry.s
字号:
movea PTO, sp, r7; /* User regs are arg2. */ /* Non-maskable interrupts always lie right after maskable interrupts. Call the generic IRQ handler, with two arguments, the IRQ number, and a pointer to the user registers, to handle the specifics. (we subtract one because the first NMI has code 1). */ addi FIRST_NMI - 1, r6, r6; jarl CSYM(handle_irq), lp RETURN(NMI)END(nmi0)/* * Illegal instruction trap. * * The stack-pointer (r3) should have already been saved to the memory * location ENTRY_SP (the reason for this is that the interrupt vectors may be * beyond a 22-bit signed offset jump from the actual interrupt handler, and * this allows them to save the stack-pointer and use that register to do an * indirect jump). */G_ENTRY(illegal_instruction): SAVE_STATE (IRQ, r0, ENTRY_SP) // Save registers. ei addi SIGILL, r0, r6 // Arg 0: signal number mov CURRENT_TASK, r7 // Arg 1: task mov hilo(ret_from_irq), lp // where the handler should return jr CSYM(force_sig)END(illegal_instruction)/* * `Debug' trap * * The stack-pointer (r3) should have already been saved to the memory * location ENTRY_SP (the reason for this is that the interrupt vectors may be * beyond a 22-bit signed offset jump from the actual interrupt handler, and * this allows them to save the stack-pointer and use that register to do an * indirect jump). */G_ENTRY(dbtrap): SAVE_STATE (IRQ, r0, ENTRY_SP) // Save registers. ei movea PTO, sp, r6 // Arg 0: user regs mov hilo(ret_from_irq), lp // where the handler should return jr CSYM(debug_trap)END(dbtrap)/* * Trap with no handler */L_ENTRY(bad_trap_wrapper): mov r19, r6 // Arg 0: trap number movea PTO, sp, r7 // Arg 1: user regs jr CSYM(bad_trap) // tail call handlerEND(bad_trap_wrapper)/* * This is where we switch between two threads. The arguments are: * r6 -- pointer to the struct thread for the `current' process * r7 -- pointer to the struct thread for the `new' process. * when this function returns, it will return to the new thread. */C_ENTRY(switch_thread): // Return the previous task (r10 is not clobbered by restore below) mov CURRENT_TASK, r10 // First, push the current processor state on the stack PUSH_STATE(SWITCH) // Now save the location of the kernel stack pointer for this thread; // since we've pushed all other state on the stack, this is enough to // restore it all later. st.w sp, THREAD_KSP[r6] // Now restore the stack pointer from the new process ld.w THREAD_KSP[r7], sp // ... and restore all state from that POP_STATE(SWITCH) // Update the current task pointer GET_CURRENT_TASK(CURRENT_TASK) // Now return into the new thread jmp [lp]C_END(switch_thread) .data .align 4 .globl CSYM(trap_table)CSYM(trap_table): .long bad_trap_wrapper // trap 0, doesn't use trap table. .long syscall_long // trap 1, `long' syscall. .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .long bad_trap_wrapper .section .rodata .align 4 .globl CSYM(sys_call_table)CSYM(sys_call_table): .long CSYM(sys_ni_syscall) // 0 - old "setup()" system call .long CSYM(sys_exit) .long sys_fork_wrapper .long CSYM(sys_read) .long CSYM(sys_write) .long CSYM(sys_open) // 5 .long CSYM(sys_close) .long CSYM(sys_waitpid) .long CSYM(sys_creat) .long CSYM(sys_link) .long CSYM(sys_unlink) // 10 .long sys_execve_wrapper .long CSYM(sys_chdir) .long CSYM(sys_time) .long CSYM(sys_mknod) .long CSYM(sys_chmod) // 15 .long CSYM(sys_chown16) .long CSYM(sys_ni_syscall) // was: break .long CSYM(sys_ni_syscall) // was: oldstat (aka stat) .long CSYM(sys_lseek) .long CSYM(sys_getpid) // 20 .long CSYM(sys_mount) .long CSYM(sys_oldumount) .long CSYM(sys_setuid16) .long CSYM(sys_getuid16) .long CSYM(sys_stime) // 25 .long CSYM(sys_ptrace) .long CSYM(sys_alarm) .long CSYM(sys_ni_syscall) // was: oldfstat (aka fstat) .long CSYM(sys_pause) .long CSYM(sys_utime) // 30 .long CSYM(sys_ni_syscall) // was: stty .long CSYM(sys_ni_syscall) // was: gtty .long CSYM(sys_access) .long CSYM(sys_nice) .long CSYM(sys_ni_syscall) // 35, was: ftime .long CSYM(sys_sync) .long CSYM(sys_kill) .long CSYM(sys_rename) .long CSYM(sys_mkdir) .long CSYM(sys_rmdir) // 40 .long CSYM(sys_dup) .long CSYM(sys_pipe) .long CSYM(sys_times) .long CSYM(sys_ni_syscall) // was: prof .long CSYM(sys_brk) // 45 .long CSYM(sys_setgid16) .long CSYM(sys_getgid16) .long CSYM(sys_signal) .long CSYM(sys_geteuid16) .long CSYM(sys_getegid16) // 50 .long CSYM(sys_acct) .long CSYM(sys_umount) // recycled never used phys() .long CSYM(sys_ni_syscall) // was: lock .long CSYM(sys_ioctl) .long CSYM(sys_fcntl) // 55 .long CSYM(sys_ni_syscall) // was: mpx .long CSYM(sys_setpgid) .long CSYM(sys_ni_syscall) // was: ulimit .long CSYM(sys_ni_syscall) .long CSYM(sys_umask) // 60 .long CSYM(sys_chroot) .long CSYM(sys_ustat) .long CSYM(sys_dup2) .long CSYM(sys_getppid) .long CSYM(sys_getpgrp) // 65 .long CSYM(sys_setsid) .long CSYM(sys_sigaction) .long CSYM(sys_sgetmask) .long CSYM(sys_ssetmask) .long CSYM(sys_setreuid16) // 70 .long CSYM(sys_setregid16) .long sys_sigsuspend_wrapper .long CSYM(sys_sigpending) .long CSYM(sys_sethostname) .long CSYM(sys_setrlimit) // 75 .long CSYM(sys_old_getrlimit) .long CSYM(sys_getrusage) .long CSYM(sys_gettimeofday) .long CSYM(sys_settimeofday) .long CSYM(sys_getgroups16) // 80 .long CSYM(sys_setgroups16) .long CSYM(sys_ni_syscall) // was: old_select .long CSYM(sys_symlink) .long CSYM(sys_ni_syscall) // was: oldlstat (aka lstat) .long CSYM(sys_readlink) // 85 .long CSYM(sys_uselib) .long CSYM(sys_swapon) .long CSYM(sys_reboot) .long CSYM(old_readdir) .long CSYM(sys_mmap) // 90 .long CSYM(sys_munmap) .long CSYM(sys_truncate) .long CSYM(sys_ftruncate) .long CSYM(sys_fchmod) .long CSYM(sys_fchown16) // 95 .long CSYM(sys_getpriority) .long CSYM(sys_setpriority) .long CSYM(sys_ni_syscall) // was: profil .long CSYM(sys_statfs) .long CSYM(sys_fstatfs) // 100 .long CSYM(sys_ni_syscall) // i386: ioperm .long CSYM(sys_socketcall) .long CSYM(sys_syslog) .long CSYM(sys_setitimer) .long CSYM(sys_getitimer) // 105 .long CSYM(sys_newstat) .long CSYM(sys_newlstat) .long CSYM(sys_newfstat) .long CSYM(sys_ni_syscall) // was: olduname (aka uname) .long CSYM(sys_ni_syscall) // 110, i386: iopl .long CSYM(sys_vhangup) .long CSYM(sys_ni_syscall) // was: idle .long CSYM(sys_ni_syscall) // i386: vm86old .long CSYM(sys_wait4) .long CSYM(sys_swapoff) // 115 .long CSYM(sys_sysinfo) .long CSYM(sys_ipc) .long CSYM(sys_fsync) .long sys_sigreturn_wrapper .long sys_clone_wrapper // 120 .long CSYM(sys_setdomainname) .long CSYM(sys_newuname) .long CSYM(sys_ni_syscall) // i386: modify_ldt, m68k: cacheflush .long CSYM(sys_adjtimex) .long CSYM(sys_mprotect) // 125 .long CSYM(sys_sigprocmask) .long CSYM(sys_create_module) .long CSYM(sys_init_module) .long CSYM(sys_delete_module) .long CSYM(sys_get_kernel_syms) // 130 .long CSYM(sys_quotactl) .long CSYM(sys_getpgid) .long CSYM(sys_fchdir) .long CSYM(sys_bdflush) .long CSYM(sys_sysfs) // 135 .long CSYM(sys_personality) .long CSYM(sys_ni_syscall) // for afs_syscall .long CSYM(sys_setfsuid16) .long CSYM(sys_setfsgid16) .long CSYM(sys_llseek) // 140 .long CSYM(sys_getdents) .long CSYM(sys_select) .long CSYM(sys_flock) .long CSYM(sys_msync) .long CSYM(sys_readv) // 145 .long CSYM(sys_writev) .long CSYM(sys_getsid) .long CSYM(sys_fdatasync) .long CSYM(sys_sysctl) .long CSYM(sys_mlock) // 150 .long CSYM(sys_munlock) .long CSYM(sys_mlockall) .long CSYM(sys_munlockall) .long CSYM(sys_sched_setparam) .long CSYM(sys_sched_getparam) // 155 .long CSYM(sys_sched_setscheduler) .long CSYM(sys_sched_getscheduler) .long CSYM(sys_sched_yield) .long CSYM(sys_sched_get_priority_max) .long CSYM(sys_sched_get_priority_min) // 160 .long CSYM(sys_sched_rr_get_interval) .long CSYM(sys_nanosleep) .long CSYM(sys_mremap) .long CSYM(sys_setresuid16) .long CSYM(sys_getresuid16) // 165 .long CSYM(sys_ni_syscall) // for vm86 .long CSYM(sys_query_module) .long CSYM(sys_poll) .long CSYM(sys_nfsservctl) .long CSYM(sys_setresgid16) // 170 .long CSYM(sys_getresgid16) .long CSYM(sys_prctl) .long sys_rt_sigreturn_wrapper .long CSYM(sys_rt_sigaction) .long CSYM(sys_rt_sigprocmask) // 175 .long CSYM(sys_rt_sigpending) .long CSYM(sys_rt_sigtimedwait) .long CSYM(sys_rt_sigqueueinfo) .long sys_rt_sigsuspend_wrapper .long CSYM(sys_pread) // 180 .long CSYM(sys_pwrite) .long CSYM(sys_lchown16); .long CSYM(sys_getcwd) .long CSYM(sys_capget) .long CSYM(sys_capset) // 185 .long CSYM(sys_sigaltstack) .long CSYM(sys_sendfile) .long CSYM(sys_ni_syscall) // streams1 .long CSYM(sys_ni_syscall) // streams2 .long sys_vfork_wrapper // 190 .long CSYM(sys_getrlimit) .long CSYM(sys_mmap2) .long CSYM(sys_truncate64) .long CSYM(sys_ftruncate64) .long CSYM(sys_stat64) // 195 .long CSYM(sys_lstat64) .long CSYM(sys_fstat64) .long CSYM(sys_chown) .long CSYM(sys_getuid) .long CSYM(sys_getgid) // 200 .long CSYM(sys_geteuid) .long CSYM(sys_getegid) .long CSYM(sys_setreuid) .long CSYM(sys_setregid) .long CSYM(sys_getgroups) // 205 .long CSYM(sys_setgroups) .long CSYM(sys_fchown) .long CSYM(sys_setresuid) .long CSYM(sys_getresuid) .long CSYM(sys_setresgid) // 210 .long CSYM(sys_getresgid) .long CSYM(sys_lchown) .long CSYM(sys_setuid) .long CSYM(sys_setgid) .long CSYM(sys_setfsuid) // 215 .long CSYM(sys_setfsgid) .long CSYM(sys_pivot_root) .long CSYM(sys_mincore) // just returns ENOSYS without MMU .long CSYM(sys_madvise) // just returns ENOSYS without MMU .long CSYM(sys_getdents64) // 220 .long CSYM(sys_fcntl64) .long CSYM(sys_ni_syscall) // Reserved for TUX .long CSYM(sys_ni_syscall) // Reserved for `security' .long CSYM(sys_gettid) .long CSYM(sys_ni_syscall) // 225, sys_readahead on i386 .space (NR_syscalls-225)*4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -