1010//! R11 = ユーザーの RFLAGS (SYSCALL が自動保存)
1111//! RSP = まだユーザースタック
1212
13- use core:: sync:: atomic:: { AtomicU64 , Ordering } ;
14-
15- /// 現在のスレッドのカーネルスタックトップ (SYSCALL 時に切り替える)
16- /// コンテキストスイッチ時に更新される
17- pub static SYSCALL_KERNEL_RSP : AtomicU64 = AtomicU64 :: new ( 0 ) ;
18-
19- /// SYSCALL 用カーネルスタック (初回スイッチまたはスレッド切り替え前に使用)
20- #[ repr( align( 16 ) ) ]
21- pub struct SyscallStack ( [ u8 ; 4096 * 8 ] ) ;
22-
23- /// SYSCALL 用カーネルスタックの実体
24- pub static mut SYSCALL_KERNEL_STACK : SyscallStack = SyscallStack ( [ 0 ; 4096 * 8 ] ) ;
25-
2613/// SYSCALL/SYSRET に必要な MSR を初期化する
2714///
2815/// カーネル GDT 構成 (x86_64-unknown-uefi / MS ABI):
@@ -68,13 +55,11 @@ pub fn init_syscall() {
6855 write_msr ( IA32_FMASK , fmask_val) ;
6956 }
7057
71- // 初期カーネルスタックを設定
72- let kstack_top = unsafe {
73- let base = core:: ptr:: addr_of!( SYSCALL_KERNEL_STACK ) as u64 ;
74- base + 4096 * 8
75- } ;
76-
77- SYSCALL_KERNEL_RSP . store ( kstack_top, Ordering :: SeqCst ) ;
58+ // 初期カーネルスタックは現在のRSPを使用し、後続のコンテキストスイッチで更新する
59+ let kstack_top: u64 ;
60+ unsafe {
61+ core:: arch:: asm!( "mov {}, rsp" , out( reg) kstack_top, options( nomem, nostack, preserves_flags) ) ;
62+ }
7863 crate :: percpu:: init_boot_cpu ( kstack_top) ;
7964
8065 crate :: info!( "SYSCALL/SYSRET initialized: LSTAR={:#x}" , lstar_val) ;
@@ -83,7 +68,6 @@ pub fn init_syscall() {
8368/// SYSCALL カーネルスタックを更新する (コンテキストスイッチ時に呼ぶ)
8469pub fn update_kernel_rsp ( rsp : u64 ) {
8570 // SeqCst を使用してメモリ順序を保証する (MED-05)
86- SYSCALL_KERNEL_RSP . store ( rsp, Ordering :: SeqCst ) ;
8771 crate :: percpu:: set_syscall_kernel_rsp ( rsp) ;
8872}
8973
@@ -179,7 +163,7 @@ pub unsafe extern "C" fn syscall_entry() {
179163 "or rdx, rax" ,
180164
181165 // カーネルスタックに切り替え
182- "mov rsp, [{kernel_rsp }]" ,
166+ "mov rsp, qword ptr gs:[{sys_rsp_off }]" ,
183167 // ユーザーFSベースを保存
184168 "push rdx" ,
185169
@@ -292,10 +276,10 @@ pub unsafe extern "C" fn syscall_entry() {
292276
293277 // 非正規RSP検出: カーネルスタックに戻してプロセスを終了
294278 "2:" ,
295- "mov rsp, [{kernel_rsp }]" ,
279+ "mov rsp, qword ptr gs:[{sys_rsp_off }]" ,
296280 "call {kill_fn}" ,
297281
298- kernel_rsp = sym SYSCALL_KERNEL_RSP ,
282+ sys_rsp_off = const crate :: percpu :: GS_SYSCALL_KERNEL_RSP_OFFSET ,
299283 save_ctx_fn = sym super :: save_user_context_for_fork,
300284 dispatch = sym super :: syscall_dispatch_sysv,
301285 kill_fn = sym kill_non_canonical_rsp,
0 commit comments