Add sigaction registering

This commit is contained in:
Yann Weber 2018-08-21 15:22:01 +02:00
commit 868ddc81f1

View file

@ -37,6 +37,25 @@ section .data
%define %1.tv_nsec %1+TIMESPEC_STRUC.tv_nsec
%endmacro
STRUC SIGACTION_STRUC
.sa_handler: resq 1
.sa_flags: resq 1
.sa_restorer: resq 1
.sa_mask: resb 128
ENDSTRUC
sigaction: ISTRUC SIGACTION_STRUC
at SIGACTION_STRUC.sa_handler, dq 0
at SIGACTION_STRUC.sa_flags, dq 0
at SIGACTION_STRUC.sa_restorer, dq 0
at SIGACTION_STRUC.sa_mask, times 128 db 0
IEND
%define sigaction.sa_handler sigaction+SIGACTION_STRUC.sa_handler
%define sigaction.sa_flags sigaction+SIGACTION_STRUC.sa_flags
%define sigaction.sa_restorer sigaction+SIGACTION_STRUC.sa_restorer
%define sigaction.sa_mask sigaction+SIGACTION_STRUC.sa_mask
TIMESPEC ts_start
TIMESPEC ts_cur
@ -44,7 +63,6 @@ section .data
tv_sleep_s dd 0,0
tv_sleep_us dd 10000000,0
;; 1/2s sleep
;ts_sleep:
; tv_sleep_s dq 0
@ -64,11 +82,10 @@ section .data
nl: db 0x0A
buf: db 0
dbgmsg: db "SigINT", 0xa
section .text
global _start
_start:
; set stdin non blocking
@ -86,6 +103,24 @@ syscall
cmp rax, 0
jne fault
; preparing SIGINT catch
mov rax, lap_handler
mov qword [sigaction.sa_handler], rax
mov eax, 0x10000000 ; SA_RESTART
or eax, 0x04000000 ; SA_RESTORER
mov dword [sigaction.sa_flags], eax
mov rax, sig_restorer
mov qword [sigaction.sa_restorer], rax
mov rax, 13 ; sys_rt_sigaction
mov rdi, 2 ; SIGINT
mov rsi, sigaction
mov rdx, 0 ; NULL
mov r10, 8 ; sig_size
syscall
cmp rax, 0
jne fault
mov rax, 228 ; clock_gettime
mov rdi, 0 ; CLOCK_REALTIME
mov rsi, ts_start
@ -257,4 +292,21 @@ newline_exit:
syscall
jmp exit
lap_handler:
pop r8
mov rax, 1
mov rdi, 1
mov rsi, dbgmsg
mov rdx, 7
syscall
push r8 ; push back ret addr
ret
sig_restorer:
mov rax, 15 ; sys_rt_sigreturn
xor rdi, rdi
syscall
.end: