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

version 1.1.1.3, 2018/04/24 18:11:24 version 1.1.1.4, 2018/04/24 18:13:09
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 37 Line 37
  *      40(%esp) - %oldss   *      40(%esp) - %oldss
  */   */
   
 SIG_CHLD        = 17  
   
 EBX             = 0x00  EBX             = 0x00
 ECX             = 0x04  ECX             = 0x04
 EDX             = 0x08  EDX             = 0x08
Line 81  ENOSYS = 38 Line 79  ENOSYS = 38
  * Ok, I get parallel printer interrupts while using the floppy for some   * Ok, I get parallel printer interrupts while using the floppy for some
  * strange reason. Urgel. Now I just ignore them.   * strange reason. Urgel. Now I just ignore them.
  */   */
 .globl _system_call,_timer_interrupt,_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
 .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 107  ENOSYS = 38
         movl $0x17,%edx; \          movl $0x17,%edx; \
         mov %dx,%fs          mov %dx,%fs
   
 #define ACK_FIRST(mask) \  
         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  .align 2
 reschedule:  reschedule:
         pushl $ret_from_sys_call          pushl $ret_from_sys_call
         jmp _schedule          jmp _schedule
 .align 2  .align 2
 _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
 ret_from_sys_call:  ret_from_sys_call:
Line 170  ret_from_sys_call: Line 125  ret_from_sys_call:
         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  1:      cmpl $0,_need_resched
         cmpl _task,%eax                 # task[0] cannot have signals  
         je 2f  
         cmpl $0,_need_resched  
         jne reschedule          jne reschedule
           movl _current,%eax
         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 211  ret_from_sys_call: Line 168  ret_from_sys_call:
         iret          iret
   
 .align 2  .align 2
 _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 376  error_code: Line 207  error_code:
         addl $8,%esp          addl $8,%esp
         jmp ret_from_sys_call          jmp ret_from_sys_call
   
   .align 2
   _coprocessor_error:
           pushl $0
           pushl $_do_coprocessor_error
           jmp error_code
   
   .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
   
 _debug:  _debug:
         pushl $0          pushl $0
         pushl $_do_int3         # _do_debug          pushl $_do_debug
         jmp error_code          jmp error_code
   
 _nmi:  _nmi:

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


unix.superglobalmegacorp.com