;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.
;; 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
dq p_tell
ENDFORTH
mov rbp,RS_TOP ; reset the return stack
- jmp main
+ jmp p_quit_INITIALIZED
;;; ========================================
--- /dev/null
+;;; 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:
+