Diff for /linux/kernel/sys_call.s between versions 1.1 and 1.1.1.2

version 1.1, 2018/04/24 18:03:18 version 1.1.1.2, 2018/04/24 18:04:28
Line 15 Line 15
  * unnecessarily.   * unnecessarily.
  *   *
  * Stack layout in 'ret_from_system_call':   * Stack layout in 'ret_from_system_call':
    *      ptrace needs to have all regs on the stack.
    *      if the order here is changed, it needs to be 
    *      updated in fork.c:copy_process, signal.c:do_signal,
    *      ptrace.c ptrace.h
  *   *
  *       0(%esp) - %eax   *       0(%esp) - %ebx
  *       4(%esp) - %ebx   *       4(%esp) - %ecx
  *       8(%esp) - %ecx   *       8(%esp) - %edx
  *       C(%esp) - %edx   *       C(%esp) - %esi
  *      10(%esp) - original %eax        (-1 if not system call)   *      10(%esp) - %edi
  *      14(%esp) - %fs   *      14(%esp) - %ebp
  *      18(%esp) - %es   *      18(%esp) - %eax
  *      1C(%esp) - %ds   *      1C(%esp) - %ds
  *      20(%esp) - %eip   *      20(%esp) - %es
  *      24(%esp) - %cs   *      24(%esp) - %fs
  *      28(%esp) - %eflags   *      28(%esp) - %gs
  *      2C(%esp) - %oldesp   *      2C(%esp) - orig_eax
  *      30(%esp) - %oldss   *      30(%esp) - %eip
    *      34(%esp) - %cs
    *      38(%esp) - %eflags
    *      3C(%esp) - %oldesp
    *      40(%esp) - %oldss
  */   */
   
 SIG_CHLD        = 17  SIG_CHLD        = 17
   
 EAX             = 0x00  EBX             = 0x00
 EBX             = 0x04  ECX             = 0x04
 ECX             = 0x08  EDX             = 0x08
 EDX             = 0x0C  ESI             = 0x0C
 ORIG_EAX        = 0x10  EDI             = 0x10
 FS              = 0x14  EBP             = 0x14
 ES              = 0x18  EAX             = 0x18
 DS              = 0x1C  DS              = 0x1C
 EIP             = 0x20  ES              = 0x20
 CS              = 0x24  FS              = 0x24
 EFLAGS          = 0x28  GS              = 0x28
 OLDESP          = 0x2C  ORIG_EAX        = 0x2C
 OLDSS           = 0x30  EIP             = 0x30
   CS              = 0x34
   EFLAGS          = 0x38
   OLDESP          = 0x3C
   OLDSS           = 0x40
   
 state   = 0             # these are offsets into the task-struct.  state   = 0             # these are offsets into the task-struct.
 counter = 4  counter = 4
Line 68  ENOSYS = 38 Line 80  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,_sys_fork,_timer_interrupt,_sys_execve  .globl _system_call,_timer_interrupt,_sys_execve
 .globl _hd_interrupt,_floppy_interrupt,_parallel_interrupt  .globl _hd_interrupt,_floppy_interrupt,_parallel_interrupt
 .globl _device_not_available, _coprocessor_error  .globl _device_not_available, _coprocessor_error
   
Line 82  reschedule: Line 94  reschedule:
         jmp _schedule          jmp _schedule
 .align 2  .align 2
 _system_call:  _system_call:
         push %ds          cld
         push %es          pushl %eax              # save orig_eax
           push %gs
         push %fs          push %fs
         pushl %eax              # save the orig_eax          push %es
           push %ds
           pushl %eax              # save eax.  The return value will be put here.
           pushl %ebp
           pushl %edi
           pushl %esi
         pushl %edx                        pushl %edx              
         pushl %ecx              # push %ebx,%ecx,%edx as parameters          pushl %ecx              # push %ebx,%ecx,%edx as parameters
         pushl %ebx              # to the system call          pushl %ebx              # to the system call
Line 97  _system_call: Line 115  _system_call:
         cmpl _NR_syscalls,%eax          cmpl _NR_syscalls,%eax
         jae bad_sys_call          jae bad_sys_call
         call _sys_call_table(,%eax,4)          call _sys_call_table(,%eax,4)
         pushl %eax          movl %eax,EAX(%esp)             # save the return value
 2:  2:      movl _current,%eax
         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
Line 126  ret_from_sys_call: Line 143  ret_from_sys_call:
         popl %ecx          popl %ecx
         testl %eax, %eax          testl %eax, %eax
         jne 2b          # see if we need to switch tasks, or do more signals          jne 2b          # see if we need to switch tasks, or do more signals
 3:      popl %eax  3:
         popl %ebx          popl %ebx
         popl %ecx          popl %ecx
         popl %edx          popl %edx
         addl $4, %esp   # skip orig_eax          popl %esi
         pop %fs          popl %edi
         pop %es          popl %ebp
           popl %eax
         pop %ds          pop %ds
           pop %es
           pop %fs
           pop %gs
           addl $4,%esp            # skip the orig_eax
         iret          iret
   
 .align 2  .align 2
 _coprocessor_error:  _coprocessor_error:
         push %ds          cld
         push %es          pushl $-1               # mark this as an int. 
           push %gs
         push %fs          push %fs
         pushl $-1               # fill in -1 for orig_eax          push %es
           push %ds
           pushl %eax              # save eax.
           pushl %ebp
           pushl %edi
           pushl %esi
         pushl %edx          pushl %edx
         pushl %ecx          pushl %ecx
         pushl %ebx          pushl %ebx
         pushl %eax  
         movl $0x10,%eax          movl $0x10,%eax
         mov %ax,%ds          mov %ax,%ds
         mov %ax,%es          mov %ax,%es
Line 156  _coprocessor_error: Line 183  _coprocessor_error:
   
 .align 2  .align 2
 _device_not_available:  _device_not_available:
         push %ds          cld
         push %es          pushl $-1               # mark this as an int
           push %gs
         push %fs          push %fs
         pushl $-1               # fill in -1 for orig_eax          push %es
           push %ds
           pushl %eax              
           pushl %ebp
           pushl %edi
           pushl %esi
         pushl %edx          pushl %edx
         pushl %ecx          pushl %ecx
         pushl %ebx          pushl %ebx
         pushl %eax  
         movl $0x10,%eax          movl $0x10,%eax
         mov %ax,%ds          mov %ax,%ds
         mov %ax,%es          mov %ax,%es
Line 174  _device_not_available: Line 206  _device_not_available:
         movl %cr0,%eax          movl %cr0,%eax
         testl $0x4,%eax                 # EM (math emulation bit)          testl $0x4,%eax                 # EM (math emulation bit)
         je _math_state_restore          je _math_state_restore
         pushl %ebp  
         pushl %esi  
         pushl %edi  
         pushl $0                # temporary storage for ORIG_EIP          pushl $0                # temporary storage for ORIG_EIP
         call _math_emulate          call _math_emulate
         addl $4,%esp          addl $4,%esp
         popl %edi  
         popl %esi  
         popl %ebp  
         ret          ret
   
 .align 2  .align 2
 _timer_interrupt:  _timer_interrupt:
         push %ds                # save ds,es and put kernel data space          cld
         push %es                # into them. %fs is used by _system_call          pushl $-1               # mark this as an int
           push %gs
         push %fs          push %fs
         pushl $-1               # fill in -1 for orig_eax          push %es
         pushl %edx              # we save %eax,%ecx,%edx as gcc doesn't          push %ds
         pushl %ecx              # save those across function calls. %ebx  
         pushl %ebx              # is saved as we use that in ret_sys_call  
         pushl %eax          pushl %eax
           pushl %ebp
           pushl %edi
           pushl %esi
           pushl %edx              
           pushl %ecx
           pushl %ebx
         movl $0x10,%eax          movl $0x10,%eax
         mov %ax,%ds          mov %ax,%ds
         mov %ax,%es          mov %ax,%es
Line 212  _timer_interrupt: Line 243  _timer_interrupt:
   
 .align 2  .align 2
 _sys_execve:  _sys_execve:
         lea EIP(%esp),%eax          lea (EIP+4)(%esp),%eax  # don't forget about the return address.
         pushl %eax          pushl %eax
         call _do_execve          call _do_execve
         addl $4,%esp          addl $4,%esp
         ret          ret
   
 .align 2  
 _sys_fork:  
         call _find_empty_process  
         testl %eax,%eax  
         js 1f  
         push %gs  
         pushl %esi  
         pushl %edi  
         pushl %ebp  
         pushl %eax  
         call _copy_process  
         addl $20,%esp  
 1:      ret  
   
 _hd_interrupt:  _hd_interrupt:
           cld
         pushl %eax          pushl %eax
         pushl %ecx          pushl %ecx
         pushl %edx          pushl %edx
Line 248  _hd_interrupt: Line 266  _hd_interrupt:
         outb %al,$0xA0          # EOI to interrupt controller #1          outb %al,$0xA0          # EOI to interrupt controller #1
         jmp 1f                  # give port chance to breathe          jmp 1f                  # give port chance to breathe
 1:      jmp 1f  1:      jmp 1f
 1:      xorl %edx,%edx  1:      outb %al,$0x20
         movl %edx,_hd_timeout          andl $0xfffeffff,_timer_active
           xorl %edx,%edx
         xchgl _do_hd,%edx          xchgl _do_hd,%edx
         testl %edx,%edx          testl %edx,%edx
         jne 1f          jne 1f
         movl $_unexpected_hd_interrupt,%edx          movl $_unexpected_hd_interrupt,%edx
 1:      outb %al,$0x20  1:      call *%edx              # "interesting" way of handling intr.
         call *%edx              # "interesting" way of handling intr.  
         pop %fs          pop %fs
         pop %es          pop %es
         pop %ds          pop %ds
Line 265  _hd_interrupt: Line 283  _hd_interrupt:
         iret          iret
   
 _floppy_interrupt:  _floppy_interrupt:
           cld
         pushl %eax          pushl %eax
         pushl %ecx          pushl %ecx
         pushl %edx          pushl %edx
Line 293  _floppy_interrupt: Line 312  _floppy_interrupt:
         iret          iret
   
 _parallel_interrupt:  _parallel_interrupt:
           cld
         pushl %eax          pushl %eax
         movb $0x20,%al          movb $0x20,%al
         outb %al,$0x20          outb %al,$0x20

Removed from v.1.1  
changed lines
  Added in v.1.1.1.2


unix.superglobalmegacorp.com