From 41a1921e2d49e860fd65c1a2ec8d8daab6172488 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 2 Jan 2023 16:19:03 -0300 Subject: [PATCH] remake the syscall logger --- src/arch/x86_64/syscall.asm | 54 +++++++++++++++++++++++++++--------- src/arch/x86_64/syscalllog.c | 34 +++++++++++++++-------- 2 files changed, 63 insertions(+), 25 deletions(-) diff --git a/src/arch/x86_64/syscall.asm b/src/arch/x86_64/syscall.asm index af32f928..6a2d736d 100644 --- a/src/arch/x86_64/syscall.asm +++ b/src/arch/x86_64/syscall.asm @@ -100,6 +100,30 @@ func_table: section .text global asm_syscall_entry +%macro abi_save 0 + push rax + push rdi + push rsi + push rdx + push rcx + push r8 + push r9 + push r10 + push r11 +%endmacro + +%macro abi_restore 0 + pop r11 + pop r10 + pop r9 + pop r8 + pop rcx + pop rdx + pop rsi + pop rdi + pop rax +%endmacro + ; the registers for the system call are: ; RETURN: ; rax -> ret value @@ -173,28 +197,32 @@ asm_syscall_entry: .do_syscall: - ; DEBUG STUFF - ;mov r15,rax - ; END DEBUG STUFF + abi_save + + push rax + + extern syscalllogger + call syscalllogger + + add rsp,8 + + abi_restore call [func_table + rax * 8] + push rax push rdx - - ; DEBUG STUFF - ;mov rsi,rdx - ;mov rdi,r15 - ;extern syscalllogger - ;call syscalllogger - + mov rdi, rax + mov rsi, rdx + + extern syscalllogger_return + call syscalllogger_return + extern postsyscall call postsyscall - - ; DEBUG STUFF END - pop rdx pop rax diff --git a/src/arch/x86_64/syscalllog.c b/src/arch/x86_64/syscalllog.c index 11eb6a1b..7224f1bc 100644 --- a/src/arch/x86_64/syscalllog.c +++ b/src/arch/x86_64/syscalllog.c @@ -2,6 +2,8 @@ #include #include #include +#include +#include static char* syscalls[] = { "syscall_libc_log", @@ -53,18 +55,26 @@ static char* syscalls[] = { }; -void syscalllogger(uint64_t num, uint64_t error){ +void syscalllogger(uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t num){ + + thread_t* thread = arch_getcls()->thread; + proc_t* proc = thread->proc; + + char tmp[100]; + + sprintf(tmp, "PID %d TID %d: %s (%d): %p %p %p %p %p %p\n", proc->pid, thread->tid, syscalls[num], num, arg1, arg2, arg3, arg4, arg5, arg6); - e9_puts("syscall: "); - e9_puts(syscalls[num]); - e9_putc(':'); - char err[] = {'0', '0', '0', NULL}; - err[2] += error % 10; - error /= 10; - err[1] += error % 10; - error /= 10; - err[0] += error % 10; - e9_puts(err); - e9_putc('\n'); + e9_puts(tmp); } + +void syscalllogger_return(uint64_t value, uint64_t errno){ + char tmp[100]; + + thread_t* thread = arch_getcls()->thread; + proc_t* proc = thread->proc; + + sprintf(tmp, "PID %d TID %d: returned %p %d\n", proc->pid, thread->tid, value, errno); + + e9_puts(tmp); +}