xref: /netbsd-src/external/gpl3/gdb.old/dist/include/xtensa-dynconfig.h (revision 7bdf38e5b7a28439665f2fdeff81e36913eef7dd)
1 /* Xtensa configuration settings.
2    Copyright (C) 2022 Free Software Foundation, Inc.
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8 
9    This program is distributed in the hope that it will be useful, but
10    WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    General Public License for more details.
13 
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
17 
18 #ifndef XTENSA_DYNCONFIG_H
19 #define XTENSA_DYNCONFIG_H
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 /*
26  * Config versioning.
27  *
28  * When new config entries need to be passed through dynconfig
29  * create new xtensa_config_v<N> structure and put them there.
30  * Declare new function xtensa_get_config_v<N> (void).
31  * Define corresponding X*HAL_* macros by accessing xtensa_get_config_v<N> ().
32  * Define macro XTENSA_CONFIG_V<N>_ENTRY_LIST by listing
33  * XTENSA_CONFIG_ENTRY for every entry in the new structure.
34  * Add constant definition for the new xtensa_config_v<N> to the
35  * XTENSA_CONFIG_INSTANCE_LIST.
36  * Add XTENSA_CONFIG_V<N>_ENTRY_LIST to the XTENSA_CONFIG_ENTRY_LIST.
37  *
38  * On the user side (gcc/binutils/...) add definition for the function
39  * xtensa_get_config_v<N> (void).
40  */
41 
42 struct xtensa_config_v1
43 {
44   int xchal_have_be;
45   int xchal_have_density;
46   int xchal_have_const16;
47   int xchal_have_abs;
48   int xchal_have_addx;
49   int xchal_have_l32r;
50   int xshal_use_absolute_literals;
51   int xshal_have_text_section_literals;
52   int xchal_have_mac16;
53   int xchal_have_mul16;
54   int xchal_have_mul32;
55   int xchal_have_mul32_high;
56   int xchal_have_div32;
57   int xchal_have_nsa;
58   int xchal_have_minmax;
59   int xchal_have_sext;
60   int xchal_have_loops;
61   int xchal_have_threadptr;
62   int xchal_have_release_sync;
63   int xchal_have_s32c1i;
64   int xchal_have_booleans;
65   int xchal_have_fp;
66   int xchal_have_fp_div;
67   int xchal_have_fp_recip;
68   int xchal_have_fp_sqrt;
69   int xchal_have_fp_rsqrt;
70   int xchal_have_fp_postinc;
71   int xchal_have_dfp;
72   int xchal_have_dfp_div;
73   int xchal_have_dfp_recip;
74   int xchal_have_dfp_sqrt;
75   int xchal_have_dfp_rsqrt;
76   int xchal_have_windowed;
77   int xchal_num_aregs;
78   int xchal_have_wide_branches;
79   int xchal_have_predicted_branches;
80   int xchal_icache_size;
81   int xchal_dcache_size;
82   int xchal_icache_linesize;
83   int xchal_dcache_linesize;
84   int xchal_icache_linewidth;
85   int xchal_dcache_linewidth;
86   int xchal_dcache_is_writeback;
87   int xchal_have_mmu;
88   int xchal_mmu_min_pte_page_size;
89   int xchal_have_debug;
90   int xchal_num_ibreak;
91   int xchal_num_dbreak;
92   int xchal_debuglevel;
93   int xchal_max_instruction_size;
94   int xchal_inst_fetch_width;
95   int xshal_abi;
96   int xthal_abi_windowed;
97   int xthal_abi_call0;
98 };
99 
100 struct xtensa_config_v2
101 {
102   int xchal_m_stage;
103   int xtensa_march_latest;
104   int xtensa_march_earliest;
105 };
106 
107 typedef struct xtensa_isa_internal_struct xtensa_isa_internal;
108 
109 extern const void *xtensa_load_config (const char *name,
110 				       const void *no_plugin_def,
111 				       const void *no_name_def);
112 extern const struct xtensa_config_v1 *xtensa_get_config_v1 (void);
113 extern const struct xtensa_config_v2 *xtensa_get_config_v2 (void);
114 
115 #ifdef XTENSA_CONFIG_DEFINITION
116 
117 #ifndef XCHAL_HAVE_MUL32_HIGH
118 #define XCHAL_HAVE_MUL32_HIGH 0
119 #endif
120 
121 #ifndef XCHAL_HAVE_RELEASE_SYNC
122 #define XCHAL_HAVE_RELEASE_SYNC 0
123 #endif
124 
125 #ifndef XCHAL_HAVE_S32C1I
126 #define XCHAL_HAVE_S32C1I 0
127 #endif
128 
129 #ifndef XCHAL_HAVE_THREADPTR
130 #define XCHAL_HAVE_THREADPTR 0
131 #endif
132 
133 #ifndef XCHAL_HAVE_FP_POSTINC
134 #define XCHAL_HAVE_FP_POSTINC 0
135 #endif
136 
137 #ifndef XCHAL_HAVE_DFP
138 #define XCHAL_HAVE_DFP 0
139 #endif
140 
141 #ifndef XCHAL_HAVE_DFP_DIV
142 #define XCHAL_HAVE_DFP_DIV 0
143 #endif
144 
145 #ifndef XCHAL_HAVE_DFP_RECIP
146 #define XCHAL_HAVE_DFP_RECIP 0
147 #endif
148 
149 #ifndef XCHAL_HAVE_DFP_SQRT
150 #define XCHAL_HAVE_DFP_SQRT 0
151 #endif
152 
153 #ifndef XCHAL_HAVE_DFP_RSQRT
154 #define XCHAL_HAVE_DFP_RSQRT 0
155 #endif
156 
157 #ifndef XSHAL_HAVE_TEXT_SECTION_LITERALS
158 #define XSHAL_HAVE_TEXT_SECTION_LITERALS 0
159 #endif
160 
161 #ifndef XCHAL_MMU_MIN_PTE_PAGE_SIZE
162 #define XCHAL_MMU_MIN_PTE_PAGE_SIZE 1
163 #endif
164 
165 #ifndef XTHAL_ABI_WINDOWED
166 #define XTHAL_ABI_WINDOWED 0
167 #endif
168 
169 #ifndef XTHAL_ABI_CALL0
170 #define XTHAL_ABI_CALL0 1
171 #endif
172 
173 #ifndef XCHAL_M_STAGE
174 #define XCHAL_M_STAGE 0
175 #endif
176 
177 #ifndef XTENSA_MARCH_LATEST
178 #define XTENSA_MARCH_LATEST 0
179 #endif
180 
181 #ifndef XTENSA_MARCH_EARLIEST
182 #define XTENSA_MARCH_EARLIEST 0
183 #endif
184 
185 #define XTENSA_CONFIG_ENTRY(a) a
186 
187 #define XTENSA_CONFIG_V1_ENTRY_LIST \
188     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_BE), \
189     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_DENSITY), \
190     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_CONST16), \
191     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_ABS), \
192     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_ADDX), \
193     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_L32R), \
194     XTENSA_CONFIG_ENTRY(XSHAL_USE_ABSOLUTE_LITERALS), \
195     XTENSA_CONFIG_ENTRY(XSHAL_HAVE_TEXT_SECTION_LITERALS), \
196     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_MAC16), \
197     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_MUL16), \
198     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_MUL32), \
199     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_MUL32_HIGH), \
200     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_DIV32), \
201     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_NSA), \
202     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_MINMAX), \
203     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_SEXT), \
204     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_LOOPS), \
205     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_THREADPTR), \
206     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_RELEASE_SYNC), \
207     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_S32C1I), \
208     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_BOOLEANS), \
209     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_FP), \
210     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_FP_DIV), \
211     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_FP_RECIP), \
212     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_FP_SQRT), \
213     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_FP_RSQRT), \
214     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_FP_POSTINC), \
215     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_DFP), \
216     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_DFP_DIV), \
217     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_DFP_RECIP), \
218     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_DFP_SQRT), \
219     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_DFP_RSQRT), \
220     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_WINDOWED), \
221     XTENSA_CONFIG_ENTRY(XCHAL_NUM_AREGS), \
222     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_WIDE_BRANCHES), \
223     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_PREDICTED_BRANCHES), \
224     XTENSA_CONFIG_ENTRY(XCHAL_ICACHE_SIZE), \
225     XTENSA_CONFIG_ENTRY(XCHAL_DCACHE_SIZE), \
226     XTENSA_CONFIG_ENTRY(XCHAL_ICACHE_LINESIZE), \
227     XTENSA_CONFIG_ENTRY(XCHAL_DCACHE_LINESIZE), \
228     XTENSA_CONFIG_ENTRY(XCHAL_ICACHE_LINEWIDTH), \
229     XTENSA_CONFIG_ENTRY(XCHAL_DCACHE_LINEWIDTH), \
230     XTENSA_CONFIG_ENTRY(XCHAL_DCACHE_IS_WRITEBACK), \
231     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_MMU), \
232     XTENSA_CONFIG_ENTRY(XCHAL_MMU_MIN_PTE_PAGE_SIZE), \
233     XTENSA_CONFIG_ENTRY(XCHAL_HAVE_DEBUG), \
234     XTENSA_CONFIG_ENTRY(XCHAL_NUM_IBREAK), \
235     XTENSA_CONFIG_ENTRY(XCHAL_NUM_DBREAK), \
236     XTENSA_CONFIG_ENTRY(XCHAL_DEBUGLEVEL), \
237     XTENSA_CONFIG_ENTRY(XCHAL_MAX_INSTRUCTION_SIZE), \
238     XTENSA_CONFIG_ENTRY(XCHAL_INST_FETCH_WIDTH), \
239     XTENSA_CONFIG_ENTRY(XSHAL_ABI), \
240     XTENSA_CONFIG_ENTRY(XTHAL_ABI_WINDOWED), \
241     XTENSA_CONFIG_ENTRY(XTHAL_ABI_CALL0)
242 
243 #define XTENSA_CONFIG_V2_ENTRY_LIST \
244     XTENSA_CONFIG_ENTRY(XCHAL_M_STAGE), \
245     XTENSA_CONFIG_ENTRY(XTENSA_MARCH_LATEST), \
246     XTENSA_CONFIG_ENTRY(XTENSA_MARCH_EARLIEST)
247 
248 #define XTENSA_CONFIG_INSTANCE_LIST \
249 const struct xtensa_config_v1 xtensa_config_v1 = { \
250     XTENSA_CONFIG_V1_ENTRY_LIST, \
251 }; \
252 const struct xtensa_config_v2 xtensa_config_v2 = { \
253     XTENSA_CONFIG_V2_ENTRY_LIST, \
254 }
255 
256 #define XTENSA_CONFIG_ENTRY_LIST \
257     XTENSA_CONFIG_V1_ENTRY_LIST, \
258     XTENSA_CONFIG_V2_ENTRY_LIST
259 
260 #else /* XTENSA_CONFIG_DEFINITION */
261 
262 #undef XCHAL_HAVE_BE
263 #define XCHAL_HAVE_BE			(xtensa_get_config_v1 ()->xchal_have_be)
264 
265 #undef XCHAL_HAVE_DENSITY
266 #define XCHAL_HAVE_DENSITY		(xtensa_get_config_v1 ()->xchal_have_density)
267 
268 #undef XCHAL_HAVE_CONST16
269 #define XCHAL_HAVE_CONST16		(xtensa_get_config_v1 ()->xchal_have_const16)
270 
271 #undef XCHAL_HAVE_ABS
272 #define XCHAL_HAVE_ABS			(xtensa_get_config_v1 ()->xchal_have_abs)
273 
274 #undef XCHAL_HAVE_ADDX
275 #define XCHAL_HAVE_ADDX			(xtensa_get_config_v1 ()->xchal_have_addx)
276 
277 #undef XCHAL_HAVE_L32R
278 #define XCHAL_HAVE_L32R			(xtensa_get_config_v1 ()->xchal_have_l32r)
279 
280 #undef XSHAL_USE_ABSOLUTE_LITERALS
281 #define XSHAL_USE_ABSOLUTE_LITERALS	(xtensa_get_config_v1 ()->xshal_use_absolute_literals)
282 
283 #undef XSHAL_HAVE_TEXT_SECTION_LITERALS
284 #define XSHAL_HAVE_TEXT_SECTION_LITERALS (xtensa_get_config_v1 ()->xshal_have_text_section_literals)
285 
286 #undef XCHAL_HAVE_MAC16
287 #define XCHAL_HAVE_MAC16		(xtensa_get_config_v1 ()->xchal_have_mac16)
288 
289 #undef XCHAL_HAVE_MUL16
290 #define XCHAL_HAVE_MUL16		(xtensa_get_config_v1 ()->xchal_have_mul16)
291 
292 #undef XCHAL_HAVE_MUL32
293 #define XCHAL_HAVE_MUL32		(xtensa_get_config_v1 ()->xchal_have_mul32)
294 
295 #undef XCHAL_HAVE_MUL32_HIGH
296 #define XCHAL_HAVE_MUL32_HIGH		(xtensa_get_config_v1 ()->xchal_have_mul32_high)
297 
298 #undef XCHAL_HAVE_DIV32
299 #define XCHAL_HAVE_DIV32		(xtensa_get_config_v1 ()->xchal_have_div32)
300 
301 #undef XCHAL_HAVE_NSA
302 #define XCHAL_HAVE_NSA			(xtensa_get_config_v1 ()->xchal_have_nsa)
303 
304 #undef XCHAL_HAVE_MINMAX
305 #define XCHAL_HAVE_MINMAX		(xtensa_get_config_v1 ()->xchal_have_minmax)
306 
307 #undef XCHAL_HAVE_SEXT
308 #define XCHAL_HAVE_SEXT			(xtensa_get_config_v1 ()->xchal_have_sext)
309 
310 #undef XCHAL_HAVE_LOOPS
311 #define XCHAL_HAVE_LOOPS		(xtensa_get_config_v1 ()->xchal_have_loops)
312 
313 #undef XCHAL_HAVE_THREADPTR
314 #define XCHAL_HAVE_THREADPTR		(xtensa_get_config_v1 ()->xchal_have_threadptr)
315 
316 #undef XCHAL_HAVE_RELEASE_SYNC
317 #define XCHAL_HAVE_RELEASE_SYNC		(xtensa_get_config_v1 ()->xchal_have_release_sync)
318 
319 #undef XCHAL_HAVE_S32C1I
320 #define XCHAL_HAVE_S32C1I		(xtensa_get_config_v1 ()->xchal_have_s32c1i)
321 
322 #undef XCHAL_HAVE_BOOLEANS
323 #define XCHAL_HAVE_BOOLEANS		(xtensa_get_config_v1 ()->xchal_have_booleans)
324 
325 #undef XCHAL_HAVE_FP
326 #define XCHAL_HAVE_FP			(xtensa_get_config_v1 ()->xchal_have_fp)
327 
328 #undef XCHAL_HAVE_FP_DIV
329 #define XCHAL_HAVE_FP_DIV		(xtensa_get_config_v1 ()->xchal_have_fp_div)
330 
331 #undef XCHAL_HAVE_FP_RECIP
332 #define XCHAL_HAVE_FP_RECIP		(xtensa_get_config_v1 ()->xchal_have_fp_recip)
333 
334 #undef XCHAL_HAVE_FP_SQRT
335 #define XCHAL_HAVE_FP_SQRT		(xtensa_get_config_v1 ()->xchal_have_fp_sqrt)
336 
337 #undef XCHAL_HAVE_FP_RSQRT
338 #define XCHAL_HAVE_FP_RSQRT		(xtensa_get_config_v1 ()->xchal_have_fp_rsqrt)
339 
340 #undef XCHAL_HAVE_FP_POSTINC
341 #define XCHAL_HAVE_FP_POSTINC		(xtensa_get_config_v1 ()->xchal_have_fp_postinc)
342 
343 #undef XCHAL_HAVE_DFP
344 #define XCHAL_HAVE_DFP			(xtensa_get_config_v1 ()->xchal_have_dfp)
345 
346 #undef XCHAL_HAVE_DFP_DIV
347 #define XCHAL_HAVE_DFP_DIV		(xtensa_get_config_v1 ()->xchal_have_dfp_div)
348 
349 #undef XCHAL_HAVE_DFP_RECIP
350 #define XCHAL_HAVE_DFP_RECIP		(xtensa_get_config_v1 ()->xchal_have_dfp_recip)
351 
352 #undef XCHAL_HAVE_DFP_SQRT
353 #define XCHAL_HAVE_DFP_SQRT		(xtensa_get_config_v1 ()->xchal_have_dfp_sqrt)
354 
355 #undef XCHAL_HAVE_DFP_RSQRT
356 #define XCHAL_HAVE_DFP_RSQRT		(xtensa_get_config_v1 ()->xchal_have_dfp_rsqrt)
357 
358 #undef XCHAL_HAVE_WINDOWED
359 #define XCHAL_HAVE_WINDOWED		(xtensa_get_config_v1 ()->xchal_have_windowed)
360 
361 #undef XCHAL_NUM_AREGS
362 #define XCHAL_NUM_AREGS			(xtensa_get_config_v1 ()->xchal_num_aregs)
363 
364 #undef XCHAL_HAVE_WIDE_BRANCHES
365 #define XCHAL_HAVE_WIDE_BRANCHES	(xtensa_get_config_v1 ()->xchal_have_wide_branches)
366 
367 #undef XCHAL_HAVE_PREDICTED_BRANCHES
368 #define XCHAL_HAVE_PREDICTED_BRANCHES	(xtensa_get_config_v1 ()->xchal_have_predicted_branches)
369 
370 
371 #undef XCHAL_ICACHE_SIZE
372 #define XCHAL_ICACHE_SIZE		(xtensa_get_config_v1 ()->xchal_icache_size)
373 
374 #undef XCHAL_DCACHE_SIZE
375 #define XCHAL_DCACHE_SIZE		(xtensa_get_config_v1 ()->xchal_dcache_size)
376 
377 #undef XCHAL_ICACHE_LINESIZE
378 #define XCHAL_ICACHE_LINESIZE		(xtensa_get_config_v1 ()->xchal_icache_linesize)
379 
380 #undef XCHAL_DCACHE_LINESIZE
381 #define XCHAL_DCACHE_LINESIZE		(xtensa_get_config_v1 ()->xchal_dcache_linesize)
382 
383 #undef XCHAL_ICACHE_LINEWIDTH
384 #define XCHAL_ICACHE_LINEWIDTH		(xtensa_get_config_v1 ()->xchal_icache_linewidth)
385 
386 #undef XCHAL_DCACHE_LINEWIDTH
387 #define XCHAL_DCACHE_LINEWIDTH		(xtensa_get_config_v1 ()->xchal_dcache_linewidth)
388 
389 #undef XCHAL_DCACHE_IS_WRITEBACK
390 #define XCHAL_DCACHE_IS_WRITEBACK	(xtensa_get_config_v1 ()->xchal_dcache_is_writeback)
391 
392 
393 #undef XCHAL_HAVE_MMU
394 #define XCHAL_HAVE_MMU			(xtensa_get_config_v1 ()->xchal_have_mmu)
395 
396 #undef XCHAL_MMU_MIN_PTE_PAGE_SIZE
397 #define XCHAL_MMU_MIN_PTE_PAGE_SIZE	(xtensa_get_config_v1 ()->xchal_mmu_min_pte_page_size)
398 
399 
400 #undef XCHAL_HAVE_DEBUG
401 #define XCHAL_HAVE_DEBUG		(xtensa_get_config_v1 ()->xchal_have_debug)
402 
403 #undef XCHAL_NUM_IBREAK
404 #define XCHAL_NUM_IBREAK		(xtensa_get_config_v1 ()->xchal_num_ibreak)
405 
406 #undef XCHAL_NUM_DBREAK
407 #define XCHAL_NUM_DBREAK		(xtensa_get_config_v1 ()->xchal_num_dbreak)
408 
409 #undef XCHAL_DEBUGLEVEL
410 #define XCHAL_DEBUGLEVEL		(xtensa_get_config_v1 ()->xchal_debuglevel)
411 
412 
413 #undef XCHAL_MAX_INSTRUCTION_SIZE
414 #define XCHAL_MAX_INSTRUCTION_SIZE	(xtensa_get_config_v1 ()->xchal_max_instruction_size)
415 
416 #undef XCHAL_INST_FETCH_WIDTH
417 #define XCHAL_INST_FETCH_WIDTH		(xtensa_get_config_v1 ()->xchal_inst_fetch_width)
418 
419 
420 #undef XSHAL_ABI
421 #undef XTHAL_ABI_WINDOWED
422 #undef XTHAL_ABI_CALL0
423 #define XSHAL_ABI			(xtensa_get_config_v1 ()->xshal_abi)
424 #define XTHAL_ABI_WINDOWED		(xtensa_get_config_v1 ()->xthal_abi_windowed)
425 #define XTHAL_ABI_CALL0			(xtensa_get_config_v1 ()->xthal_abi_call0)
426 
427 
428 #undef XCHAL_M_STAGE
429 #define XCHAL_M_STAGE			(xtensa_get_config_v2 ()->xchal_m_stage)
430 
431 #undef XTENSA_MARCH_LATEST
432 #define XTENSA_MARCH_LATEST		(xtensa_get_config_v2 ()->xtensa_march_latest)
433 
434 #undef XTENSA_MARCH_EARLIEST
435 #define XTENSA_MARCH_EARLIEST		(xtensa_get_config_v2 ()->xtensa_march_earliest)
436 
437 #endif /* XTENSA_CONFIG_DEFINITION */
438 
439 #ifdef __cplusplus
440 }
441 #endif
442 #endif /* !XTENSA_DYNCONFIG_H */
443