0086a8f7ee23ad0b1c1ce032f8bb0eabdec7ef4c
[rrq/overlay-boot.git] / reaper / reaper.asm
1 ;;; This is a "repear" program that merely waits for child processes
2 ;;; to appear and "reap" them, i.e. read their exit status to let them
3 ;;; exit. The program allows an arbitrary first argument that is
4 ;;; indended for identifying the reaper process.
5
6         format elf64 executable
7         entry main
8
9         ;; A data segment
10         segment readable writable
11
12         ;; sigset_t set -- bit mask for sigprocmask
13 set:    dq -1   ; all bits set
14         
15 ;;; siginfo_t status -- all ignored
16 status: rept 16 { dq 0 }
17 status$end:
18         
19 ;;; A code segment
20         segment readable executable
21         
22 ;;; Main entry point
23 main:
24         ;; if (getpid() != 1) exit 1;
25         mov rax, qword 39
26         syscall
27         cmp rax, 1
28         je pid_1
29         
30         ;; exit(1)
31         mov rdi, qword 1
32         mov rax, qword 60
33         syscall                 ; exit program
34
35         ;; Continue here for pid 1 only
36 pid_1:
37         ;; Block all signals
38         ;; sigprocmask(SIG_BLOCK, &set, 0);
39         xor rdi, rdi            ; SIG_BLOCK = 0
40         lea rsi, [set]          ; *set
41         xor rdx, rdx            ; 0
42         xor r10, r10            ; 0
43         mov rax, qword 14       ; sys_rt_sigprocmask
44         syscall
45
46         ;; loop waiting for children, and reading their exit status
47 reaper:
48         ;; first clear status area again
49         cld
50         xor rax, rax
51         lea rsi, [status$end]
52         lea rdi, [status]
53 clear:  stosq
54         cmp rdi,rsi
55         jl clear
56         
57         ;; waitid( idtype, id, *status, options )
58         xor rdi, rdi      ;  idtype_t idtype = P_ALL = 0
59         xor rsi, rsi      ; int id = 0
60         lea rdx, [status] ; siginfo_t* = &status
61         mov r10, 4        ; int options = WEXITED = 4
62         mov rax, 247      ; waitid
63         syscall
64
65         cmp rax,-10       ; -10 = ECHILD (no child processes)
66         jne reaper
67
68         mov rdi, rax
69         mov rax, qword 60
70         syscall         ; exit program
71
72 ;;; The rest of memory is not executable
73         segment readable writable