📄 entry.s
字号:
ldq $4,0($4) /* softirq_active[32] + softirq_mask[32] */ sll $4,32,$3 and $4,$3,$4 bne $4,handle_softirqret_from_softirq: ldq $0,SP_OFF($30) and $0,8,$0 beq $0,restore_allret_from_reschedule: ldq $2,TASK_NEED_RESCHED($8) lda $4,init_task_union bne $2,reschedule xor $4,$8,$4 ldl $5,TASK_SIGPENDING($8) beq $4,restore_all bne $5,signal_returnrestore_all: RESTORE_ALL call_pal PAL_rti/* PTRACE syscall handler */.align 3strace: /* set up signal stack, call syscall_trace */ bsr $1,do_switch_stack jsr $26,syscall_trace bsr $1,undo_switch_stack /* get the system call number and the arguments back.. */ ldq $0,0($30) ldq $16,SP_OFF+24($30) ldq $17,SP_OFF+32($30) ldq $18,SP_OFF+40($30) ldq $19,72($30) ldq $20,80($30) ldq $21,88($30) /* get the system call pointer.. */ lda $1,NR_SYSCALLS($31) lda $2,sys_call_table lda $27,alpha_ni_syscall cmpult $0,$1,$1 s8addq $0,$2,$2 beq $1,1f ldq $27,0($2)1: jsr $26,($27),sys_gettimeofday ldgp $29,0($26) /* check return.. */ blt $0,strace_error /* the call failed */ stq $31,72($30) /* a3=0 => no error */strace_success: stq $0,0($30) /* save return value */ bsr $1,do_switch_stack jsr $26,syscall_trace bsr $1,undo_switch_stack br $31,ret_from_sys_call .align 3strace_error: ldq $19,0($30) /* old syscall nr (zero if success) */ beq $19,strace_success ldq $20,72($30) /* .. and this a3 */ subq $31,$0,$0 /* with error in v0 */ addq $31,1,$1 /* set a3 for errno return */ stq $0,0($30) stq $1,72($30) /* a3 for return */ bsr $1,do_switch_stack mov $19,$9 /* save old syscall number */ mov $20,$10 /* save old a3 */ jsr $26,syscall_trace mov $9,$19 mov $10,$20 bsr $1,undo_switch_stack mov $31,$26 /* tell "ret_from_sys_call" we can restart */ br ret_from_sys_call .align 3handle_softirq: subq $30,16,$30 stq $19,0($30) /* save syscall nr */ stq $20,8($30) /* and error indication (a3) */ jsr $26,do_softirq ldq $19,0($30) ldq $20,8($30) addq $30,16,$30 br ret_from_softirq .align 3syscall_error: /* * Some system calls (e.g., ptrace) can return arbitrary * values which might normally be mistaken as error numbers. * Those functions must zero $0 (v0) directly in the stack * frame to indicate that a negative return value wasn't an * error number.. */ ldq $19,0($30) /* old syscall nr (zero if success) */ beq $19,ret_success ldq $20,72($30) /* .. and this a3 */ subq $31,$0,$0 /* with error in v0 */ addq $31,1,$1 /* set a3 for errno return */ stq $0,0($30) mov $31,$26 /* tell "ret_from_sys_call" we can restart */ stq $1,72($30) /* a3 for return */ br ret_from_sys_callret_success: stq $0,0($30) stq $31,72($30) /* a3=0 => no error */ br ret_from_sys_call.align 3signal_return: mov $30,$17 br $1,do_switch_stack mov $30,$18 mov $31,$16 jsr $26,do_signal bsr $1,undo_switch_stack br restore_all.end entSys#ifdef CONFIG_SMP .globl ret_from_smp_fork.align 3.ent ret_from_smp_forkret_from_smp_fork: lda $26,ret_from_sys_call mov $17,$16 jsr $31,schedule_tail.end ret_from_smp_fork#endif /* CONFIG_SMP */.align 3.ent reschedulereschedule: subq $30,16,$30 stq $19,0($30) /* save syscall nr */ stq $20,8($30) /* and error indication (a3) */ jsr $26,schedule ldq $19,0($30) ldq $20,8($30) addq $30,16,$30 br ret_from_reschedule.end reschedule.align 3.ent sys_sigreturnsys_sigreturn: mov $30,$17 lda $18,-SWITCH_STACK_SIZE($30) lda $30,-SWITCH_STACK_SIZE($30) jsr $26,do_sigreturn br $1,undo_switch_stack br ret_from_sys_call.end sys_sigreturn.align 3.ent sys_rt_sigreturnsys_rt_sigreturn: mov $30,$17 lda $18,-SWITCH_STACK_SIZE($30) lda $30,-SWITCH_STACK_SIZE($30) jsr $26,do_rt_sigreturn br $1,undo_switch_stack br ret_from_sys_call.end sys_rt_sigreturn.align 3.ent sys_sigsuspendsys_sigsuspend: mov $30,$17 br $1,do_switch_stack mov $30,$18 jsr $26,do_sigsuspend lda $30,SWITCH_STACK_SIZE($30) br ret_from_sys_call.end sys_sigsuspend.align 3.ent sys_rt_sigsuspendsys_rt_sigsuspend: mov $30,$18 br $1,do_switch_stack mov $30,$19 jsr $26,do_rt_sigsuspend lda $30,SWITCH_STACK_SIZE($30) br ret_from_sys_call.end sys_rt_sigsuspend .data .align 3 .globl sys_call_tablesys_call_table: .quad alpha_ni_syscall /* 0 */ .quad sys_exit .quad sys_fork .quad sys_read .quad sys_write .quad alpha_ni_syscall /* 5 */ .quad sys_close .quad osf_wait4 .quad alpha_ni_syscall .quad sys_link .quad sys_unlink /* 10 */ .quad alpha_ni_syscall .quad sys_chdir .quad sys_fchdir .quad sys_mknod .quad sys_chmod /* 15 */ .quad sys_chown .quad osf_brk .quad alpha_ni_syscall .quad sys_lseek .quad sys_getxpid /* 20 */ .quad osf_mount .quad sys_umount .quad sys_setuid .quad sys_getxuid .quad alpha_ni_syscall /* 25 */ .quad sys_ptrace .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 30 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad sys_access .quad alpha_ni_syscall .quad alpha_ni_syscall /* 35 */ .quad sys_sync .quad sys_kill .quad alpha_ni_syscall .quad sys_setpgid .quad alpha_ni_syscall /* 40 */ .quad sys_dup .quad sys_pipe .quad osf_set_program_attributes .quad alpha_ni_syscall .quad sys_open /* 45 */ .quad alpha_ni_syscall .quad sys_getxgid .quad osf_sigprocmask .quad alpha_ni_syscall .quad alpha_ni_syscall /* 50 */ .quad sys_acct .quad sys_sigpending .quad alpha_ni_syscall .quad sys_ioctl .quad alpha_ni_syscall /* 55 */ .quad alpha_ni_syscall .quad sys_symlink .quad sys_readlink .quad sys_execve .quad sys_umask /* 60 */ .quad sys_chroot .quad alpha_ni_syscall .quad sys_getpgrp .quad sys_getpagesize .quad alpha_ni_syscall /* 65 */ .quad sys_vfork .quad sys_newstat .quad sys_newlstat .quad alpha_ni_syscall .quad alpha_ni_syscall /* 70 */ .quad osf_mmap .quad alpha_ni_syscall .quad sys_munmap .quad sys_mprotect .quad sys_madvise /* 75 */ .quad sys_vhangup .quad alpha_ni_syscall .quad alpha_ni_syscall .quad sys_getgroups /* map BSD's setpgrp to sys_setpgid for binary compatibility: */ .quad sys_setgroups /* 80 */ .quad alpha_ni_syscall .quad sys_setpgid .quad osf_setitimer .quad alpha_ni_syscall .quad alpha_ni_syscall /* 85 */ .quad osf_getitimer .quad sys_gethostname .quad sys_sethostname .quad sys_getdtablesize .quad sys_dup2 /* 90 */ .quad sys_newfstat .quad sys_fcntl .quad osf_select .quad sys_poll .quad sys_fsync /* 95 */ .quad sys_setpriority .quad sys_socket .quad sys_connect .quad sys_accept .quad osf_getpriority /* 100 */ .quad sys_send .quad sys_recv .quad sys_sigreturn .quad sys_bind .quad sys_setsockopt /* 105 */ .quad sys_listen .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 110 */ .quad sys_sigsuspend .quad osf_sigstack .quad sys_recvmsg .quad sys_sendmsg .quad alpha_ni_syscall /* 115 */ .quad osf_gettimeofday .quad osf_getrusage .quad sys_getsockopt .quad alpha_ni_syscall .quad sys_readv /* 120 */ .quad sys_writev .quad osf_settimeofday .quad sys_fchown .quad sys_fchmod .quad sys_recvfrom /* 125 */ .quad sys_setreuid .quad sys_setregid .quad sys_rename .quad sys_truncate .quad sys_ftruncate /* 130 */ .quad sys_flock .quad sys_setgid .quad sys_sendto .quad sys_shutdown .quad sys_socketpair /* 135 */ .quad sys_mkdir .quad sys_rmdir .quad osf_utimes .quad alpha_ni_syscall .quad alpha_ni_syscall /* 140 */ .quad sys_getpeername .quad alpha_ni_syscall .quad alpha_ni_syscall .quad sys_getrlimit .quad sys_setrlimit /* 145 */ .quad alpha_ni_syscall .quad sys_setsid .quad sys_quotactl .quad alpha_ni_syscall .quad sys_getsockname /* 150 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 155 */ .quad osf_sigaction .quad alpha_ni_syscall .quad alpha_ni_syscall .quad osf_getdirentries .quad osf_statfs /* 160 */ .quad osf_fstatfs .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad osf_getdomainname /* 165 */ .quad sys_setdomainname .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 170 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 175 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 180 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 185 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 190 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 195 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad osf_swapon .quad sys_msgctl /* 200 */ .quad sys_msgget .quad sys_msgrcv .quad sys_msgsnd .quad sys_semctl .quad sys_semget /* 205 */ .quad sys_semop .quad osf_utsname .quad sys_lchown .quad osf_shmat .quad sys_shmctl /* 210 */ .quad sys_shmdt .quad sys_shmget .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 215 */ .quad alpha_ni_syscall .quad sys_msync .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 220 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 225 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 230 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad sys_getpgid .quad sys_getsid .quad sys_sigaltstack /* 235 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 240 */ .quad osf_sysinfo .quad alpha_ni_syscall .quad alpha_ni_syscall .quad osf_proplist_syscall .quad alpha_ni_syscall /* 245 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 250 */ .quad osf_usleep_thread .quad alpha_ni_syscall .quad alpha_ni_syscall .quad sys_sysfs .quad alpha_ni_syscall /* 255 */ .quad osf_getsysinfo .quad osf_setsysinfo .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 260 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 265 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 270 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 275 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 280 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 285 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 290 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 295 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall/* linux-specific system calls start at 300 */ .quad sys_bdflush /* 300 */ .quad sys_sethae .quad sys_mount .quad sys_old_adjtimex .quad sys_swapoff .quad sys_getdents /* 305 */ .quad alpha_create_module .quad sys_init_module .quad sys_delete_module .quad sys_get_kernel_syms .quad sys_syslog /* 310 */ .quad sys_reboot .quad sys_clone .quad sys_uselib .quad sys_mlock .quad sys_munlock /* 315 */ .quad sys_mlockall .quad sys_munlockall .quad sys_sysinfo .quad sys_sysctl .quad sys_ni_syscall /* 320 */ .quad sys_oldumount .quad sys_swapon .quad sys_times .quad sys_personality .quad sys_setfsuid /* 325 */ .quad sys_setfsgid .quad sys_ustat .quad sys_statfs .quad sys_fstatfs .quad sys_sched_setparam /* 330 */ .quad sys_sched_getparam .quad sys_sched_setscheduler .quad sys_sched_getscheduler .quad sys_sched_yield .quad sys_sched_get_priority_max /* 335 */ .quad sys_sched_get_priority_min .quad sys_sched_rr_get_interval .quad sys_ni_syscall /* sys_afs_syscall */ .quad sys_newuname .quad sys_nanosleep /* 340 */ .quad sys_mremap .quad sys_nfsservctl .quad sys_setresuid .quad sys_getresuid .quad sys_pciconfig_read /* 345 */ .quad sys_pciconfig_write .quad sys_query_module .quad sys_prctl .quad sys_pread .quad sys_pwrite /* 350 */ .quad sys_rt_sigreturn .quad sys_rt_sigaction .quad sys_rt_sigprocmask .quad sys_rt_sigpending .quad sys_rt_sigtimedwait /* 355 */ .quad sys_rt_sigqueueinfo .quad sys_rt_sigsuspend .quad sys_select .quad sys_gettimeofday .quad sys_settimeofday /* 360 */ .quad sys_getitimer .quad sys_setitimer .quad sys_utimes .quad sys_getrusage .quad sys_wait4 /* 365 */ .quad sys_adjtimex .quad sys_getcwd .quad sys_capget .quad sys_capset .quad sys_sendfile /* 370 */ .quad sys_setresgid .quad sys_getresgid .quad sys_ni_syscall /* sys_dipc */ .quad sys_pivot_root .quad sys_mincore /* 375 */ .quad sys_pciconfig_iobase .quad sys_getdents64
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -