blob: a0d4f732f667bd62fcc0614dbfec731d6f40b6e6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <kernel/arch/generic.h>
#include <kernel/proc.h>
#include <shared/syscalls.h>
struct registers _sysexit_regs; // a hack
extern void _sysexit_real(void);
void sysexit(struct registers regs) {
_sysexit_regs = regs;
_sysexit_regs.ecx = (uintptr_t) regs.esp;
_sysexit_regs.edx = (uintptr_t) regs.eip;
_sysexit_real();
__builtin_unreachable();
}
_Noreturn void sysenter_stage2(void) {
uint64_t val;
struct registers *regs = &process_current->regs;
*regs = _sysexit_regs; // save the registers
regs->esp = (userptr_t) regs->ecx; // fix them up
regs->eip = (userptr_t) regs->edx;
val = _syscall(regs->eax, regs->ebx,
regs->esi, regs->edi, (uintptr_t)regs->ebp);
regs_savereturn(&process_current->regs, val);
process_switch(process_current); // TODO process_resume
}
|