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

version 1.1.1.3, 2018/04/24 18:11:24 version 1.1.1.5, 2018/04/24 18:15:13
Line 1 Line 1
 /*  /*
  *  linux/kernel/sys_call.S   *  linux/kernel/sys_call.S
  *   *
  *  (C) 1991  Linus Torvalds   *  Copyright (C) 1991, 1992  Linus Torvalds
  */   */
   
 /*  /*
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 37 Line 40
  *      40(%esp) - %oldss   *      40(%esp) - %oldss
  */   */
   
 SIG_CHLD        = 17  
   
 EBX             = 0x00  EBX             = 0x00
 ECX             = 0x04  ECX             = 0x04
 EDX             = 0x08  EDX             = 0x08
Line 57  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 66  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 77  sa_restorer = 12 Line 83  sa_restorer = 12
   
 ENOSYS = 38  ENOSYS = 38
   
 /*  .globl _system_call,_sys_execve
  * Ok, I get parallel printer interrupts while using the floppy for some  
  * strange reason. Urgel. Now I just ignore them.  
  */  
 .globl _system_call,_timer_interrupt,_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
 .globl _double_fault,_coprocessor_segment_overrun  .globl _double_fault,_coprocessor_segment_overrun
 .globl _invalid_TSS,_segment_not_present,_stack_segment  .globl _invalid_TSS,_segment_not_present,_stack_segment
 .globl _general_protection,_irq13,_reserved  .globl _general_protection,_reserved
 .globl _alignment_check,_page_fault  .globl _alignment_check,_page_fault
 .globl _keyboard_interrupt,_hd_interrupt  .globl ret_from_sys_call
 .globl _IRQ3_interrupt,_IRQ4_interrupt,_IRQ5_interrupt,_IRQ9_interrupt  
   
 #define SAVE_ALL \  #define SAVE_ALL \
         cld; \          cld; \
Line 110  ENOSYS = 38 Line 111  ENOSYS = 38
         movl $0x17,%edx; \          movl $0x17,%edx; \
         mov %dx,%fs          mov %dx,%fs
   
 #define ACK_FIRST(mask) \  .align 4
         inb $0x21,%al; \  
         jmp 1f; \  
 1:      jmp 1f; \  
 1:      orb $(mask),%al; \  
         outb %al,$0x21; \  
         jmp 1f; \  
 1:      jmp 1f; \  
 1:      movb $0x20,%al; \  
         outb %al,$0x20  
   
 #define ACK_SECOND(mask) \  
         inb $0xA1,%al; \  
         jmp 1f; \  
 1:      jmp 1f; \  
 1:      orb $(mask),%al; \  
         outb %al,$0xA1; \  
         jmp 1f; \  
 1:      jmp 1f; \  
 1:      movb $0x20,%al; \  
         outb %al,$0xA0 \  
         jmp 1f; \  
 1:      jmp 1f; \  
 1:      outb %al,$0x20  
   
 #define UNBLK_FIRST(mask) \  
         inb $0x21,%al; \  
         jmp 1f; \  
 1:      jmp 1f; \  
 1:      andb $~(mask),%al; \  
         outb %al,$0x21  
   
 #define UNBLK_SECOND(mask) \  
         inb $0xA1,%al; \  
         jmp 1f; \  
 1:      jmp 1f; \  
 1:      andb $~(mask),%al; \  
         outb %al,$0xA1  
   
 .align 2  
 bad_sys_call:  
         movl $-ENOSYS,EAX(%esp)  
         jmp ret_from_sys_call  
 .align 2  
 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
           movl $-ENOSYS,EAX(%esp)
         cmpl _NR_syscalls,%eax          cmpl _NR_syscalls,%eax
         jae bad_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
 1:      movl _current,%eax  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
           jne reschedule
           movl _current,%eax
         cmpl _task,%eax                 # task[0] cannot have signals          cmpl _task,%eax                 # task[0] cannot have signals
         je 2f          je 2f
         cmpl $0,_need_resched  
         jne reschedule  
         cmpl $0,state(%eax)             # state          cmpl $0,state(%eax)             # state
         jne reschedule          jne reschedule
         cmpl $0,counter(%eax)           # counter          cmpl $0,counter(%eax)           # counter
Line 186  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 210  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
 _irq13:  
         pushl %eax  
         xorb %al,%al  
         outb %al,$0xF0  
         movb $0x20,%al  
         outb %al,$0x20  
         jmp 1f  
 1:      jmp 1f  
 1:      outb %al,$0xA0  
         popl %eax  
 _coprocessor_error:  
         pushl $-1               # mark this as an int.   
         SAVE_ALL  
         pushl $ret_from_sys_call  
         jmp _math_error  
   
 .align 2  
 _device_not_available:  
         pushl $-1               # mark this as an int  
         SAVE_ALL  
         pushl $ret_from_sys_call  
         clts                            # clear TS so that we can use math  
         movl %cr0,%eax  
         testl $0x4,%eax                 # EM (math emulation bit)  
         je _math_state_restore  
         pushl $0                # temporary storage for ORIG_EIP  
         call _math_emulate  
         addl $4,%esp  
         ret  
   
 .align 2  
 _keyboard_interrupt:  
         pushl $-1  
         SAVE_ALL  
         ACK_FIRST(0x02)  
         sti  
         call _do_keyboard  
         cli  
         UNBLK_FIRST(0x02)  
         jmp ret_from_sys_call  
   
 .align 2  
 _IRQ3_interrupt:  
         pushl $-1  
         SAVE_ALL  
         ACK_FIRST(0x08)  
         sti  
         pushl $3  
         call _do_IRQ  
         addl $4,%esp  
         cli  
         UNBLK_FIRST(0x08)  
         jmp ret_from_sys_call  
   
 .align 2  
 _IRQ4_interrupt:  
         pushl $-1  
         SAVE_ALL  
         ACK_FIRST(0x10)  
         sti  
         pushl $4  
         call _do_IRQ  
         addl $4,%esp  
         cli  
         UNBLK_FIRST(0x10)  
         jmp ret_from_sys_call  
   
 .align 2  
 _IRQ5_interrupt:  
         pushl $-1  
         SAVE_ALL  
         ACK_FIRST(0x20)  
         sti  
         pushl $5  
         call _do_IRQ  
         addl $4,%esp  
         cli  
         UNBLK_FIRST(0x20)  
         jmp ret_from_sys_call  
   
 .align 2  
 _IRQ9_interrupt:  
         pushl $-1  
         SAVE_ALL  
         ACK_SECOND(0x02)  
         sti  
         pushl $9  
         call _do_IRQ  
         addl $4,%esp  
         cli  
         UNBLK_SECOND(0x02)  
         jmp ret_from_sys_call  
   
 .align 2  
 _timer_interrupt:  
         pushl $-1               # mark this as an int  
         SAVE_ALL  
         ACK_FIRST(0x01)  
         sti  
         incl _jiffies  
         movl CS(%esp),%eax  
         andl $3,%eax            # %eax is CPL (0 or 3, 0=supervisor)  
         pushl %eax  
         call _do_timer          # 'do_timer(long CPL)' does everything from  
         addl $4,%esp            # task switching to accounting ...  
         cli  
         UNBLK_FIRST(0x01)  
         jmp ret_from_sys_call  
   
 .align 2  
 _hd_interrupt:  
         pushl $-1  
         SAVE_ALL  
         ACK_SECOND(0x40)  
         andl $0xfffeffff,_timer_active  
         xorl %edx,%edx  
         xchgl _do_hd,%edx  
         testl %edx,%edx  
         jne 1f  
         movl $_unexpected_hd_interrupt,%edx  
 1:      call *%edx              # "interesting" way of handling intr.  
         cli  
         UNBLK_SECOND(0x40)  
         jmp ret_from_sys_call  
   
 .align 2  
 _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 344  _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 376  error_code: Line 226  error_code:
         addl $8,%esp          addl $8,%esp
         jmp ret_from_sys_call          jmp ret_from_sys_call
   
   .align 4
   _coprocessor_error:
           pushl $0
           pushl $_do_coprocessor_error
           jmp error_code
   
   .align 4
   _device_not_available:
           pushl $-1               # mark this as an int
           SAVE_ALL
           pushl $ret_from_sys_call
           clts                            # clear TS so that we can use math
           movl %cr0,%eax
           testl $0x4,%eax                 # EM (math emulation bit)
           je _math_state_restore
           pushl $0                # temporary storage for ORIG_EIP
           call _math_emulate
           addl $4,%esp
           ret
   
   .align 4
 _debug:  _debug:
         pushl $0          pushl $0
         pushl $_do_int3         # _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.3  
changed lines
  Added in v.1.1.1.5


unix.superglobalmegacorp.com