home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / LIBC / LIBC-4.6 / LIBC-4 / libc-linux / sysdeps / linux / i386 / syscall.S < prev    next >
Encoding:
Text File  |  1994-11-19  |  3.3 KB  |  142 lines

  1.     .file    "syscall.S"
  2.  
  3. #ifdef __ELF__
  4. #if defined(__i486__) || defined(i486)
  5. #define ALIGN 16
  6. #else
  7. #define ALIGN 4
  8. #endif
  9. #else
  10. #if defined(__i486__) || defined(i486)
  11. #define ALIGN 4
  12. #else
  13. #define ALIGN 2
  14. #endif
  15. #endif
  16.  
  17. #ifdef __ELF__
  18. #define SYMBOL_NAME(X) X
  19. #define SYMBOL_NAME_LABEL(X) X##:
  20. #else
  21. #define SYMBOL_NAME(X) _##X
  22. #define SYMBOL_NAME_LABEL(X) _##X##:
  23. #endif
  24.  
  25. #define ERRNO SYMBOL_NAME(errno)
  26.  
  27. #ifdef __ELF__
  28. #define    ENTRY(name)                                  \
  29.   .globl SYMBOL_NAME(name);                              \
  30.   .globl ERRNO;                                      \
  31.   .align ALIGN;                                      \
  32.   SYMBOL_NAME_LABEL(name)
  33. #else
  34. #define    ENTRY(name)                                  \
  35.   .globl _##name##;                                  \
  36.   .align ALIGN;                                      \
  37.   SYMBOL_NAME_LABEL(name)
  38. #endif
  39.  
  40. /* Use this for the different syntaxes for local assembler labels */
  41. #ifdef __ELF__
  42. #define L(X) .L##X
  43. #define LF(X) .L##X
  44. #define LL(X) .L##X##:
  45. #else
  46. #define L(X) X
  47. #define LF(X) X##f
  48. #define LL(X) X##:
  49. #endif
  50.  
  51. #if defined(__PIC__) || defined (__pic__)
  52. #define    PSEUDO(name, args)                              \
  53.   .text;                                      \
  54.   ENTRY (name)                                      \
  55.     pushl %ebp;                                      \
  56.     movl %esp,%ebp;                                  \
  57.     PUSH_##args                                      \
  58.     call L(L4);                                      \
  59.    LL(L4)                                      \
  60.     popl %ebx;                                      \
  61.     addl $_GLOBAL_OFFSET_TABLE_+[.-L(L4)],%ebx;                      \
  62.     pushl %ebx;                                      \
  63.     MOVE_##args                                      \
  64.     int $0x80;                                      \
  65.     popl %ebx;                                      \
  66.     movl %eax,%edx;                                  \
  67.     test %edx,%edx;                                  \
  68.     jge    L(Lexit);                                  \
  69.     negl %edx;                                      \
  70.     movl ERRNO@GOT(%ebx),%eax;                              \
  71.     movl %edx,(%eax);                                  \
  72.     movl $-1,%eax;                                  \
  73.    LL(Lexit)                                      \
  74.     POP_##args                                       \
  75.     movl %ebp,%esp;                                  \
  76.     popl %ebp;
  77.  
  78. #else
  79.  
  80. /* This is not ELF compatible, but it does not matter, since ELF is
  81.    always PIC */
  82. #define    PSEUDO(name, args)                              \
  83.   .text;                                      \
  84.   ENTRY (name)                                      \
  85.     pushl %ebp;                                      \
  86.     movl %esp,%ebp;                                  \
  87.     PUSH_##args                                      \
  88.     MOVE_##args                                      \
  89.     int $0x80;                                      \
  90.     test %eax, %eax;                                  \
  91.     jge    Lexit;                                      \
  92.     negl %eax;                                      \
  93.     movl %eax,_errno;                                  \
  94.     movl $-1,%eax;                                  \
  95.    Lexit:                                      \
  96.     POP_##args                                      \
  97.     movl %ebp,%esp;                                  \
  98.     popl %ebp;
  99.  
  100. #endif
  101.  
  102. /* Linux takes system call arguments in registers:
  103.     0: %eax    This is the system call number.
  104.        1: %ebx This is the first argument.
  105.     2: %ecx
  106.     3: %edx
  107.     4: %esi
  108.     5: %edi
  109.  */
  110.  
  111. #if defined(__PIC__) || defined (__pic__)
  112. #define PUSH_0    pushl %ebx;
  113. #else
  114. #define PUSH_0    /* No arguments to push.  */
  115. #endif
  116. #define PUSH_1    pushl %ebx;
  117. #define PUSH_2    PUSH_1
  118. #define PUSH_3    PUSH_1
  119. #define PUSH_4    pushl %esi; PUSH_3
  120. #define PUSH_5    pushl %edi; PUSH_4
  121.  
  122. #define    MOVE_0    movl 8(%ebp),%eax;
  123. #define    MOVE_1    MOVE_0 movl 12(%ebp),%ebx;
  124. #define    MOVE_2    MOVE_1 movl 16(%ebp),%ecx;
  125. #define    MOVE_3    MOVE_2 movl 20(%ebp),%edx;
  126. #define    MOVE_4    MOVE_3 movl 24(%ebp),%esi;
  127. #define    MOVE_5    MOVE_4 movl 28(%ebp),%edi;
  128.  
  129. #if defined(__PIC__) || defined (__pic__)
  130. #define POP_0    popl %ebx;
  131. #else
  132. #define POP_0    /* No arguments to pop.  */
  133. #endif
  134. #define POP_1    popl %ebx;
  135. #define POP_2    POP_1
  136. #define POP_3    POP_1
  137. #define POP_4    POP_3 popl %esi;
  138. #define POP_5    POP_4 popl %edi;
  139.  
  140. PSEUDO (syscall, 5)
  141.     ret
  142.