Diff for /linux/kernel/sys_call.S between versions 1.1.1.4 and 1.1.1.5

version 1.1.1.4, 2018/04/24 18:13:09 version 1.1.1.5, 2018/04/24 18:15:13
Line 12 Line 12
  * NOTE: This code handles signal-recognition, which happens every time   * NOTE: This code handles signal-recognition, which happens every time
  * after a timer-interrupt and after each system call.   * after a timer-interrupt and after each system call.
  *   *
    * I changed all the .align's to 4 (16 byte alignment), as that's faster
    * on a 486.
    *
  * Stack layout in 'ret_from_system_call':   * Stack layout in 'ret_from_system_call':
  *      ptrace needs to have all regs on the stack.   *      ptrace needs to have all regs on the stack.
  *      if the order here is changed, it needs to be    *      if the order here is changed, it needs to be 
Line 55  EFLAGS  = 0x38 Line 58  EFLAGS  = 0x38
 OLDESP          = 0x3C  OLDESP          = 0x3C
 OLDSS           = 0x40  OLDSS           = 0x40
   
   IF_MASK         = 0x00000200
   NT_MASK         = 0x00004000
   VM_MASK         = 0x00020000
   
 /*  /*
  * these are offsets into the task-struct.   * these are offsets into the task-struct.
  */   */
Line 64  priority = 8 Line 71  priority = 8
 signal          = 12  signal          = 12
 sigaction       = 16            # MUST be 16 (=len of sigaction)  sigaction       = 16            # MUST be 16 (=len of sigaction)
 blocked         = (33*16)  blocked         = (33*16)
   saved_kernel_stack = ((33*16)+4)
   
 /*  /*
  * offsets within sigaction   * offsets within sigaction
Line 75  sa_restorer = 12 Line 83  sa_restorer = 12
   
 ENOSYS = 38  ENOSYS = 38
   
 /*  
  * Ok, I get parallel printer interrupts while using the floppy for some  
  * strange reason. Urgel. Now I just ignore them.  
  */  
 .globl _system_call,_sys_execve  .globl _system_call,_sys_execve
 .globl _device_not_available, _coprocessor_error  .globl _device_not_available, _coprocessor_error
 .globl _divide_error,_debug,_nmi,_int3,_overflow,_bounds,_invalid_op  .globl _divide_error,_debug,_nmi,_int3,_overflow,_bounds,_invalid_op
Line 107  ENOSYS = 38 Line 111  ENOSYS = 38
         movl $0x17,%edx; \          movl $0x17,%edx; \
         mov %dx,%fs          mov %dx,%fs
   
 .align 2  .align 4
 reschedule:  reschedule:
         pushl $ret_from_sys_call          pushl $ret_from_sys_call
         jmp _schedule          jmp _schedule
 .align 2  .align 4
 _system_call:  _system_call:
         pushl %eax                      # save orig_eax          pushl %eax                      # save orig_eax
         SAVE_ALL          SAVE_ALL
Line 120  _system_call: Line 124  _system_call:
         jae ret_from_sys_call          jae ret_from_sys_call
         call _sys_call_table(,%eax,4)          call _sys_call_table(,%eax,4)
         movl %eax,EAX(%esp)             # save the return value          movl %eax,EAX(%esp)             # save the return value
           .align 4,0x90
 ret_from_sys_call:  ret_from_sys_call:
           movl EFLAGS(%esp),%eax          # check VM86 flag: CS/SS are
           testl $VM_MASK,%eax             # different then
           jne 4f
         cmpw $0x0f,CS(%esp)             # was old code segment supervisor ?          cmpw $0x0f,CS(%esp)             # was old code segment supervisor ?
         jne 2f          jne 2f
         cmpw $0x17,OLDSS(%esp)          # was stack segment = 0x17 ?          cmpw $0x17,OLDSS(%esp)          # was stack segment = 0x17 ?
         jne 2f          jne 2f
   4:      orl $IF_MASK,%eax               # these just try to make sure
           andl $~NT_MASK,%eax             # the program doesn't do anything
           movl %eax,EFLAGS(%esp)          # stupid
 1:      cmpl $0,_need_resched  1:      cmpl $0,_need_resched
         jne reschedule          jne reschedule
         movl _current,%eax          movl _current,%eax
           cmpl _task,%eax                 # task[0] cannot have signals
           je 2f
         cmpl $0,state(%eax)             # state          cmpl $0,state(%eax)             # state
         jne reschedule          jne reschedule
         cmpl $0,counter(%eax)           # counter          cmpl $0,counter(%eax)           # counter
         je reschedule          je reschedule
         movl $1,_need_resched  
         cmpl _task,%eax                 # task[0] cannot have signals  
         je 2f  
         movl $0,_need_resched  
         movl signal(%eax),%ebx          movl signal(%eax),%ebx
         movl blocked(%eax),%ecx          movl blocked(%eax),%ecx
         notl %ecx          notl %ecx
Line 143  ret_from_sys_call: Line 152  ret_from_sys_call:
         bsfl %ecx,%ecx          bsfl %ecx,%ecx
         je 2f          je 2f
         btrl %ecx,%ebx          btrl %ecx,%ebx
           incl %ecx
         movl %ebx,signal(%eax)          movl %ebx,signal(%eax)
         movl %esp,%ebx          movl %esp,%ebx
           testl $VM_MASK,EFLAGS(%esp)
           je 3f
         pushl %ebx          pushl %ebx
         incl %ecx          pushl %ecx
           call _save_v86_state
           popl %ecx
           movl %eax,%ebx
           movl %eax,%esp
   3:      pushl %ebx
         pushl %ecx          pushl %ecx
         call _do_signal          call _do_signal
         popl %ecx          popl %ecx
Line 167  ret_from_sys_call: Line 184  ret_from_sys_call:
         addl $4,%esp            # skip the orig_eax          addl $4,%esp            # skip the orig_eax
         iret          iret
   
 .align 2  .align 4
 _sys_execve:  _sys_execve:
         lea (EIP+4)(%esp),%eax  # don't forget about the return address.          lea (EIP+4)(%esp),%eax  # don't forget about the return address.
         pushl %eax          pushl %eax
Line 175  _sys_execve: Line 192  _sys_execve:
         addl $4,%esp          addl $4,%esp
         ret          ret
   
   .align 4
 _divide_error:  _divide_error:
         pushl $0                # no error code          pushl $0                # no error code
         pushl $_do_divide_error          pushl $_do_divide_error
   .align 4,0x90
 error_code:  error_code:
         push %fs          push %fs
         push %es          push %es
Line 207  error_code: Line 226  error_code:
         addl $8,%esp          addl $8,%esp
         jmp ret_from_sys_call          jmp ret_from_sys_call
   
 .align 2  .align 4
 _coprocessor_error:  _coprocessor_error:
         pushl $0          pushl $0
         pushl $_do_coprocessor_error          pushl $_do_coprocessor_error
         jmp error_code          jmp error_code
   
 .align 2  .align 4
 _device_not_available:  _device_not_available:
         pushl $-1               # mark this as an int          pushl $-1               # mark this as an int
         SAVE_ALL          SAVE_ALL
Line 227  _device_not_available: Line 246  _device_not_available:
         addl $4,%esp          addl $4,%esp
         ret          ret
   
   .align 4
 _debug:  _debug:
         pushl $0          pushl $0
         pushl $_do_debug          pushl $_do_debug
         jmp error_code          jmp error_code
   
   .align 4
 _nmi:  _nmi:
         pushl $0          pushl $0
         pushl $_do_nmi          pushl $_do_nmi
         jmp error_code          jmp error_code
   
   .align 4
 _int3:  _int3:
         pushl $0          pushl $0
         pushl $_do_int3          pushl $_do_int3
         jmp error_code          jmp error_code
   
   .align 4
 _overflow:  _overflow:
         pushl $0          pushl $0
         pushl $_do_overflow          pushl $_do_overflow
         jmp error_code          jmp error_code
   
   .align 4
 _bounds:  _bounds:
         pushl $0          pushl $0
         pushl $_do_bounds          pushl $_do_bounds
         jmp error_code          jmp error_code
   
   .align 4
 _invalid_op:  _invalid_op:
         pushl $0          pushl $0
         pushl $_do_invalid_op          pushl $_do_invalid_op
         jmp error_code          jmp error_code
   
   .align 4
 _coprocessor_segment_overrun:  _coprocessor_segment_overrun:
         pushl $0          pushl $0
         pushl $_do_coprocessor_segment_overrun          pushl $_do_coprocessor_segment_overrun
         jmp error_code          jmp error_code
   
   .align 4
 _reserved:  _reserved:
         pushl $0          pushl $0
         pushl $_do_reserved          pushl $_do_reserved
         jmp error_code          jmp error_code
   
   .align 4
 _double_fault:  _double_fault:
         pushl $_do_double_fault          pushl $_do_double_fault
         jmp error_code          jmp error_code
   
   .align 4
 _invalid_TSS:  _invalid_TSS:
         pushl $_do_invalid_TSS          pushl $_do_invalid_TSS
         jmp error_code          jmp error_code
   
   .align 4
 _segment_not_present:  _segment_not_present:
         pushl $_do_segment_not_present          pushl $_do_segment_not_present
         jmp error_code          jmp error_code
   
   .align 4
 _stack_segment:  _stack_segment:
         pushl $_do_stack_segment          pushl $_do_stack_segment
         jmp error_code          jmp error_code
   
   .align 4
 _general_protection:  _general_protection:
         pushl $_do_general_protection          pushl $_do_general_protection
         jmp error_code          jmp error_code
   
   .align 4
 _alignment_check:  _alignment_check:
         pushl $_do_alignment_check          pushl $_do_alignment_check
         jmp error_code          jmp error_code
   
   .align 4
 _page_fault:  _page_fault:
         pushl $_do_page_fault          pushl $_do_page_fault
         jmp error_code          jmp error_code

Removed from v.1.1.1.4  
changed lines
  Added in v.1.1.1.5


unix.superglobalmegacorp.com