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