From: Ralph Ronnquist Date: Sun, 30 May 2021 13:28:09 +0000 (+1000) Subject: installed SEGV capture X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=6feac19e9a7e003a0f47890bf39a9a8324697e4b;p=rrq%2Frrqforth.git installed SEGV capture --- diff --git a/rrqforth.asm b/rrqforth.asm index f5d6269..dc37774 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -106,6 +106,8 @@ DS_TOP: ; The initial rsp ;segment readable executable +include 'signals.asm' + ;;; At fasm compilation: reset previous_word to make a new word list ;;; Words above belong to the SYSTEM wordlist, and the following ;;; belong to the FORTH wordlist. @@ -204,6 +206,8 @@ main: ;; Initial rsp points to the arguments block of size (64 bits) ;; followed by the argument pointers. mov qword [p_args_DFA],rsp + mov rbp,RS_TOP + call p_setup_signals_DFA call main_is_verbose mov qword [p_verboseQ_DFA],rdx jmp p_quit_DFA ; QUIT @@ -275,7 +279,7 @@ p_quit_ERROR: dq p_tell ENDFORTH mov rbp,RS_TOP ; reset the return stack - jmp main + jmp p_quit_INITIALIZED ;;; ======================================== diff --git a/signals.asm b/signals.asm new file mode 100644 index 0000000..cb39df5 --- /dev/null +++ b/signals.asm @@ -0,0 +1,39 @@ +;;; Handle some signals + + WORD p_setup_signals,'[p_setup_signals]',dovariable + ;; Set up signal handling; + mov rdi,11 + mov rsi,sigaction_data + mov rdx,0 + sigsetsize = sigset.end - sigset.start + mov r10,sigsetsize + mov rax,13 + syscall + ret + +signal_handler_SEGV_message: + STRING 10,'*** signal SEGV - restarting ***',10 + +signal_handler_SEGV: + mov rdi,2 + mov rsi,signal_handler_SEGV_message + 8 + mov rdx,qword [signal_handler_SEGV_message] + mov rax,1 + syscall + jmp p_quit_DFA + +signal_handler_SEGV_restorer: + mov rax,15 + syscall + +sigaction_data: + dq signal_handler_SEGV ; void (*sa_handler)(int); + ;dq 0 ; void (*sa_sigaction)(int, siginfo_t *, void *); + dq 0x44000000 ; unsigned long sa_flags + dq 0 ;signal_handler_SEGV_restorer ; void (*sa_restorer)(void); +sigset.start: ; sigset_t sa_mask; + rept 8 x { + db 0 + } +sigset.end: +