syscalls: syscall logging

This commit is contained in:
Matheus
2023-07-02 15:58:33 -03:00
parent 20f49e1daf
commit 29df4d72df
3 changed files with 101 additions and 2 deletions
+1 -1
View File
@@ -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)
+20 -1
View File
@@ -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
+80
View File
@@ -0,0 +1,80 @@
#include <logging.h>
#include <arch/e9.h>
#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);
}