aicasm_symbol.h revision 102668
155714Skris/*
255714Skris * Aic7xxx SCSI host adapter firmware asssembler symbol table definitions
355714Skris *
455714Skris * Copyright (c) 1997 Justin T. Gibbs.
555714Skris * Copyright (c) 2002 Adaptec Inc.
655714Skris * All rights reserved.
755714Skris *
8280304Sjkim * Redistribution and use in source and binary forms, with or without
955714Skris * modification, are permitted provided that the following conditions
1055714Skris * are met:
1155714Skris * 1. Redistributions of source code must retain the above copyright
1255714Skris *    notice, this list of conditions, and the following disclaimer,
1355714Skris *    without modification.
1455714Skris * 2. Redistributions in binary form must reproduce at minimum a disclaimer
15280304Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
1655714Skris *    ("Disclaimer") and any redistribution must be conditioned upon
1755714Skris *    including a substantially similar Disclaimer requirement for further
1855714Skris *    binary redistribution.
1955714Skris * 3. Neither the names of the above-listed copyright holders nor the names
2055714Skris *    of any contributors may be used to endorse or promote products derived
2155714Skris *    from this software without specific prior written permission.
22280304Sjkim *
2355714Skris * Alternatively, this software may be distributed under the terms of the
2455714Skris * GNU General Public License ("GPL") version 2 as published by the Free
2555714Skris * Software Foundation.
2655714Skris *
2755714Skris * NO WARRANTY
2855714Skris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2955714Skris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3055714Skris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3155714Skris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3255714Skris * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3355714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3455714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3555714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3655714Skris * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
37280304Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3855714Skris * POSSIBILITY OF SUCH DAMAGES.
3955714Skris *
40280304Sjkim * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.h#17 $
4155714Skris *
4255714Skris * $FreeBSD: head/sys/dev/aic7xxx/aicasm/aicasm_symbol.h 102668 2002-08-31 06:39:41Z gibbs $
4355714Skris */
4455714Skris
4555714Skris#ifdef __linux__
4655714Skris#include "../queue.h"
4755714Skris#else
4855714Skris#include <sys/queue.h>
4955714Skris#endif
5055714Skris
5155714Skristypedef enum {
52280304Sjkim	UNINITIALIZED,
5355714Skris	REGISTER,
5455714Skris	ALIAS,
5555714Skris	SCBLOC,
5655714Skris	SRAMLOC,
5755714Skris	ENUM_ENTRY,
5855714Skris	FIELD,
5955714Skris	MASK,
6055714Skris	ENUM,
6155714Skris	CONST,
62280304Sjkim	DOWNLOAD_CONST,
63280304Sjkim	LABEL,
64280304Sjkim	CONDITIONAL,
65280304Sjkim	MACRO
6655714Skris} symtype;
6768651Skris
68280304Sjkimtypedef enum {
69280304Sjkim	RO = 0x01,
70280304Sjkim	WO = 0x02,
71280304Sjkim	RW = 0x03
72280304Sjkim}amode_t;
73280304Sjkim
74280304Sjkimtypedef SLIST_HEAD(symlist, symbol_node) symlist_t;
75280304Sjkim
76280304Sjkimstruct reg_info {
77280304Sjkim	u_int	  address;
78280304Sjkim	int	  size;
7955714Skris	amode_t	  mode;
80280304Sjkim	symlist_t fields;
81280304Sjkim	uint8_t	  valid_bitmask;
82280304Sjkim	uint8_t	  modes;
83280304Sjkim	int	  typecheck_masks;
84280304Sjkim};
85280304Sjkim
86280304Sjkimstruct field_info {
87280304Sjkim	symlist_t symrefs;
88280304Sjkim	uint8_t	  value;
89280304Sjkim	uint8_t	  mask;
90280304Sjkim};
91280304Sjkim
92280304Sjkimstruct const_info {
93280304Sjkim	u_int	value;
94280304Sjkim	int	define;
95280304Sjkim};
96280304Sjkim
97280304Sjkimstruct alias_info {
98280304Sjkim	struct symbol *parent;
99280304Sjkim};
100280304Sjkim
101280304Sjkimstruct label_info {
102280304Sjkim	int	address;
103280304Sjkim	int	exported;
104280304Sjkim};
105280304Sjkim
106280304Sjkimstruct cond_info {
107280304Sjkim	int	func_num;
108280304Sjkim};
109280304Sjkim
110280304Sjkimstruct macro_arg {
111	STAILQ_ENTRY(macro_arg)	links;
112	regex_t	arg_regex;
113	char   *replacement_text;
114};
115STAILQ_HEAD(macro_arg_list, macro_arg) args;
116
117struct macro_info {
118	struct macro_arg_list args;
119	int   narg;
120	const char* body;
121};
122
123typedef struct expression_info {
124        symlist_t       referenced_syms;
125        int             value;
126} expression_t;
127
128typedef struct symbol {
129	char	*name;
130	symtype	type;
131	union	{
132		struct reg_info	  *rinfo;
133		struct field_info *finfo;
134		struct const_info *cinfo;
135		struct alias_info *ainfo;
136		struct label_info *linfo;
137		struct cond_info  *condinfo;
138		struct macro_info *macroinfo;
139	}info;
140} symbol_t;
141
142typedef struct symbol_ref {
143	symbol_t *symbol;
144	int	 offset;
145} symbol_ref_t;
146
147typedef struct symbol_node {
148	SLIST_ENTRY(symbol_node) links;
149	symbol_t *symbol;
150} symbol_node_t;
151
152typedef struct critical_section {
153	TAILQ_ENTRY(critical_section) links;
154	int begin_addr;
155	int end_addr;
156} critical_section_t;
157
158typedef enum {
159	SCOPE_ROOT,
160	SCOPE_IF,
161	SCOPE_ELSE_IF,
162	SCOPE_ELSE
163} scope_type;
164
165typedef struct patch_info {
166	int skip_patch;
167	int skip_instr;
168} patch_info_t;
169
170typedef struct scope {
171	SLIST_ENTRY(scope) scope_stack_links;
172	TAILQ_ENTRY(scope) scope_links;
173	TAILQ_HEAD(, scope) inner_scope;
174	scope_type type;
175	int inner_scope_patches;
176	int begin_addr;
177        int end_addr;
178	patch_info_t patches[2];
179	int func_num;
180} scope_t;
181
182TAILQ_HEAD(cs_tailq, critical_section);
183SLIST_HEAD(scope_list, scope);
184TAILQ_HEAD(scope_tailq, scope);
185
186void	symbol_delete(symbol_t *symbol);
187
188void	symtable_open(void);
189
190void	symtable_close(void);
191
192symbol_t *
193	symtable_get(char *name);
194
195symbol_node_t *
196	symlist_search(symlist_t *symlist, char *symname);
197
198void
199	symlist_add(symlist_t *symlist, symbol_t *symbol, int how);
200#define SYMLIST_INSERT_HEAD	0x00
201#define SYMLIST_SORT		0x01
202
203void	symlist_free(symlist_t *symlist);
204
205void	symlist_merge(symlist_t *symlist_dest, symlist_t *symlist_src1,
206		      symlist_t *symlist_src2);
207void	symtable_dump(FILE *ofile, FILE *dfile);
208