From: Ralph Ronnquist Date: Fri, 25 Mar 2022 23:33:19 +0000 (+1100) Subject: renamed directory X-Git-Tag: deb_0.1~16 X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=f5e7beadac9de48620d025c86b9af07001403cda;p=rrq%2Foverlay-boot.git renamed directory --- diff --git a/asm/.gitignore b/asm/.gitignore new file mode 100644 index 0000000..da4ed25 --- /dev/null +++ b/asm/.gitignore @@ -0,0 +1 @@ +reaper diff --git a/asm/Makefile b/asm/Makefile new file mode 100644 index 0000000..4afe034 --- /dev/null +++ b/asm/Makefile @@ -0,0 +1,6 @@ +reaper: reaper.asm + fasm $^ $@ + chmod a+x $@ + +clean: + rm -f reaper diff --git a/asm/reaper.asm b/asm/reaper.asm new file mode 100644 index 0000000..0086a8f --- /dev/null +++ b/asm/reaper.asm @@ -0,0 +1,73 @@ +;;; This is a "repear" program that merely waits for child processes +;;; to appear and "reap" them, i.e. read their exit status to let them +;;; exit. The program allows an arbitrary first argument that is +;;; indended for identifying the reaper process. + + format elf64 executable + entry main + + ;; A data segment + segment readable writable + + ;; sigset_t set -- bit mask for sigprocmask +set: dq -1 ; all bits set + +;;; siginfo_t status -- all ignored +status: rept 16 { dq 0 } +status$end: + +;;; A code segment + segment readable executable + +;;; Main entry point +main: + ;; if (getpid() != 1) exit 1; + mov rax, qword 39 + syscall + cmp rax, 1 + je pid_1 + + ;; exit(1) + mov rdi, qword 1 + mov rax, qword 60 + syscall ; exit program + + ;; Continue here for pid 1 only +pid_1: + ;; Block all signals + ;; sigprocmask(SIG_BLOCK, &set, 0); + xor rdi, rdi ; SIG_BLOCK = 0 + lea rsi, [set] ; *set + xor rdx, rdx ; 0 + xor r10, r10 ; 0 + mov rax, qword 14 ; sys_rt_sigprocmask + syscall + + ;; loop waiting for children, and reading their exit status +reaper: + ;; first clear status area again + cld + xor rax, rax + lea rsi, [status$end] + lea rdi, [status] +clear: stosq + cmp rdi,rsi + jl clear + + ;; waitid( idtype, id, *status, options ) + xor rdi, rdi ; idtype_t idtype = P_ALL = 0 + xor rsi, rsi ; int id = 0 + lea rdx, [status] ; siginfo_t* = &status + mov r10, 4 ; int options = WEXITED = 4 + mov rax, 247 ; waitid + syscall + + cmp rax,-10 ; -10 = ECHILD (no child processes) + jne reaper + + mov rdi, rax + mov rax, qword 60 + syscall ; exit program + +;;; The rest of memory is not executable + segment readable writable diff --git a/reaper/.gitignore b/reaper/.gitignore deleted file mode 100644 index da4ed25..0000000 --- a/reaper/.gitignore +++ /dev/null @@ -1 +0,0 @@ -reaper diff --git a/reaper/Makefile b/reaper/Makefile deleted file mode 100644 index 4afe034..0000000 --- a/reaper/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -reaper: reaper.asm - fasm $^ $@ - chmod a+x $@ - -clean: - rm -f reaper diff --git a/reaper/reaper.asm b/reaper/reaper.asm deleted file mode 100644 index 0086a8f..0000000 --- a/reaper/reaper.asm +++ /dev/null @@ -1,73 +0,0 @@ -;;; This is a "repear" program that merely waits for child processes -;;; to appear and "reap" them, i.e. read their exit status to let them -;;; exit. The program allows an arbitrary first argument that is -;;; indended for identifying the reaper process. - - format elf64 executable - entry main - - ;; A data segment - segment readable writable - - ;; sigset_t set -- bit mask for sigprocmask -set: dq -1 ; all bits set - -;;; siginfo_t status -- all ignored -status: rept 16 { dq 0 } -status$end: - -;;; A code segment - segment readable executable - -;;; Main entry point -main: - ;; if (getpid() != 1) exit 1; - mov rax, qword 39 - syscall - cmp rax, 1 - je pid_1 - - ;; exit(1) - mov rdi, qword 1 - mov rax, qword 60 - syscall ; exit program - - ;; Continue here for pid 1 only -pid_1: - ;; Block all signals - ;; sigprocmask(SIG_BLOCK, &set, 0); - xor rdi, rdi ; SIG_BLOCK = 0 - lea rsi, [set] ; *set - xor rdx, rdx ; 0 - xor r10, r10 ; 0 - mov rax, qword 14 ; sys_rt_sigprocmask - syscall - - ;; loop waiting for children, and reading their exit status -reaper: - ;; first clear status area again - cld - xor rax, rax - lea rsi, [status$end] - lea rdi, [status] -clear: stosq - cmp rdi,rsi - jl clear - - ;; waitid( idtype, id, *status, options ) - xor rdi, rdi ; idtype_t idtype = P_ALL = 0 - xor rsi, rsi ; int id = 0 - lea rdx, [status] ; siginfo_t* = &status - mov r10, 4 ; int options = WEXITED = 4 - mov rax, 247 ; waitid - syscall - - cmp rax,-10 ; -10 = ECHILD (no child processes) - jne reaper - - mov rdi, rax - mov rax, qword 60 - syscall ; exit program - -;;; The rest of memory is not executable - segment readable writable