]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commit
feat: implement SYSENTER/SYSEXIT fast syscall entry for x86-32
authorTulio A M Mendes <[email protected]>
Tue, 10 Feb 2026 07:07:14 +0000 (04:07 -0300)
committerTulio A M Mendes <[email protected]>
Tue, 10 Feb 2026 07:07:14 +0000 (04:07 -0300)
commit412f1475785a4a49d44875523eb1820285817f7c
treee1011928bf1c599f058cf74f37b576af2b603bc6
parent34af0e90e4b877d1d3a1b8ec328849d165523293
feat: implement SYSENTER/SYSEXIT fast syscall entry for x86-32

Add fast syscall support via SYSENTER/SYSEXIT (SEP), ~10x faster
than INT 0x80 (~30 cycles vs ~300 cycles overhead).

Components:
- src/arch/x86/sysenter.S: assembly entry point that builds a
  struct registers frame compatible with existing syscall_handler()
- src/arch/x86/sysenter_init.c: MSR setup (0x174=CS, 0x175=ESP,
  0x176=EIP), CPUID check for SEP support
- syscall_handler() made non-static so assembly can call it
- tss_set_kernel_stack() now also updates SYSENTER ESP MSR so
  context switches keep the fast path working

Userspace convention:
  push ecx; push edx; push $return; mov esp,ecx; sysenter
  EAX=syscall_no, EBX=arg1, ECX=arg2, EDX=arg3, ESI=arg4, EDI=arg5

INT 0x80 remains as fallback for CPUs without SEP.
QEMU confirms: [SYSENTER] Fast syscall enabled.

Passes: make, cppcheck, QEMU smoke test.
src/arch/x86/gdt.c
src/arch/x86/sysenter.S [new file with mode: 0644]
src/arch/x86/sysenter_init.c [new file with mode: 0644]
src/kernel/syscall.c