TermiNexus
09b72614d9
fix(vkernel/intr): isr80(int 0x80) 修调用号/arg4 被覆盖 + 收尾原地 iretq;syscall stub 补 SysV 栈对齐
- isr80:prologue 原拿 rax/r10 当临时(取 CS 与 RFLAGS),之后 push rax/push r10 存进保存块的其实是 CS/RFLAGS → handler 收到乱掉的调用号与 arg4。现在入口先 push rax + push r10 保住二者,CS 判定改用内存操作数 `test byte ptr [rsp+24],3`,翻译段按新偏移取 arg4([rsp+168])
- isr80 收尾:原实现把帧字段 pop 进 r8/r9/r10/rax 再重新 push iret 帧,其中 `pop rax(RSP)` 会冲掉 handler 返回值,且 is_user 判断早被 `pop rcx`(arg2) 覆盖(等于没用)。改为跳过统一帧/保存槽回到 CPU 压下的原始帧直接 iretq:环切换与 RSP/SS 由 iretq 依 CS.RPL 自行处理(内核弹 3、用户弹 5),rax=返回值,其余寄存器全部原样恢复
- syscall stub:`and rsp,~15` 后直接 push arg6 使 syscall_handler 入口 rsp≡0;Viper 代码生成依赖标准 SysV(入口 rsp≡8,内核 printf 的 movaps %xmm0,0x60(%rsp) 即证据)→ 补 `sub rsp,8` 于 arg6 之前
2026-10-14 18:38:17 +08:00
..
2026-10-14 15:12:19 +08:00
2026-10-12 15:06:50 +08:00
2026-10-14 18:38:17 +08:00
2026-10-14 14:52:56 +08:00
2026-10-14 18:19:03 +08:00
2026-10-14 12:54:43 +08:00
2026-10-07 19:04:33 +08:00
2026-10-14 15:46:29 +08:00
2026-10-07 19:04:33 +08:00
2026-10-14 18:25:45 +08:00