asm.h revision 1.2.16.2 1 1.2.16.2 jdolecek /* $NetBSD: asm.h,v 1.2.16.2 2017/12/03 11:36:39 jdolecek Exp $ */
2 1.2.16.2 jdolecek
3 1.2.16.2 jdolecek /*-
4 1.2.16.2 jdolecek * Copyright (c) 2014 The NetBSD Foundation, Inc.
5 1.2.16.2 jdolecek * All rights reserved.
6 1.2.16.2 jdolecek *
7 1.2.16.2 jdolecek * This code is derived from software contributed to The NetBSD Foundation
8 1.2.16.2 jdolecek * by Matt Thomas of 3am Software Foundry.
9 1.2.16.2 jdolecek *
10 1.2.16.2 jdolecek * Redistribution and use in source and binary forms, with or without
11 1.2.16.2 jdolecek * modification, are permitted provided that the following conditions
12 1.2.16.2 jdolecek * are met:
13 1.2.16.2 jdolecek * 1. Redistributions of source code must retain the above copyright
14 1.2.16.2 jdolecek * notice, this list of conditions and the following disclaimer.
15 1.2.16.2 jdolecek * 2. Redistributions in binary form must reproduce the above copyright
16 1.2.16.2 jdolecek * notice, this list of conditions and the following disclaimer in the
17 1.2.16.2 jdolecek * documentation and/or other materials provided with the distribution.
18 1.2.16.2 jdolecek *
19 1.2.16.2 jdolecek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.2.16.2 jdolecek * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.2.16.2 jdolecek * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.2.16.2 jdolecek * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.2.16.2 jdolecek * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.2.16.2 jdolecek * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.2.16.2 jdolecek * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.2.16.2 jdolecek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.2.16.2 jdolecek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.2.16.2 jdolecek * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.2.16.2 jdolecek * POSSIBILITY OF SUCH DAMAGE.
30 1.2.16.2 jdolecek */
31 1.2.16.2 jdolecek
32 1.2.16.2 jdolecek #ifndef _RISCV_ASM_H
33 1.2.16.2 jdolecek #define _RISCV_ASM_H
34 1.2.16.2 jdolecek
35 1.2.16.2 jdolecek #define _C_LABEL(x) x
36 1.2.16.2 jdolecek
37 1.2.16.2 jdolecek /*
38 1.2.16.2 jdolecek * Define -pg profile entry code.
39 1.2.16.2 jdolecek * Must always be noreorder, must never use a macro instruction
40 1.2.16.2 jdolecek * Final addiu to t9 must always equal the size of this _KERN_MCOUNT
41 1.2.16.2 jdolecek */
42 1.2.16.2 jdolecek #define _KERN_MCOUNT \
43 1.2.16.2 jdolecek .set push; \
44 1.2.16.2 jdolecek subi sp, sp, CALLFRAME_SIZE; \
45 1.2.16.2 jdolecek REG_S a0, CALLFRAME_S0(sp); \
46 1.2.16.2 jdolecek REG_S ra, CALLFRAME_RA(sp); \
47 1.2.16.2 jdolecek move a0, ra; \
48 1.2.16.2 jdolecek call _mcount \
49 1.2.16.2 jdolecek REG_L ra, CALLFRAME_RA(sp); \
50 1.2.16.2 jdolecek REG_L a0, CALLFRAME_S0(sp); \
51 1.2.16.2 jdolecek addi sp, sp, CALLFRAME_SIZ; \
52 1.2.16.2 jdolecek .set pop;
53 1.2.16.2 jdolecek
54 1.2.16.2 jdolecek #ifdef GPROF
55 1.2.16.2 jdolecek #define _PROF_PROLOGUE _KERN_MCOUNT
56 1.2.16.2 jdolecek #else
57 1.2.16.2 jdolecek #define _PROF_PROLOGUE
58 1.2.16.2 jdolecek #endif
59 1.2.16.2 jdolecek
60 1.2.16.2 jdolecek #ifdef __PIC__
61 1.2.16.2 jdolecek #define PLT(x) x##@
62 1.2.16.2 jdolecek #else
63 1.2.16.2 jdolecek #define PLT(x) x
64 1.2.16.2 jdolecek #endif
65 1.2.16.2 jdolecek
66 1.2.16.2 jdolecek /*
67 1.2.16.2 jdolecek * WEAK_ALIAS: create a weak alias.
68 1.2.16.2 jdolecek */
69 1.2.16.2 jdolecek #define WEAK_ALIAS(alias,sym) \
70 1.2.16.2 jdolecek .weak alias; \
71 1.2.16.2 jdolecek alias = sym
72 1.2.16.2 jdolecek /*
73 1.2.16.2 jdolecek * STRONG_ALIAS: create a strong alias.
74 1.2.16.2 jdolecek */
75 1.2.16.2 jdolecek #define STRONG_ALIAS(alias,sym) \
76 1.2.16.2 jdolecek .globl alias; \
77 1.2.16.2 jdolecek alias = sym
78 1.2.16.2 jdolecek
79 1.2.16.2 jdolecek /*
80 1.2.16.2 jdolecek * WARN_REFERENCES: create a warning if the specified symbol is referenced.
81 1.2.16.2 jdolecek */
82 1.2.16.2 jdolecek #define WARN_REFERENCES(sym,msg) \
83 1.2.16.2 jdolecek .pushsection __CONCAT(.gnu.warning.,sym); \
84 1.2.16.2 jdolecek .ascii msg; \
85 1.2.16.2 jdolecek .popsection
86 1.2.16.2 jdolecek
87 1.2.16.2 jdolecek #define _ENTRY(x) \
88 1.2.16.2 jdolecek .globl _C_LABEL(x); \
89 1.2.16.2 jdolecek .type _C_LABEL(x), @function; \
90 1.2.16.2 jdolecek _C_LABEL(x):
91 1.2.16.2 jdolecek
92 1.2.16.2 jdolecek #define ENTRY_NP(x) .text; .align 2; _ENTRY(x)
93 1.2.16.2 jdolecek #define ENTRY(x) ENTRY_NP(x); _PROF_PROLOGUE
94 1.2.16.2 jdolecek #define END(x) .size _C_LABEL(x), . - _C_LABEL(x)
95 1.2.16.2 jdolecek
96 1.2.16.2 jdolecek /*
97 1.2.16.2 jdolecek * Macros to panic and printf from assembly language.
98 1.2.16.2 jdolecek */
99 1.2.16.2 jdolecek #define PANIC(msg) \
100 1.2.16.2 jdolecek la a0, 9f; \
101 1.2.16.2 jdolecek call _C_LABEL(panic); \
102 1.2.16.2 jdolecek MSG(msg)
103 1.2.16.2 jdolecek
104 1.2.16.2 jdolecek #define PRINTF(msg) \
105 1.2.16.2 jdolecek la a0, 9f; \
106 1.2.16.2 jdolecek call _C_LABEL(printf); \
107 1.2.16.2 jdolecek MSG(msg)
108 1.2.16.2 jdolecek
109 1.2.16.2 jdolecek #define MSG(msg) \
110 1.2.16.2 jdolecek .pushsection .rodata.str1.8,"aMS",@progbits,1; \
111 1.2.16.2 jdolecek 9: .asciiz msg; \
112 1.2.16.2 jdolecek .popsection
113 1.2.16.2 jdolecek
114 1.2.16.2 jdolecek #define ASMSTR(str) \
115 1.2.16.2 jdolecek .asciiz str; \
116 1.2.16.2 jdolecek .align 3
117 1.2.16.2 jdolecek
118 1.2.16.2 jdolecek #define __RCSID(name) .pushsection ".ident"; .asciz name; .popsection
119 1.2.16.2 jdolecek #define RCSID(name) __RCSID(name)
120 1.2.16.2 jdolecek
121 1.2.16.2 jdolecek #if defined(_LP64)
122 1.2.16.2 jdolecek #define SZREG 8
123 1.2.16.2 jdolecek #else
124 1.2.16.2 jdolecek #define SZREG 4
125 1.2.16.2 jdolecek #endif
126 1.2.16.2 jdolecek
127 1.2.16.2 jdolecek #define ALSK 15 /* stack alignment */
128 1.2.16.2 jdolecek #define ALMASK -15 /* stack alignment */
129 1.2.16.2 jdolecek #define SZFPREG 8
130 1.2.16.2 jdolecek #define FP_L fld
131 1.2.16.2 jdolecek #define FP_S fsd
132 1.2.16.2 jdolecek
133 1.2.16.2 jdolecek /*
134 1.2.16.2 jdolecek * standard callframe {
135 1.2.16.2 jdolecek * register_t cf_sp; frame pointer
136 1.2.16.2 jdolecek * register_t cf_ra; return address
137 1.2.16.2 jdolecek * };
138 1.2.16.2 jdolecek */
139 1.2.16.2 jdolecek #define CALLFRAME_SIZ (SZREG * 4)
140 1.2.16.2 jdolecek #define CALLFRAME_S1 (CALLFRAME_SIZ - 4 * SZREG)
141 1.2.16.2 jdolecek #define CALLFRAME_S0 (CALLFRAME_SIZ - 3 * SZREG)
142 1.2.16.2 jdolecek #define CALLFRAME_SP (CALLFRAME_SIZ - 2 * SZREG)
143 1.2.16.2 jdolecek #define CALLFRAME_RA (CALLFRAME_SIZ - 1 * SZREG)
144 1.2.16.2 jdolecek
145 1.2.16.2 jdolecek /*
146 1.2.16.2 jdolecek * These macros hide the use of rv32 and rv64 instructions from the
147 1.2.16.2 jdolecek * assembler to prevent the assembler from generating 64-bit style
148 1.2.16.2 jdolecek * ABI calls.
149 1.2.16.2 jdolecek */
150 1.2.16.2 jdolecek #define PTR_ADD add
151 1.2.16.2 jdolecek #define PTR_ADDI addi
152 1.2.16.2 jdolecek #define PTR_SUB sub
153 1.2.16.2 jdolecek #define PTR_SUBI subi
154 1.2.16.2 jdolecek #define PTR_LA la
155 1.2.16.2 jdolecek #define PTR_SLLI slli
156 1.2.16.2 jdolecek #define PTR_SLL sll
157 1.2.16.2 jdolecek #define PTR_SRLI srli
158 1.2.16.2 jdolecek #define PTR_SRL srl
159 1.2.16.2 jdolecek #define PTR_SRAI srai
160 1.2.16.2 jdolecek #define PTR_SRA sra
161 1.2.16.2 jdolecek #if _LP64
162 1.2.16.2 jdolecek #define PTR_L ld
163 1.2.16.2 jdolecek #define PTR_S sd
164 1.2.16.2 jdolecek #define PTR_LR lr.d
165 1.2.16.2 jdolecek #define PTR_SC sc.d
166 1.2.16.2 jdolecek #define PTR_WORD .dword
167 1.2.16.2 jdolecek #define PTR_SCALESHIFT 3
168 1.2.16.2 jdolecek #else
169 1.2.16.2 jdolecek #define PTR_L lw
170 1.2.16.2 jdolecek #define PTR_S sw
171 1.2.16.2 jdolecek #define PTR_LR lr.w
172 1.2.16.2 jdolecek #define PTR_SC sc.w
173 1.2.16.2 jdolecek #define PTR_WORD .word
174 1.2.16.2 jdolecek #define PTR_SCALESHIFT 2
175 1.2.16.2 jdolecek #endif
176 1.2.16.2 jdolecek
177 1.2.16.2 jdolecek #define INT_L lw
178 1.2.16.2 jdolecek #define INT_LA la
179 1.2.16.2 jdolecek #define INT_S sw
180 1.2.16.2 jdolecek #define INT_LR lr.w
181 1.2.16.2 jdolecek #define INT_SC sc.w
182 1.2.16.2 jdolecek #define INT_WORD .word
183 1.2.16.2 jdolecek #define INT_SCALESHIFT 2
184 1.2.16.2 jdolecek #ifdef _LP64
185 1.2.16.2 jdolecek #define INT_ADD addw
186 1.2.16.2 jdolecek #define INT_ADDI addwi
187 1.2.16.2 jdolecek #define INT_SUB subw
188 1.2.16.2 jdolecek #define INT_SUBI subwi
189 1.2.16.2 jdolecek #define INT_SLL sllwi
190 1.2.16.2 jdolecek #define INT_SLLV sllw
191 1.2.16.2 jdolecek #define INT_SRL srlwi
192 1.2.16.2 jdolecek #define INT_SRLV srlw
193 1.2.16.2 jdolecek #define INT_SRA srawi
194 1.2.16.2 jdolecek #define INT_SRAV sraw
195 1.2.16.2 jdolecek #else
196 1.2.16.2 jdolecek #define INT_ADD add
197 1.2.16.2 jdolecek #define INT_ADDI addi
198 1.2.16.2 jdolecek #define INT_SUB sub
199 1.2.16.2 jdolecek #define INT_SUBI subi
200 1.2.16.2 jdolecek #define INT_SLLI slli
201 1.2.16.2 jdolecek #define INT_SLL sll
202 1.2.16.2 jdolecek #define INT_SRLI srli
203 1.2.16.2 jdolecek #define INT_SRL srl
204 1.2.16.2 jdolecek #define INT_SRAI srai
205 1.2.16.2 jdolecek #define INT_SRA sra
206 1.2.16.2 jdolecek #endif
207 1.2.16.2 jdolecek
208 1.2.16.2 jdolecek #define LONG_LA la
209 1.2.16.2 jdolecek #define LONG_ADD add
210 1.2.16.2 jdolecek #define LONG_ADDI addi
211 1.2.16.2 jdolecek #define LONG_SUB sub
212 1.2.16.2 jdolecek #define LONG_SUBI subi
213 1.2.16.2 jdolecek #define LONG_SLLI slli
214 1.2.16.2 jdolecek #define LONG_SLL sll
215 1.2.16.2 jdolecek #define LONG_SRLI srli
216 1.2.16.2 jdolecek #define LONG_SRL srl
217 1.2.16.2 jdolecek #define LONG_SRAI srai
218 1.2.16.2 jdolecek #define LONG_SRA sra
219 1.2.16.2 jdolecek #ifdef _LP64
220 1.2.16.2 jdolecek #define LONG_L ld
221 1.2.16.2 jdolecek #define LONG_S sd
222 1.2.16.2 jdolecek #define LONG_LR lr.d
223 1.2.16.2 jdolecek #define LONG_SC sc.d
224 1.2.16.2 jdolecek #define LONG_WORD .quad
225 1.2.16.2 jdolecek #define LONG_SCALESHIFT 3
226 1.2.16.2 jdolecek #else
227 1.2.16.2 jdolecek #define LONG_L lw
228 1.2.16.2 jdolecek #define LONG_S sw
229 1.2.16.2 jdolecek #define LONG_LR lr.w
230 1.2.16.2 jdolecek #define LONG_SC sc.w
231 1.2.16.2 jdolecek #define LONG_WORD .word
232 1.2.16.2 jdolecek #define LONG_SCALESHIFT 2
233 1.2.16.2 jdolecek #endif
234 1.2.16.2 jdolecek
235 1.2.16.2 jdolecek #define REG_LI li
236 1.2.16.2 jdolecek #define REG_ADD add
237 1.2.16.2 jdolecek #define REG_SLLI slli
238 1.2.16.2 jdolecek #define REG_SLL sll
239 1.2.16.2 jdolecek #define REG_SRLI srli
240 1.2.16.2 jdolecek #define REG_SRL srl
241 1.2.16.2 jdolecek #define REG_SRAI srai
242 1.2.16.2 jdolecek #define REG_SRA sra
243 1.2.16.2 jdolecek #if _LP64
244 1.2.16.2 jdolecek #define REG_L ld
245 1.2.16.2 jdolecek #define REG_S sd
246 1.2.16.2 jdolecek #define REG_LR lr.d
247 1.2.16.2 jdolecek #define REG_SC sc.d
248 1.2.16.2 jdolecek #define REG_SCALESHIFT 3
249 1.2.16.2 jdolecek #else
250 1.2.16.2 jdolecek #define REG_L lw
251 1.2.16.2 jdolecek #define REG_S sw
252 1.2.16.2 jdolecek #define REG_LR lr.w
253 1.2.16.2 jdolecek #define REG_SC sc.w
254 1.2.16.2 jdolecek #define REG_SCALESHIFT 2
255 1.2.16.2 jdolecek #endif
256 1.2.16.2 jdolecek
257 1.2.16.2 jdolecek #define CPUVAR(off) _C_LABEL(cpu_info_store)+__CONCAT(CPU_INFO_,off)
258 1.2.16.2 jdolecek
259 1.2.16.2 jdolecek #endif /* _RISCV_ASM_H */
260