diff --git a/kernel-src/Makefile b/kernel-src/Makefile index b4f08615..4335ff4b 100644 --- a/kernel-src/Makefile +++ b/kernel-src/Makefile @@ -10,7 +10,7 @@ LDFLAGS=-ffreestanding -nostdlib -lgcc -Wl,-T,"$(ARCHDIR)/kernel.ld" -g PRINTFOPTS=-DPRINTF_DISABLE_SUPPORT_FLOAT # flanterm includes break if the headers are moved into the include dir in the tree FLANTERMINCDIR=$(shell pwd)/flanterm -CFLAGS=-g -ffreestanding -mcmodel=kernel -O2 -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -nostdlib -Wall -I "${INCDIR}" -I "$(ARCHINCDIR)" -I "$(FLANTERMINCDIR)" $(PRINTFOPTS) +CFLAGS=-g -ffreestanding -mcmodel=kernel -O2 -mno-red-zone -mgeneral-regs-only -mno-mmx -mno-sse -mno-sse2 -nostdlib -Wall -I "${INCDIR}" -I "$(ARCHINCDIR)" -I "$(FLANTERMINCDIR)" $(PRINTFOPTS) ASFLAGS=-felf64 astral: $(OBJS) diff --git a/kernel-src/arch/x86-64/syscall.asm b/kernel-src/arch/x86-64/syscall.asm index 8462cd44..25f970f4 100644 --- a/kernel-src/arch/x86-64/syscall.asm +++ b/kernel-src/arch/x86-64/syscall.asm @@ -21,6 +21,7 @@ extern syscall_dup2 extern syscall_dup3 extern syscall_fcntl extern syscall_chdir +extern syscall_pipe2 syscalltab: dq syscall_print dq syscall_mmap @@ -44,7 +45,8 @@ dq syscall_dup2 dq syscall_dup3 dq syscall_fcntl dq syscall_chdir -syscallcount equ 22 +dq syscall_pipe2 +syscallcount equ 23 section .text global arch_syscall_entry ; on entry: @@ -110,6 +112,14 @@ arch_syscall_entry: mov rcx, rdx mov rdx, rsi mov rsi, rdi + + ; call logging function + + mov rdi, rax + extern arch_syscall_log + call arch_syscall_log ; compiled with __attribute__((no_caller_saved_registers)) + + ; prepare context argument mov rdi, rsp add rdi, 8 ; context pointer is after r9 argument sti @@ -123,6 +133,15 @@ arch_syscall_entry: call syscall_invalid .return: cli + + ; call return logging function + + mov rdi, rax + mov rsi, rdx + extern arch_syscall_log_return + call arch_syscall_log_return ; compiled with __attribute__((no_caller_saved_registers)) + + ; restore context add rsp, 32 ; r9 argument, cr2, gs, and fs are not popped. pop rbx diff --git a/kernel-src/arch/x86-64/syscalllog.c b/kernel-src/arch/x86-64/syscalllog.c new file mode 100644 index 00000000..553e073a --- /dev/null +++ b/kernel-src/arch/x86-64/syscalllog.c @@ -0,0 +1,80 @@ +#include +#include + +#define SYSCALL_COUNT 23 +#define LOGSTR(x) arch_e9_puts(x) + +static char *name[] = { + "print", + "mmap", + "openat", + "read", + "seek", + "close", + "archctl", + "write", + "getpid", + "fstat", + "fstatat", + "fork", + "execve", + "exit", + "waitpid", + "munmap", + "getdents", + "dup", + "dup2", + "dup3", + "fcntl", + "chdir", + "pipe2" +}; + +static char *args[] = { + "N/A", // print will not have its argument printed + "hint %p length %lu prot %d flags %d fd %d offset %ld", // mmap + "dirfd %d path %s flags %d mode %o", // openat + "fd %d buffer %p size %lu", // read + "fd %d offset %ld whence %d", // seek + "fd %d", // close + "func %d arg %p", // archctl + "fd %d buffer %p size %lu", // write + "N/A", // getpid + "fd %d ustat %p", // fstat + "dirfd %d path %s ustat %p flags %d", // fstatat + "N/A", // fork + "path %s uargv %p uenvp %p", // execve + "status %d", // exit + "pid %d statusp %p options %d", // waitpid + "addr %p length %lu", // munmap + "dirfd %d buffer %p readmax %lu", // getdents + "oldfd %d", // dup + "oldfd %d newfd %d", // dup2 + "oldfd %d newfd %d flags %d", //dup3 + "fd %d cmd %d arg %lu", // fcntl + "path %s", // chdir + "flags %d", // pipe2 +}; + +__attribute__((no_caller_saved_registers)) void arch_syscall_log(int syscall, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6) { + char argbuff[768]; + char printbuff[1024]; + + thread_t *thread = _cpu()->thread; + proc_t *proc = thread->proc; + + snprintf(argbuff, 768, syscall < SYSCALL_COUNT ? args[syscall] : "N/A", a1, a2, a3, a4, a5, a6); + snprintf(printbuff, 1024, "\e[92msyscall: pid %d tid %d: %s: %s\n\e[0m", proc->pid, thread->tid, syscall < SYSCALL_COUNT ? name[syscall] : "invalid syscall", argbuff); + + LOGSTR(printbuff); +} + +__attribute__((no_caller_saved_registers)) void arch_syscall_log_return(int syscall, uint64_t ret, uint64_t errno) { + char printbuff[1024]; + + thread_t *thread = _cpu()->thread; + proc_t *proc = thread->proc; + + snprintf(printbuff, 1024, "\e[94msyscall return: pid %d tid %d: %lu %lu\n\e[0m", proc->pid, thread->tid, ret, errno); + LOGSTR(printbuff); +}