home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / threads / src / pthread_aux.S < prev    next >
Text File  |  1996-09-28  |  5KB  |  166 lines

  1. /* Copyright (C) 1992, the Florida State University
  2.    Distributed by the Florida State University under the terms of the
  3.    GNU Library General Public License.
  4.  
  5. This file is part of Pthreads.
  6.  
  7. Pthreads is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU Library General Public
  9. License as published by the Free Software Foundation (version 2).
  10.  
  11. Pthreads is distributed "AS IS" in the hope that it will be
  12. useful, but WITHOUT ANY WARRANTY; without even the implied
  13. warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. See the GNU Library General Public License for more details.
  15.  
  16. You should have received a copy of the GNU Library General Public
  17. License along with Pthreads; see the file COPYING.  If not, write
  18. to the Free Software Foundation, 675 Mass Ave, Cambridge,
  19. MA 02139, USA.
  20.  
  21. Report problems and direct all questions to:
  22.  
  23.   pthreads-bugs@ada.cs.fsu.edu
  24.  
  25.   @(#)pthread_aux.S    2.5 4/12/95
  26.  
  27. */
  28.  
  29. /*
  30.  * Auxiliary assembly routines
  31.  *
  32.  * Portability notes:
  33.  * The assembly code in this file is only needed for the following conditional
  34.  * compilation:
  35.  * NOERR_CHECK:                 pthreead_test_and_set
  36.  * SOLARIS && IO:               pthread_get_retaddr
  37.  * STACK_CHECK && SIGNAL_STACK: service routines such as set/get PC, SP, FP etc.
  38.  * always needed:               start_float entry (initialize Pthreads)
  39.  * SOLARIS:            pthread_dummy
  40.  */
  41.  
  42. #include <pthread/config.h>
  43. #include <../src/config_internals.h>
  44.  
  45. #define LOCORE
  46. #define _ASM
  47.  
  48. #ifdef SOLARIS
  49. #include <sys/asm_linkage.h>
  50. #define NAME(x) x
  51. #else
  52. #include <sparc/asm_linkage.h>
  53. #endif
  54.  
  55. #ifdef STAND_ALONE
  56. #include <sun4e/trap.h>
  57. #else !STAND_ALONE
  58. #ifdef SOLARIS
  59. #include <sys/trap.h>
  60. #else !SORLARIS
  61. #include <sparc/trap.h>
  62. #endif !SOLARIS
  63. #endif !STAND_ALONE
  64.  
  65. #ifdef NOERR_CHECK
  66. !    int pthread_test_and_set(flag)
  67. !    int *flag;
  68. !
  69. !    executes a test & set instruction on the passed flag and
  70. !    returns the previous value of the flag. (leaf routine)
  71.     ENTRY(pthread_test_and_set)
  72.     retl
  73.     ldstub    [%o0],%o0        ! Delay: Flag in o0 (no save/restore)
  74. #endif NOERR_CHECK
  75.  
  76. #if defined(SOLARIS) && defined(IO)
  77. !    char *pthread_get_retaddr()
  78. !
  79. !    returns the return address (leaf procedure)
  80.     ENTRY(pthread_get_retaddr)
  81.     retl
  82.     mov    %i7, %o0        ! Delay: i7 in o0 (no save/restore)
  83. #endif SOLARIS && IO
  84.  
  85. #if defined(STACK_CHECK) && defined(SIGNAL_STACK)
  86. !    char *pthread_get_sp()
  87. !
  88. !    returns the current sp (leaf procedure)
  89.     ENTRY(pthread_get_sp)
  90.     retl
  91.     mov    %sp, %o0        ! Delay: sp in o0 (no save/restore)
  92.  
  93. !       void pthread_set_sp(new_sp)
  94. !    int *new_sp;
  95. !
  96. !       sets the sp (leaf procedure)
  97.         ENTRY(pthread_set_sp)
  98.         retl
  99.         mov      %o0, %sp             ! Delay: o0 in sp (no save/restore)
  100.  
  101. !       char *pthread_get_fp()
  102. !
  103. !       returns the current fp (leaf procedure)
  104.         ENTRY(pthread_get_fp)
  105.         retl
  106.         mov      %fp, %o0             ! Delay: fp in o0 (no save/restore)
  107.  
  108. !       void pthread_set_fp(new_fp) 
  109. !    int *new_fp;
  110. !
  111. !       sets the fp (leaf procedure) 
  112.         ENTRY(pthread_set_fp)
  113.         retl 
  114.         mov      %o0, %fp             ! Delay: o0 in fp (no save/restore) 
  115.  
  116. !    void pthread_ST_FLUSH_WINDOWS()
  117. !
  118. !    Flushes the windows
  119.     ENTRY(pthread_ST_FLUSH_WINDOWS)
  120.     retl
  121.     ta    ST_FLUSH_WINDOWS    ! Delay:Flush Windows(no save/restore)
  122. #endif STACK_CHECK && SIGNAL_STACK
  123.  
  124. !    void start_float()
  125. !
  126. !    Solaris provides the "init" section for initialization routines.
  127. !    This pragma could be used as
  128. !        #pragma init (pthread_init)
  129. !    in pthread.c, yet only the Solaris C compiler translates this properly.
  130. !    Gcc, on the other hand, does not provide the call in the .init section.
  131. !    Thus, we provide the hook in assembly.
  132. !
  133. !    In SunOS, start_float is an entry called by crt*.o right before _main.
  134. !    Since start_float is not used as of now, we convert it into
  135. !    a hook to initialize the Pthreads library. Consequently, this
  136. !    definition should overwrite the entry in the C library.
  137. !    CAUTION: Languages other than C have to provide a similar hook
  138. !         inside the start entry (see ld(1)) or the user has
  139. !         call pthread_init() explicitly before using any
  140. !         Pthreads routines.
  141. #ifdef SOLARIS
  142.         .section        ".init"
  143.         .align  4
  144. #else !SOLARIS
  145.     .global    start_float
  146. start_float:
  147.     save    %sp,-SA(MINFRAME),%sp
  148. #endif !SOLARIS
  149.     call    NAME(pthread_init)    ! Initialize pthreads
  150.     nop                ! Delay:
  151. #ifdef SOLARIS
  152.         .section        ".text"
  153. #else !SOLARIS
  154.     ret
  155.     restore
  156. #endif !SOLARIS
  157.  
  158. #ifdef SOLARIS
  159. !    void pthread_dummy()
  160. !
  161. !    The sole purpose of this label is to ensure that the corresponding
  162. !     object file is always linked. The entry is references
  163. !    (but never used) in pthread.c to ensure just that.
  164.     ENTRY(pthread_dummy)
  165. #endif SOLARIS
  166.