~mirabilos/klibc/master

« back to all changes in this revision

Viewing changes to include/arch/sparc/machine/asm.h

  • Committer: H. Peter Anvin
  • Date: 2006-05-01 00:56:02 UTC
  • Revision ID: git-v1:5dea5e01daaaff0685016f23b5cb46240f28e792
[klibc] Reorganize the standalone klibc tree to match the in-kernel tree

Right now, it's harder than it should to apply and test patches using
the standalone klibc tree.  Reorganize the standalone tree to match
the in-kernel tree.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*      $NetBSD: asm.h,v 1.14 2002/07/20 08:37:30 mrg Exp $ */
2
 
 
3
 
/*
4
 
 * Copyright (c) 1994 Allen Briggs
5
 
 * All rights reserved.
6
 
 *
7
 
 * Gleaned from locore.s and sun3 asm.h which had the following copyrights:
8
 
 * locore.s:
9
 
 * Copyright (c) 1988 University of Utah.
10
 
 * Copyright (c) 1982, 1990 The Regents of the University of California.
11
 
 * sun3/include/asm.h:
12
 
 * Copyright (c) 1993 Adam Glass
13
 
 * Copyright (c) 1990 The Regents of the University of California.
14
 
 *
15
 
 * Redistribution and use in source and binary forms, with or without
16
 
 * modification, are permitted provided that the following conditions
17
 
 * are met:
18
 
 * 1. Redistributions of source code must retain the above copyright
19
 
 *    notice, this list of conditions and the following disclaimer.
20
 
 * 2. Redistributions in binary form must reproduce the above copyright
21
 
 *    notice, this list of conditions and the following disclaimer in the
22
 
 *    documentation and/or other materials provided with the distribution.
23
 
 * 3. All advertising materials mentioning features or use of this software
24
 
 *    must display the following acknowledgement:
25
 
 *      This product includes software developed by the University of
26
 
 *      California, Berkeley and its contributors.
27
 
 * 4. Neither the name of the University nor the names of its contributors
28
 
 *    may be used to endorse or promote products derived from this software
29
 
 *    without specific prior written permission.
30
 
 *
31
 
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
32
 
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33
 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34
 
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
35
 
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36
 
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37
 
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38
 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
39
 
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
40
 
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
41
 
 * SUCH DAMAGE.
42
 
 */
43
 
 
44
 
#ifndef _ASM_H_
45
 
#define _ASM_H_
46
 
 
47
 
/* Pull in CCFSZ, CC64FSZ, and BIAS from frame.h */
48
 
#ifndef _LOCORE
49
 
#define _LOCORE
50
 
#endif
51
 
#include <machine/frame.h>
52
 
 
53
 
#ifdef __ELF__
54
 
#define _C_LABEL(name)          name
55
 
#else
56
 
#ifdef __STDC__
57
 
#define _C_LABEL(name)          _ ## name
58
 
#else
59
 
#define _C_LABEL(name)          _/**/name
60
 
#endif
61
 
#endif
62
 
#define _ASM_LABEL(name)        name
63
 
 
64
 
#ifdef PIC
65
 
/*
66
 
 * PIC_PROLOGUE() is akin to the compiler generated function prologue for
67
 
 * PIC code. It leaves the address of the Global Offset Table in DEST,
68
 
 * clobbering register TMP in the process.
69
 
 *
70
 
 * We can use two code sequences.  We can read the %pc or use the call
71
 
 * instruction that saves the pc in %o7.  Call requires the branch unit and
72
 
 * IEU1, and clobbers %o7 which needs to be restored.  This instruction
73
 
 * sequence takes about 4 cycles due to instruction interdependence.  Reading
74
 
 * the pc takes 4 cycles to dispatch and is always dispatched alone.  That
75
 
 * sequence takes 7 cycles.
76
 
 */
77
 
#ifdef __arch64__
78
 
#define PIC_PROLOGUE(dest,tmp) \
79
 
        mov %o7, tmp; \
80
 
        sethi %hi(_GLOBAL_OFFSET_TABLE_-4),dest; \
81
 
        call 0f; \
82
 
         or dest,%lo(_GLOBAL_OFFSET_TABLE_+4),dest; \
83
 
0: \
84
 
        add dest,%o7,dest; \
85
 
        mov tmp, %o7
86
 
#else
87
 
#define PIC_PROLOGUE(dest,tmp) \
88
 
        mov %o7,tmp; 3: call 4f; nop; 4: \
89
 
        sethi %hi(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \
90
 
        or dest,%lo(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \
91
 
        add dest,%o7,dest; mov tmp,%o7
92
 
#endif
93
 
 
94
 
/*
95
 
 * PICCY_SET() does the equivalent of a `set var, %dest' instruction in
96
 
 * a PIC-like way, but without involving the Global Offset Table. This
97
 
 * only works for VARs defined in the same file *and* in the text segment.
98
 
 */
99
 
#ifdef __arch64__
100
 
#define PICCY_SET(var,dest,tmp) \
101
 
        3: rd %pc, tmp; add tmp,(var-3b),dest
102
 
#else
103
 
#define PICCY_SET(var,dest,tmp) \
104
 
        mov %o7,tmp; 3: call 4f; nop; 4: \
105
 
        add %o7,(var-3b),dest; mov tmp,%o7
106
 
#endif
107
 
#else
108
 
#define PIC_PROLOGUE(dest,tmp)
109
 
#define PICCY_OFFSET(var,dest,tmp)
110
 
#endif
111
 
 
112
 
#define FTYPE(x)                .type x,@function
113
 
#define OTYPE(x)                .type x,@object
114
 
 
115
 
#define _ENTRY(name) \
116
 
        .align 4; .globl name; .proc 1; FTYPE(name); name:
117
 
 
118
 
#ifdef GPROF
119
 
/* see _MCOUNT_ENTRY in profile.h */
120
 
#ifdef __ELF__
121
 
#ifdef __arch64__
122
 
#define _PROF_PROLOGUE \
123
 
        .data; .align 8; 1: .uaword 0; .uaword 0; \
124
 
        .text; save %sp,-CC64FSZ,%sp; sethi %hi(1b),%o0; call _mcount; \
125
 
        or %o0,%lo(1b),%o0; restore
126
 
#else
127
 
#define _PROF_PROLOGUE \
128
 
        .data; .align 4; 1: .long 0; \
129
 
        .text; save %sp,-96,%sp; sethi %hi(1b),%o0; call _mcount; \
130
 
        or %o0,%lo(1b),%o0; restore
131
 
#endif
132
 
#else
133
 
#ifdef __arch64__
134
 
#define _PROF_PROLOGUE \
135
 
        .data; .align 8; 1: .uaword 0; .uaword 0; \
136
 
        .text; save %sp,-CC64FSZ,%sp; sethi %hi(1b),%o0; call mcount; \
137
 
        or %o0,%lo(1b),%o0; restore
138
 
#else
139
 
#define _PROF_PROLOGUE \
140
 
        .data; .align 4; 1: .long 0; \
141
 
        .text; save %sp,-96,%sp; sethi %hi(1b),%o0; call mcount; \
142
 
        or %o0,%lo(1b),%o0; restore
143
 
#endif
144
 
#endif
145
 
#else
146
 
#define _PROF_PROLOGUE
147
 
#endif
148
 
 
149
 
#define ENTRY(name)             _ENTRY(_C_LABEL(name)); _PROF_PROLOGUE
150
 
#define ENTRY_NOPROFILE(name)   _ENTRY(_C_LABEL(name))
151
 
#define ASENTRY(name)           _ENTRY(_ASM_LABEL(name)); _PROF_PROLOGUE
152
 
#define FUNC(name)              ASENTRY(name)
153
 
#define RODATA(name)            .align 4; .text; .globl _C_LABEL(name); \
154
 
                                OTYPE(_C_LABEL(name)); _C_LABEL(name):
155
 
 
156
 
 
157
 
#define ASMSTR                  .asciz
158
 
 
159
 
#define RCSID(name)             .asciz name
160
 
 
161
 
#ifdef __ELF__
162
 
#define WEAK_ALIAS(alias,sym)                                           \
163
 
        .weak alias;                                                    \
164
 
        alias = sym
165
 
#endif
166
 
 
167
 
/*
168
 
 * WARN_REFERENCES: create a warning if the specified symbol is referenced.
169
 
 */
170
 
#ifdef __ELF__
171
 
#ifdef __STDC__
172
 
#define WARN_REFERENCES(_sym,_msg)                              \
173
 
        .section .gnu.warning. ## _sym ; .ascii _msg ; .text
174
 
#else
175
 
#define WARN_REFERENCES(_sym,_msg)                              \
176
 
        .section .gnu.warning./**/_sym ; .ascii _msg ; .text
177
 
#endif /* __STDC__ */
178
 
#else
179
 
#ifdef __STDC__
180
 
#define __STRING(x)                     #x
181
 
#define WARN_REFERENCES(sym,msg)                                        \
182
 
        .stabs msg ## ,30,0,0,0 ;                                       \
183
 
        .stabs __STRING(_ ## sym) ## ,1,0,0,0
184
 
#else
185
 
#define __STRING(x)                     "x"
186
 
#define WARN_REFERENCES(sym,msg)                                        \
187
 
        .stabs msg,30,0,0,0 ;                                           \
188
 
        .stabs __STRING(_/**/sym),1,0,0,0
189
 
#endif /* __STDC__ */
190
 
#endif /* __ELF__ */
191
 
 
192
 
#endif /* _ASM_H_ */