xref: /freebsd/sys/dev/aic7xxx/aicasm/aicasm_symbol.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1098ca2bdSWarner Losh /*-
2c5cb3888SJustin T. Gibbs  * Aic7xxx SCSI host adapter firmware asssembler symbol table definitions
3c5cb3888SJustin T. Gibbs  *
4718cf2ccSPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
5718cf2ccSPedro F. Giffuni  *
6c5cb3888SJustin T. Gibbs  * Copyright (c) 1997 Justin T. Gibbs.
763183d8cSJustin T. Gibbs  * Copyright (c) 2002 Adaptec Inc.
8c5cb3888SJustin T. Gibbs  * All rights reserved.
9c5cb3888SJustin T. Gibbs  *
10c5cb3888SJustin T. Gibbs  * Redistribution and use in source and binary forms, with or without
11c5cb3888SJustin T. Gibbs  * modification, are permitted provided that the following conditions
12c5cb3888SJustin T. Gibbs  * are met:
13c5cb3888SJustin T. Gibbs  * 1. Redistributions of source code must retain the above copyright
14f68f348bSJustin T. Gibbs  *    notice, this list of conditions, and the following disclaimer,
1541c47eeeSJustin T. Gibbs  *    without modification.
167ce72dbaSJustin T. Gibbs  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
177ce72dbaSJustin T. Gibbs  *    substantially similar to the "NO WARRANTY" disclaimer below
187ce72dbaSJustin T. Gibbs  *    ("Disclaimer") and any redistribution must be conditioned upon
197ce72dbaSJustin T. Gibbs  *    including a substantially similar Disclaimer requirement for further
207ce72dbaSJustin T. Gibbs  *    binary redistribution.
217ce72dbaSJustin T. Gibbs  * 3. Neither the names of the above-listed copyright holders nor the names
227ce72dbaSJustin T. Gibbs  *    of any contributors may be used to endorse or promote products derived
237ce72dbaSJustin T. Gibbs  *    from this software without specific prior written permission.
24c5cb3888SJustin T. Gibbs  *
25aa6dfd9dSJustin T. Gibbs  * Alternatively, this software may be distributed under the terms of the
267ce72dbaSJustin T. Gibbs  * GNU General Public License ("GPL") version 2 as published by the Free
277ce72dbaSJustin T. Gibbs  * Software Foundation.
28aa6dfd9dSJustin T. Gibbs  *
297ce72dbaSJustin T. Gibbs  * NO WARRANTY
307ce72dbaSJustin T. Gibbs  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
317ce72dbaSJustin T. Gibbs  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
327ce72dbaSJustin T. Gibbs  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
337ce72dbaSJustin T. Gibbs  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
347ce72dbaSJustin T. Gibbs  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35c5cb3888SJustin T. Gibbs  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
36c5cb3888SJustin T. Gibbs  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
377ce72dbaSJustin T. Gibbs  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
387ce72dbaSJustin T. Gibbs  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
397ce72dbaSJustin T. Gibbs  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
407ce72dbaSJustin T. Gibbs  * POSSIBILITY OF SUCH DAMAGES.
41c5cb3888SJustin T. Gibbs  *
4263183d8cSJustin T. Gibbs  * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.h#17 $
43c5cb3888SJustin T. Gibbs  */
44c5cb3888SJustin T. Gibbs 
45c5cb3888SJustin T. Gibbs #include <sys/queue.h>
46c5cb3888SJustin T. Gibbs 
47c5cb3888SJustin T. Gibbs typedef enum {
48c5cb3888SJustin T. Gibbs 	UNINITIALIZED,
49c5cb3888SJustin T. Gibbs 	REGISTER,
50c5cb3888SJustin T. Gibbs 	ALIAS,
51c5cb3888SJustin T. Gibbs 	SCBLOC,
52c5cb3888SJustin T. Gibbs 	SRAMLOC,
5363183d8cSJustin T. Gibbs 	ENUM_ENTRY,
5463183d8cSJustin T. Gibbs 	FIELD,
55c5cb3888SJustin T. Gibbs 	MASK,
5663183d8cSJustin T. Gibbs 	ENUM,
57c5cb3888SJustin T. Gibbs 	CONST,
5837507c1bSJustin T. Gibbs 	DOWNLOAD_CONST,
59c5cb3888SJustin T. Gibbs 	LABEL,
607ce72dbaSJustin T. Gibbs 	CONDITIONAL,
617ce72dbaSJustin T. Gibbs 	MACRO
62c5cb3888SJustin T. Gibbs } symtype;
63c5cb3888SJustin T. Gibbs 
64c5cb3888SJustin T. Gibbs typedef enum {
65c5cb3888SJustin T. Gibbs 	RO = 0x01,
66c5cb3888SJustin T. Gibbs 	WO = 0x02,
67c5cb3888SJustin T. Gibbs 	RW = 0x03
68c5cb3888SJustin T. Gibbs }amode_t;
69c5cb3888SJustin T. Gibbs 
7063183d8cSJustin T. Gibbs typedef SLIST_HEAD(symlist, symbol_node) symlist_t;
7163183d8cSJustin T. Gibbs 
72c5cb3888SJustin T. Gibbs struct reg_info {
737ce72dbaSJustin T. Gibbs 	u_int	  address;
74c5cb3888SJustin T. Gibbs 	int	  size;
75c5cb3888SJustin T. Gibbs 	amode_t	  mode;
7663183d8cSJustin T. Gibbs 	symlist_t fields;
7763183d8cSJustin T. Gibbs 	uint8_t	  valid_bitmask;
7863183d8cSJustin T. Gibbs 	uint8_t	  modes;
79c5cb3888SJustin T. Gibbs 	int	  typecheck_masks;
80c5cb3888SJustin T. Gibbs };
81c5cb3888SJustin T. Gibbs 
8263183d8cSJustin T. Gibbs struct field_info {
83c5cb3888SJustin T. Gibbs 	symlist_t symrefs;
8463183d8cSJustin T. Gibbs 	uint8_t	  value;
8563183d8cSJustin T. Gibbs 	uint8_t	  mask;
86c5cb3888SJustin T. Gibbs };
87c5cb3888SJustin T. Gibbs 
88c5cb3888SJustin T. Gibbs struct const_info {
897ce72dbaSJustin T. Gibbs 	u_int	value;
90c5cb3888SJustin T. Gibbs 	int	define;
91c5cb3888SJustin T. Gibbs };
92c5cb3888SJustin T. Gibbs 
93c5cb3888SJustin T. Gibbs struct alias_info {
94c5cb3888SJustin T. Gibbs 	struct symbol *parent;
95c5cb3888SJustin T. Gibbs };
96c5cb3888SJustin T. Gibbs 
97c5cb3888SJustin T. Gibbs struct label_info {
98c5cb3888SJustin T. Gibbs 	int	address;
997ce72dbaSJustin T. Gibbs 	int	exported;
100c5cb3888SJustin T. Gibbs };
101c5cb3888SJustin T. Gibbs 
102c5cb3888SJustin T. Gibbs struct cond_info {
1033bafc9d4SJustin T. Gibbs 	int	func_num;
104c5cb3888SJustin T. Gibbs };
105c5cb3888SJustin T. Gibbs 
1067ce72dbaSJustin T. Gibbs struct macro_arg {
1077ce72dbaSJustin T. Gibbs 	STAILQ_ENTRY(macro_arg)	links;
1087ce72dbaSJustin T. Gibbs 	regex_t	arg_regex;
1097ce72dbaSJustin T. Gibbs 	char   *replacement_text;
1107ce72dbaSJustin T. Gibbs };
111*5e912f5fSJessica Clarke STAILQ_HEAD(macro_arg_list, macro_arg);
1127ce72dbaSJustin T. Gibbs 
1137ce72dbaSJustin T. Gibbs struct macro_info {
1147ce72dbaSJustin T. Gibbs 	struct macro_arg_list args;
1157ce72dbaSJustin T. Gibbs 	int   narg;
1167ce72dbaSJustin T. Gibbs 	const char* body;
1177ce72dbaSJustin T. Gibbs };
1187ce72dbaSJustin T. Gibbs 
119c5cb3888SJustin T. Gibbs typedef struct expression_info {
120c5cb3888SJustin T. Gibbs         symlist_t       referenced_syms;
121c5cb3888SJustin T. Gibbs         int             value;
122c5cb3888SJustin T. Gibbs } expression_t;
123c5cb3888SJustin T. Gibbs 
124c5cb3888SJustin T. Gibbs typedef struct symbol {
125c5cb3888SJustin T. Gibbs 	char	*name;
126c5cb3888SJustin T. Gibbs 	symtype	type;
127c5cb3888SJustin T. Gibbs 	union	{
128c5cb3888SJustin T. Gibbs 		struct reg_info	  *rinfo;
12963183d8cSJustin T. Gibbs 		struct field_info *finfo;
130c5cb3888SJustin T. Gibbs 		struct const_info *cinfo;
131c5cb3888SJustin T. Gibbs 		struct alias_info *ainfo;
132c5cb3888SJustin T. Gibbs 		struct label_info *linfo;
133c5cb3888SJustin T. Gibbs 		struct cond_info  *condinfo;
1347ce72dbaSJustin T. Gibbs 		struct macro_info *macroinfo;
135c5cb3888SJustin T. Gibbs 	}info;
136c5cb3888SJustin T. Gibbs } symbol_t;
137c5cb3888SJustin T. Gibbs 
138c5cb3888SJustin T. Gibbs typedef struct symbol_ref {
139c5cb3888SJustin T. Gibbs 	symbol_t *symbol;
140c5cb3888SJustin T. Gibbs 	int	 offset;
141c5cb3888SJustin T. Gibbs } symbol_ref_t;
142c5cb3888SJustin T. Gibbs 
143c5cb3888SJustin T. Gibbs typedef struct symbol_node {
144e3975643SJake Burkholder 	SLIST_ENTRY(symbol_node) links;
145c5cb3888SJustin T. Gibbs 	symbol_t *symbol;
146c5cb3888SJustin T. Gibbs } symbol_node_t;
147c5cb3888SJustin T. Gibbs 
148083d01f2SJustin T. Gibbs typedef struct critical_section {
149083d01f2SJustin T. Gibbs 	TAILQ_ENTRY(critical_section) links;
150083d01f2SJustin T. Gibbs 	int begin_addr;
151083d01f2SJustin T. Gibbs 	int end_addr;
152083d01f2SJustin T. Gibbs } critical_section_t;
153083d01f2SJustin T. Gibbs 
1543bafc9d4SJustin T. Gibbs typedef enum {
1553bafc9d4SJustin T. Gibbs 	SCOPE_ROOT,
1563bafc9d4SJustin T. Gibbs 	SCOPE_IF,
1573bafc9d4SJustin T. Gibbs 	SCOPE_ELSE_IF,
1583bafc9d4SJustin T. Gibbs 	SCOPE_ELSE
1593bafc9d4SJustin T. Gibbs } scope_type;
1603bafc9d4SJustin T. Gibbs 
1613bafc9d4SJustin T. Gibbs typedef struct patch_info {
1623bafc9d4SJustin T. Gibbs 	int skip_patch;
1633bafc9d4SJustin T. Gibbs 	int skip_instr;
1643bafc9d4SJustin T. Gibbs } patch_info_t;
1653bafc9d4SJustin T. Gibbs 
1663bafc9d4SJustin T. Gibbs typedef struct scope {
167e3975643SJake Burkholder 	SLIST_ENTRY(scope) scope_stack_links;
168e3975643SJake Burkholder 	TAILQ_ENTRY(scope) scope_links;
169e3975643SJake Burkholder 	TAILQ_HEAD(, scope) inner_scope;
1703bafc9d4SJustin T. Gibbs 	scope_type type;
1713bafc9d4SJustin T. Gibbs 	int inner_scope_patches;
1723bafc9d4SJustin T. Gibbs 	int begin_addr;
1733bafc9d4SJustin T. Gibbs         int end_addr;
1743bafc9d4SJustin T. Gibbs 	patch_info_t patches[2];
1753bafc9d4SJustin T. Gibbs 	int func_num;
1763bafc9d4SJustin T. Gibbs } scope_t;
1773bafc9d4SJustin T. Gibbs 
178083d01f2SJustin T. Gibbs TAILQ_HEAD(cs_tailq, critical_section);
179e3975643SJake Burkholder SLIST_HEAD(scope_list, scope);
180e3975643SJake Burkholder TAILQ_HEAD(scope_tailq, scope);
181c5cb3888SJustin T. Gibbs 
18263183d8cSJustin T. Gibbs void	symbol_delete(symbol_t *symbol);
183c5cb3888SJustin T. Gibbs 
18463183d8cSJustin T. Gibbs void	symtable_open(void);
185c5cb3888SJustin T. Gibbs 
18663183d8cSJustin T. Gibbs void	symtable_close(void);
187c5cb3888SJustin T. Gibbs 
188c5cb3888SJustin T. Gibbs symbol_t *
189b18a2ef1SXin LI 	symtable_get(const char *name);
190c5cb3888SJustin T. Gibbs 
191c5cb3888SJustin T. Gibbs symbol_node_t *
19263183d8cSJustin T. Gibbs 	symlist_search(symlist_t *symlist, char *symname);
193c5cb3888SJustin T. Gibbs 
194c5cb3888SJustin T. Gibbs void
19563183d8cSJustin T. Gibbs 	symlist_add(symlist_t *symlist, symbol_t *symbol, int how);
196c5cb3888SJustin T. Gibbs #define SYMLIST_INSERT_HEAD	0x00
197c5cb3888SJustin T. Gibbs #define SYMLIST_SORT		0x01
198c5cb3888SJustin T. Gibbs 
19963183d8cSJustin T. Gibbs void	symlist_free(symlist_t *symlist);
200c5cb3888SJustin T. Gibbs 
20163183d8cSJustin T. Gibbs void	symlist_merge(symlist_t *symlist_dest, symlist_t *symlist_src1,
20263183d8cSJustin T. Gibbs 		      symlist_t *symlist_src2);
20363183d8cSJustin T. Gibbs void	symtable_dump(FILE *ofile, FILE *dfile);
204