Browse Source

bbonev squeeze

master
Ralph Rönnquist 8 months ago
parent
commit
325fc118fc
  1. 80
      asm/reaper.asm

80
asm/reaper.asm

@ -6,41 +6,32 @@
format elf64 executable
entry main
;; A data segment
segment readable writable
;;; Using mixed Data and Code segment for size squeeze
;; 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
segment readable writable executable
;;; Main entry point
main:
;; if (getpid() != 1) exit 1;
mov rax, qword 39
xor rax, rax
mov al, 39
; rax=39
syscall
cmp rax, 1
je pid_1
;; exit(1)
mov rdi, qword 1
mov rax, qword 60
syscall ; exit program
dec rax
jnz exit ; exit(1)
;; Continue here for pid 1 only
pid_1:
;; Block all signals
;; sigprocmask(SIG_BLOCK, &set, 0);
xor rdi, rdi ; SIG_BLOCK = 0
; rax is already 0
mov rdi, rax ; SIG_BLOCK = 0
lea rsi, [set] ; *set
xor rdx, rdx ; 0
xor r10, r10 ; 0
mov rax, qword 14 ; sys_rt_sigprocmask
mov rdx, rax ; 0
mov r10, rax ; 0
mov al, 14 ; sys_rt_sigprocmask
; rax=14, rdi=0, rsi=[set], rdx=0, r10=0
syscall
;; loop waiting for children, and reading their exit status
@ -48,26 +39,37 @@ reaper:
;; first clear status area again
cld
xor rax, rax
lea rsi, [status$end]
lea rdi, [status]
clear: stosq
cmp rdi,rsi
jl clear
mov rdx, rdi
mov rcx, rax
mov cl, status$end-status
rep stosq
;; 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
mov rdi, rax ; idtype_t idtype = P_ALL = 0
mov rsi, rax ; int id = 0
;rdx = [status] ; siginfo_t* = &status
mov al, 4 ; int options = WEXITED = 4
mov r10, rax
mov al, 247 ; waitid
; rax=247, rdi=0, rsi=0, rdx=[status], r10=4
syscall
cmp rax,-10 ; -10 = ECHILD (no child processes)
jne reaper
add rax, 10 ; -10 = ECHILD (no child processes)
jnz reaper
exit: ; exit(1)
xor rax, rax
mov rdi, rax
mov rax, qword 60
syscall ; exit program
inc rdi
mov al, 60
syscall ; exit(1) program
;;; The rest of memory is not executable
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 ? }
status$end:

Loading…
Cancel
Save