]> 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)
commit56e8448d656bfde9a651e2cbe2aa43c0b3cf9e1c
treee5034605db899cc261437b5ec6ed7e770d2586e1
parent880c0b5729f6507728025cf6b337ce31527ccc54
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