xref: /OK3568_Linux_fs/kernel/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Aic7xxx SCSI host adapter firmware assembler symbol table definitions
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (c) 1997 Justin T. Gibbs.
5*4882a593Smuzhiyun  * Copyright (c) 2002 Adaptec Inc.
6*4882a593Smuzhiyun  * All rights reserved.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Redistribution and use in source and binary forms, with or without
9*4882a593Smuzhiyun  * modification, are permitted provided that the following conditions
10*4882a593Smuzhiyun  * are met:
11*4882a593Smuzhiyun  * 1. Redistributions of source code must retain the above copyright
12*4882a593Smuzhiyun  *    notice, this list of conditions, and the following disclaimer,
13*4882a593Smuzhiyun  *    without modification.
14*4882a593Smuzhiyun  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
15*4882a593Smuzhiyun  *    substantially similar to the "NO WARRANTY" disclaimer below
16*4882a593Smuzhiyun  *    ("Disclaimer") and any redistribution must be conditioned upon
17*4882a593Smuzhiyun  *    including a substantially similar Disclaimer requirement for further
18*4882a593Smuzhiyun  *    binary redistribution.
19*4882a593Smuzhiyun  * 3. Neither the names of the above-listed copyright holders nor the names
20*4882a593Smuzhiyun  *    of any contributors may be used to endorse or promote products derived
21*4882a593Smuzhiyun  *    from this software without specific prior written permission.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * Alternatively, this software may be distributed under the terms of the
24*4882a593Smuzhiyun  * GNU General Public License ("GPL") version 2 as published by the Free
25*4882a593Smuzhiyun  * Software Foundation.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  * NO WARRANTY
28*4882a593Smuzhiyun  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29*4882a593Smuzhiyun  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30*4882a593Smuzhiyun  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
31*4882a593Smuzhiyun  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32*4882a593Smuzhiyun  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33*4882a593Smuzhiyun  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34*4882a593Smuzhiyun  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35*4882a593Smuzhiyun  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
36*4882a593Smuzhiyun  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
37*4882a593Smuzhiyun  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38*4882a593Smuzhiyun  * POSSIBILITY OF SUCH DAMAGES.
39*4882a593Smuzhiyun  *
40*4882a593Smuzhiyun  * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.h#17 $
41*4882a593Smuzhiyun  *
42*4882a593Smuzhiyun  * $FreeBSD$
43*4882a593Smuzhiyun  */
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #include "../queue.h"
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun typedef enum {
48*4882a593Smuzhiyun 	UNINITIALIZED,
49*4882a593Smuzhiyun 	REGISTER,
50*4882a593Smuzhiyun 	ALIAS,
51*4882a593Smuzhiyun 	SCBLOC,
52*4882a593Smuzhiyun 	SRAMLOC,
53*4882a593Smuzhiyun 	ENUM_ENTRY,
54*4882a593Smuzhiyun 	FIELD,
55*4882a593Smuzhiyun 	MASK,
56*4882a593Smuzhiyun 	ENUM,
57*4882a593Smuzhiyun 	CONST,
58*4882a593Smuzhiyun 	DOWNLOAD_CONST,
59*4882a593Smuzhiyun 	LABEL,
60*4882a593Smuzhiyun 	CONDITIONAL,
61*4882a593Smuzhiyun 	MACRO
62*4882a593Smuzhiyun } symtype;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun typedef enum {
65*4882a593Smuzhiyun 	RO = 0x01,
66*4882a593Smuzhiyun 	WO = 0x02,
67*4882a593Smuzhiyun 	RW = 0x03
68*4882a593Smuzhiyun }amode_t;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun typedef SLIST_HEAD(symlist, symbol_node) symlist_t;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun struct reg_info {
73*4882a593Smuzhiyun 	u_int	  address;
74*4882a593Smuzhiyun 	int	  size;
75*4882a593Smuzhiyun 	amode_t	  mode;
76*4882a593Smuzhiyun 	symlist_t fields;
77*4882a593Smuzhiyun 	uint8_t	  valid_bitmask;
78*4882a593Smuzhiyun 	uint8_t	  modes;
79*4882a593Smuzhiyun 	int	  typecheck_masks;
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun struct field_info {
83*4882a593Smuzhiyun 	symlist_t symrefs;
84*4882a593Smuzhiyun 	uint8_t	  value;
85*4882a593Smuzhiyun 	uint8_t	  mask;
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun struct const_info {
89*4882a593Smuzhiyun 	u_int	value;
90*4882a593Smuzhiyun 	int	define;
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun struct alias_info {
94*4882a593Smuzhiyun 	struct symbol *parent;
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun struct label_info {
98*4882a593Smuzhiyun 	int	address;
99*4882a593Smuzhiyun 	int	exported;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct cond_info {
103*4882a593Smuzhiyun 	int	func_num;
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun struct macro_arg {
107*4882a593Smuzhiyun 	STAILQ_ENTRY(macro_arg)	links;
108*4882a593Smuzhiyun 	regex_t	arg_regex;
109*4882a593Smuzhiyun 	char   *replacement_text;
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun STAILQ_HEAD(macro_arg_list, macro_arg) args;
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun struct macro_info {
114*4882a593Smuzhiyun 	struct macro_arg_list args;
115*4882a593Smuzhiyun 	int   narg;
116*4882a593Smuzhiyun 	const char* body;
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun typedef struct expression_info {
120*4882a593Smuzhiyun         symlist_t       referenced_syms;
121*4882a593Smuzhiyun         int             value;
122*4882a593Smuzhiyun } expression_t;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun typedef struct symbol {
125*4882a593Smuzhiyun 	char	*name;
126*4882a593Smuzhiyun 	symtype	type;
127*4882a593Smuzhiyun 	int	count;
128*4882a593Smuzhiyun 	union	{
129*4882a593Smuzhiyun 		struct reg_info	  *rinfo;
130*4882a593Smuzhiyun 		struct field_info *finfo;
131*4882a593Smuzhiyun 		struct const_info *cinfo;
132*4882a593Smuzhiyun 		struct alias_info *ainfo;
133*4882a593Smuzhiyun 		struct label_info *linfo;
134*4882a593Smuzhiyun 		struct cond_info  *condinfo;
135*4882a593Smuzhiyun 		struct macro_info *macroinfo;
136*4882a593Smuzhiyun 	} info;
137*4882a593Smuzhiyun 	int	dont_generate_debug_code;
138*4882a593Smuzhiyun } symbol_t;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun typedef struct symbol_ref {
141*4882a593Smuzhiyun 	symbol_t *symbol;
142*4882a593Smuzhiyun 	int	 offset;
143*4882a593Smuzhiyun } symbol_ref_t;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun typedef struct symbol_node {
146*4882a593Smuzhiyun 	SLIST_ENTRY(symbol_node) links;
147*4882a593Smuzhiyun 	symbol_t *symbol;
148*4882a593Smuzhiyun } symbol_node_t;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun typedef struct critical_section {
151*4882a593Smuzhiyun 	TAILQ_ENTRY(critical_section) links;
152*4882a593Smuzhiyun 	int begin_addr;
153*4882a593Smuzhiyun 	int end_addr;
154*4882a593Smuzhiyun } critical_section_t;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun typedef enum {
157*4882a593Smuzhiyun 	SCOPE_ROOT,
158*4882a593Smuzhiyun 	SCOPE_IF,
159*4882a593Smuzhiyun 	SCOPE_ELSE_IF,
160*4882a593Smuzhiyun 	SCOPE_ELSE
161*4882a593Smuzhiyun } scope_type;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun typedef struct patch_info {
164*4882a593Smuzhiyun 	int skip_patch;
165*4882a593Smuzhiyun 	int skip_instr;
166*4882a593Smuzhiyun } patch_info_t;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun typedef struct scope {
169*4882a593Smuzhiyun 	SLIST_ENTRY(scope) scope_stack_links;
170*4882a593Smuzhiyun 	TAILQ_ENTRY(scope) scope_links;
171*4882a593Smuzhiyun 	TAILQ_HEAD(, scope) inner_scope;
172*4882a593Smuzhiyun 	scope_type type;
173*4882a593Smuzhiyun 	int inner_scope_patches;
174*4882a593Smuzhiyun 	int begin_addr;
175*4882a593Smuzhiyun         int end_addr;
176*4882a593Smuzhiyun 	patch_info_t patches[2];
177*4882a593Smuzhiyun 	int func_num;
178*4882a593Smuzhiyun } scope_t;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun TAILQ_HEAD(cs_tailq, critical_section);
181*4882a593Smuzhiyun SLIST_HEAD(scope_list, scope);
182*4882a593Smuzhiyun TAILQ_HEAD(scope_tailq, scope);
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun void	symbol_delete(symbol_t *symbol);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun void	symtable_open(void);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun void	symtable_close(void);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun symbol_t *
191*4882a593Smuzhiyun 	symtable_get(char *name);
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun symbol_node_t *
194*4882a593Smuzhiyun 	symlist_search(symlist_t *symlist, char *symname);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun void
197*4882a593Smuzhiyun 	symlist_add(symlist_t *symlist, symbol_t *symbol, int how);
198*4882a593Smuzhiyun #define SYMLIST_INSERT_HEAD	0x00
199*4882a593Smuzhiyun #define SYMLIST_SORT		0x01
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun void	symlist_free(symlist_t *symlist);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun void	symlist_merge(symlist_t *symlist_dest, symlist_t *symlist_src1,
204*4882a593Smuzhiyun 		      symlist_t *symlist_src2);
205*4882a593Smuzhiyun void	symtable_dump(FILE *ofile, FILE *dfile);
206