1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 06:07:34 +00:00

Kernel: Declare syscall handlers with "using" instead of "typedef"

Also use bit_cast to avoid -Wcast-function-type warning.
This commit is contained in:
Brian Gianforcaro 2021-09-04 12:53:24 -07:00 committed by Linus Groh
parent 9d1b27263f
commit 3d12d0f408

View file

@ -88,15 +88,15 @@ UNMAP_AFTER_INIT void initialize()
register_user_callable_interrupt_handler(syscall_vector, syscall_asm_entry); register_user_callable_interrupt_handler(syscall_vector, syscall_asm_entry);
} }
#pragma GCC diagnostic ignored "-Wcast-function-type" using Handler = auto (Process::*)(FlatPtr, FlatPtr, FlatPtr, FlatPtr) -> KResultOr<FlatPtr>;
typedef KResultOr<FlatPtr> (Process::*Handler)(FlatPtr, FlatPtr, FlatPtr, FlatPtr); using HandlerWithRegisterState = auto (Process::*)(RegisterState&) -> KResultOr<FlatPtr>;
typedef KResultOr<FlatPtr> (Process::*HandlerWithRegisterState)(RegisterState&);
struct HandlerMetadata { struct HandlerMetadata {
Handler handler; Handler handler;
NeedsBigProcessLock needs_lock; NeedsBigProcessLock needs_lock;
}; };
#define __ENUMERATE_SYSCALL(sys_call, needs_lock) { reinterpret_cast<Handler>(&Process::sys$##sys_call), needs_lock }, #define __ENUMERATE_SYSCALL(sys_call, needs_lock) { bit_cast<Handler>(&Process::sys$##sys_call), needs_lock },
static const HandlerMetadata s_syscall_table[] = { static const HandlerMetadata s_syscall_table[] = {
ENUMERATE_SYSCALLS(__ENUMERATE_SYSCALL) ENUMERATE_SYSCALLS(__ENUMERATE_SYSCALL)
}; };
@ -153,7 +153,7 @@ KResultOr<FlatPtr> handle(RegisterState& regs, FlatPtr function, FlatPtr arg1, F
KResultOr<FlatPtr> result { FlatPtr(nullptr) }; KResultOr<FlatPtr> result { FlatPtr(nullptr) };
if (function == SC_fork || function == SC_sigreturn) { if (function == SC_fork || function == SC_sigreturn) {
// These syscalls want the RegisterState& rather than individual parameters. // These syscalls want the RegisterState& rather than individual parameters.
auto handler = (HandlerWithRegisterState)syscall_metadata.handler; auto handler = bit_cast<HandlerWithRegisterState>(syscall_metadata.handler);
result = (process.*(handler))(regs); result = (process.*(handler))(regs);
} else { } else {
result = (process.*(syscall_metadata.handler))(arg1, arg2, arg3, arg4); result = (process.*(syscall_metadata.handler))(arg1, arg2, arg3, arg4);