1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 08:24:58 +00:00

strace: Add support for pretty-printing the prctl syscall

This commit is contained in:
Idan Horowitz 2024-03-01 23:45:21 +02:00 committed by Andreas Kling
parent 8c562a764d
commit 0b7e4b335a

View file

@ -11,6 +11,7 @@
#include <AK/StdLibExtras.h>
#include <AK/Types.h>
#include <Kernel/API/SyscallString.h>
#include <Kernel/API/prctl_numbers.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/File.h>
#include <LibCore/System.h>
@ -210,6 +211,18 @@ HANDLE(CLOCK_REALTIME_COARSE)
HANDLE(CLOCK_MONOTONIC_COARSE)
END_VALUES_TO_NAMES()
VALUES_TO_NAMES(prctl_option_name)
HANDLE(PR_SET_DUMPABLE)
HANDLE(PR_GET_DUMPABLE)
HANDLE(PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS)
HANDLE(PR_GET_NO_NEW_SYSCALL_REGION_ANNOTATIONS)
HANDLE(PR_SET_COREDUMP_METADATA_VALUE)
HANDLE(PR_SET_PROCESS_NAME)
HANDLE(PR_GET_PROCESS_NAME)
HANDLE(PR_SET_THREAD_NAME)
HANDLE(PR_GET_THREAD_NAME)
END_VALUES_TO_NAMES()
static int g_pid = -1;
using syscall_arg_t = u64;
@ -711,6 +724,23 @@ static void format_kill(FormattedSyscallBuilder& builder, pid_t pid_or_pgid, int
builder.add_argument(signal);
}
static void format_prctl(FormattedSyscallBuilder& builder, int option, size_t arg1, size_t arg2, size_t arg3)
{
builder.add_argument(prctl_option_name(option));
switch (option) {
case PR_SET_DUMPABLE:
case PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS:
builder.add_argument((bool)arg1);
break;
case PR_GET_DUMPABLE:
case PR_GET_NO_NEW_SYSCALL_REGION_ANNOTATIONS:
break;
default:
builder.add_arguments(arg1, arg2, arg3);
break;
}
}
static ErrorOr<void> format_syscall(FormattedSyscallBuilder& builder, Syscall::Function syscall_function, syscall_arg_t arg1, syscall_arg_t arg2, syscall_arg_t arg3, syscall_arg_t arg4, syscall_arg_t res)
{
enum ResultType {
@ -801,6 +831,9 @@ static ErrorOr<void> format_syscall(FormattedSyscallBuilder& builder, Syscall::F
case SC_kill:
format_kill(builder, (pid_t)arg1, (int)arg2);
break;
case SC_prctl:
format_prctl(builder, (int)arg1, (size_t)arg2, (size_t)arg3, (size_t)arg4);
break;
case SC_getuid:
case SC_geteuid:
case SC_getgid: