1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 06:58:11 +00:00

Kernel: Fix the gettid syscall

syscall_handler was not actually updating the value in regs->eax, so the
gettid() was always returning 85: the value of regs->eax was not
actually updated, and it remained the one from Userland (the value of
SC_gettid).

The syscall_handler was modified to actually get a pointer to
RegisterState, so any changes to it will actually be saved.

NOTE: This was actually more of a compiler optimization:
On the SC_gettid flow, we saved in regs.eax the return value of
sys$gettid(), but the compiler discarded it, since it followed a return.
On a normal flow, the value of regs.eax was reused in
tracer->did_syscall, so the compiler actually updated the value.
This commit is contained in:
Cristian-Bogdan SIRB 2020-02-27 11:36:53 +02:00 committed by Andreas Kling
parent 0c1497846e
commit 5aa5ce53bc

View file

@ -33,7 +33,7 @@
namespace Kernel {
extern "C" void syscall_handler(RegisterState);
extern "C" void syscall_handler(RegisterState&);
extern "C" void syscall_asm_entry();
asm(
@ -52,8 +52,9 @@ asm(
" cld\n"
" xor %esi, %esi\n"
" xor %edi, %edi\n"
" push %esp\n"
" call syscall_handler\n"
" add $0x4, %esp\n"
" add $0x8, %esp\n"
" popl %gs\n"
" popl %fs\n"
" popl %es\n"
@ -121,7 +122,7 @@ int handle(RegisterState& regs, u32 function, u32 arg1, u32 arg2, u32 arg3)
}
void syscall_handler(RegisterState regs)
void syscall_handler(RegisterState& regs)
{
// Special handling of the "gettid" syscall since it's extremely hot.
// FIXME: Remove this hack once userspace locks stop calling it so damn much.