Merge branch 'master' into signal-dev
authorMinep <zelong56@gmail.com>
Thu, 16 Jun 2022 16:20:38 +0000 (17:20 +0100)
committerMinep <zelong56@gmail.com>
Thu, 16 Jun 2022 16:20:38 +0000 (17:20 +0100)
1  2 
lunaix-os/kernel/asm/x86/interrupt.S
lunaix-os/kernel/sched.c

index 62c9ec512630270ec3215451ea7e33eca587244d,a03bce613f3897b5fe65c54d15be68a9e9670453..27bdc4c4cab8a0fcac2d8813bacf81b81f057d9d
@@@ -1,7 -1,6 +1,7 @@@
  #define __ASM__
  #include <arch/x86/interrupts.h>
  #include <lunaix/common.h>
 +#include <lunaix/syscall.h>
  #define __ASM_INTR_DIAGNOSIS
  
  .macro isr_template vector, no_error_code=1
  
      interrupt_wrapper:
          /*
 -         Stack layout
 +         Stack layout (layout of struct isr_param)
      msa:   [ss]
             [esp]
 -           eflags
 +           eflags     > offset = 48 + 16 = 64
             cs
             eip
             err_code   
@@@ -63,7 -62,6 +63,7 @@@
              las: Least Significant Address
              msa: Most Significant Address
          */
 +        cld
          pushl %esp
  
          subl $16, %esp
          movw %ax, %ds
          movw %ax, %es
  
 +        # 保存用户栈顶指针。这是因为我们允许系统调用内进行上下文切换,而这样一来,我们就失去了用户栈的信息,
 +        # 这样一来,就无法设置信号上下文。这主要是为了实现了pause()而做的准备
 +        movl (__current), %eax  
 +        movl 68(%esp), %ebx     # 取出esp
 +        movl %ebx, 84(%eax)     # 存入__current->ustack_top
 +
      1:
          movl %esp, %eax
          andl $0xfffffff0, %esp
  
          call intr_handler
  
+         movl (%esp), %eax
      .global soft_iret
      soft_iret:
-         cli
-         popl %esp
+         movl %eax, %esp
  
          popl %eax
          popl %ebx
          popl %eax
  #endif
          iret
 +
 +    handle_signal:
 +        # 注意1:任何对proc_sig的布局改动,都须及时的保证这里的一致性!
 +        # 注意2:handle_signal在调用之前,须确保proc_sig已经写入用户栈!
 +        popl %eax               # arg1: addr of proc_sig structure in user stack
 +        leal 8(%eax), %ebx
 +
 +        pushl 72(%ebx)          # proc_sig->prev_context.ss
 +        pushl %eax              # esp
 +        pushl 64(%ebx)          # proc_sig->prev_context.eflags
 +        pushl $UCODE_SEG        # cs
 +        pushl $sig_wrapper      # eip for sig wrapper
 +
 +        movw $UDATA_SEG, %cx    # switch data seg to user mode
 +        movw %cx, %es
 +        movw %cx, %ds
 +        movw %cx, %fs
 +        movw %cx, %gs
 +
 +        iret  
 +
 +    sig_wrapper:                # in user mode
 +        movl %esp, %eax
 +        and $0xfffffff0, %esp
 +        subl $8, %esp
 +        pushl %eax              # Addr to proc_sig structure 
 +        pushl 4(%eax)           # proc_sig->sig_num     ---- 16 bytes aligned
 +
 +        call (%eax)             # invoke signal handler
 +
 +        # invoke the sigreturn syscall to exit the signal wrapper
 +        movl $__SYSCALL_sigreturn, %eax
 +        movl 4(%esp), %ebx
 +        int $LUNAIX_SYS_CALL    
 +
 +        ud2                     # never reach!
diff --combined lunaix-os/kernel/sched.c
index 8e5eecbd342c511c29c2069aab8a6ec930947f19,8c43b149d3eb761ec094269a765ba9808ca775ea..026fb515a8dbfbc34410e868de18ccad40b7b308
@@@ -1,14 -1,12 +1,14 @@@
  #include <arch/x86/interrupts.h>
  #include <arch/x86/tss.h>
 +
  #include <hal/apic.h>
  #include <hal/cpu.h>
 +
  #include <lunaix/mm/kalloc.h>
  #include <lunaix/mm/vmm.h>
  #include <lunaix/process.h>
  #include <lunaix/sched.h>
 -
 +#include <lunaix/signal.h>
  #include <lunaix/spike.h>
  #include <lunaix/status.h>
  #include <lunaix/syscall.h>
@@@ -60,11 -58,9 +60,11 @@@ run(struct proc_info* proc
  
      apic_done_servicing();
  
-     asm volatile("pushl %0\n"
 +    signal_dispatch();
 +
+     asm volatile("movl %0, %%eax\n"
                   "jmp soft_iret\n" ::"r"(&__current->intr_ctx)
-                  : "memory");
+                  : "eax", "memory");
  }
  
  void