1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #if defined(lint) || defined(DS_DDICT)
  27 #include <sys/types.h>
  28 #include <sys/param.h>
  29 #else
  30 #include <sys/asm_linkage.h>
  31 #endif
  32 
  33 #ifdef DS_DDICT
  34 #define uint8_t uchar_t
  35 #endif
  36 
  37 
  38 /*
  39  * Special support routines that can't be done with C
  40  */
  41 
  42 
  43 /*
  44  * uint8_t nsc_ldstub(uint8_t *cp)
  45  *
  46  * Store 0xFF at the specified location, and return its previous content.
  47  */
  48 
  49 #if defined(lint) || defined(DS_DDICT)
  50 uint8_t
  51 nsc_ldstub(uint8_t *cp)
  52 {
  53         uint8_t rv;
  54         rv = *cp;
  55         *cp = 0xFF;
  56         return (rv);
  57 }
  58 #else
  59 
  60         ENTRY(nsc_ldstub)
  61         retl
  62         ldstub  [%o0], %o0
  63         SET_SIZE(nsc_ldstub)
  64 
  65 #endif  /* lint || DS_DDICT */
  66 
  67 
  68 /*
  69  * nsc_membar_stld(void)
  70  *
  71  * C callable interface to SPARC asm membar instruction.
  72  */
  73 
  74 #if defined(lint) || defined(DS_DDICT)
  75 void
  76 nsc_membar_stld(void)
  77 {}
  78 #else
  79 
  80         ENTRY(nsc_membar_stld)
  81         retl
  82         membar  #StoreLoad
  83         SET_SIZE(nsc_membar_stld)
  84 
  85 #endif  /* lint || DS_DDICT */
  86 
  87 
  88 /*
  89  * if a() calls b() calls nsc_caller(),
  90  * nsc_caller() returns return address in a().
  91  */
  92 
  93 #if defined(lint) || defined(DS_DDICT)
  94 caddr_t
  95 nsc_caller(void)
  96 {
  97         return (0);
  98 }
  99 #else
 100 
 101         ENTRY(nsc_caller)
 102         retl
 103         mov     %i7, %o0
 104         SET_SIZE(nsc_caller)
 105 
 106 #endif  /* lint || DS_DDICT */
 107 
 108 
 109 /*
 110  * if a() calls nsc_callee(), nsc_callee() returns the
 111  * return address in a();
 112  */
 113 
 114 #if defined(lint) || defined(DS_DDICT)
 115 caddr_t
 116 nsc_callee(void)
 117 {
 118         return (0);
 119 }
 120 #else
 121 
 122         ENTRY(nsc_callee)
 123         .register %g7, #scratch
 124         retl
 125         mov     %o7, %o0
 126         SET_SIZE(nsc_callee)
 127 
 128 #endif  /* lint || DS_DDICT */
 129 
 130 
 131 /*
 132  * nsc_threadp(void)
 133  *
 134  * C callable interface to get the current thread pointer.
 135  */
 136 
 137 #if defined(lint) || defined(DS_DDICT)
 138 void *
 139 nsc_threadp(void)
 140 {
 141        return (NULL);
 142 }
 143 #else
 144 
 145        ENTRY(nsc_threadp)
 146        retl
 147        mov %g7, %o0
 148        SET_SIZE(nsc_threadp)
 149 
 150 #endif /* lint || DS_DDICT */