installed SEGV capture
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Sun, 30 May 2021 13:28:09 +0000 (23:28 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Sun, 30 May 2021 13:28:09 +0000 (23:28 +1000)
rrqforth.asm
signals.asm [new file with mode: 0644]

index f5d6269191cdce57edef6f335b440c0fce4c75f9..dc377747755b342a8ff8cd1e49f8bb16a165531b 100644 (file)
@@ -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 (file)
index 0000000..cb39df5
--- /dev/null
@@ -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:
+