From c683e9ba28583c4650992394067422bb6cff75f6 Mon Sep 17 00:00:00 2001 From: Natasha Moongrave Date: Wed, 8 Apr 2026 16:45:40 +0200 Subject: [Phase 2.2/2.3] SYSCALL/SYSRET MSR setup + syscall dispatcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit syscall/mod.rs: - Configure STAR (kernel CS=0x08, user base=0x10), LSTAR, SFMASK (clear IF), EFER.SCE to enable the SYSCALL/SYSRET instruction pair - Naked assembly entry stub: swapgs, save/restore user RSP via per-CPU static, remap r10→rcx for Linux arg4 convention, call Rust syscall_handler, sysretq - validate_user_ptr(): bounds check for all user pointers (0..USER_ADDR_MAX) - set_syscall_kernel_stack(): for scheduler to update per-CPU kernel RSP syscall/dispatch.rs: - dispatch(): routes syscall numbers; unknown → -ENOSYS (never panics) - sys_write(fd, buf, count): fd 1/2 → serial; validates user ptr; read_volatile loop avoids Rust aliasing assumptions on untrusted memory - sys_exit(): serial log + hlt_loop() placeholder; Phase 2.5 adds scheduling lib.rs: register syscall::init() + syscall::init_kernel_stack() in strix_os::init() All existing integration tests pass. Co-Authored-By: Claude Sonnet 4.6 --- NOTES.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'NOTES.md') diff --git a/NOTES.md b/NOTES.md index 5358eb5..3463729 100644 --- a/NOTES.md +++ b/NOTES.md @@ -18,8 +18,8 @@ **Branch**: `CLAUDE_TEST` **Phase**: Phase 2 — User Space Foundation -**Last commit**: `[Phase 2.1] GDT user space segments + heap growth` -**Next task**: `[Phase 2.2]` — SYSCALL/SYSRET MSR setup +**Last commit**: `[Phase 2.2/2.3] SYSCALL/SYSRET MSR setup + syscall dispatcher` +**Next task**: `[Phase 2.4]` — Process structure (task/process.rs) --- @@ -75,6 +75,20 @@ User address limit: 0x0000_8000_0000_0000 (canonical boundary) **Next**: Phase 2.1 — Extend GDT. **Decisions**: None new. +### [Phase 2.2/2.3] 2026-04-08 — SYSCALL/SYSRET MSR setup + dispatcher +**Done**: +- `src/syscall/mod.rs`: configure STAR/LSTAR/SFMASK/EFER.SCE MSRs +- Naked assembly `syscall_entry_asm`: swapgs, save user RSP, load kernel RSP, remap r10→rcx for arg4, call `syscall_handler`, restore, sysretq +- `src/syscall/dispatch.rs`: dispatcher with `write(1)`, `exit(60)`, `exit_group(231)`; unknown → `-ENOSYS` +- `sys_write`: validates user pointer before dereference; uses `read_volatile` to avoid aliasing UB +- Registered `syscall::init()` + `syscall::init_kernel_stack()` in `strix_os::init()` +- All existing integration tests still pass in QEMU +**Next**: Phase 2.4 — Process structure +**Decisions**: +- Use `swapgs` pattern for user/kernel GS switching (per-CPU scratch for user RSP) +- `sys_write` uses raw pointer + `read_volatile` loop (not `&[u8]` slice) on user memory +- `sys_exit` currently halts; Phase 2.5 will add proper process termination + ### [Phase 2.1] 2026-04-08 — GDT user space segments + heap growth **Done**: - Restructured `StrixKernel/src/gdt.rs`: added `kernel_data`, `user_data`, `user_code` segments in the correct order for SYSCALL/SYSRET ABI -- cgit v1.2.3