Browse Source

bugfix: 在内核线程中,rflags未按照预期值进行设置的问题

fslongjin 2 years ago
parent
commit
5963c45116
2 changed files with 6 additions and 2 deletions
  1. 4 2
      kernel/process/proc.S
  2. 2 0
      kernel/process/process.c

+ 4 - 2
kernel/process/proc.S

@@ -27,8 +27,10 @@ ENTRY(kernel_thread_func)
     popq	%rax		   
     movq	%rax,	%es	   
     popq	%rax		   
-    addq	$0x38,	%rsp	   
-    movq	%rdx,	%rdi	   
+    addq	$0x20,	%rsp	   
+    popfq
+    addq    $0x10,  %rsp
+    movq	%rdx,	%rdi  
     callq	*%rbx		   
     movq	%rax,	%rdi	   
     callq	process_do_exit		  

+ 2 - 0
kernel/process/process.c

@@ -422,6 +422,8 @@ ul initial_kernel_thread(ul arg)
     // 准备切换到用户态
     struct pt_regs *regs;
 
+    // 若在后面这段代码中触发中断,return时会导致段选择子错误,从而触发#GP,因此这里需要cli
+    cli();
     current_pcb->thread->rip = (ul)ret_from_system_call;
     current_pcb->thread->rsp = (ul)current_pcb + STACK_SIZE - sizeof(struct pt_regs);
     current_pcb->thread->fs = USER_DS | 0x3;