aicasm_symbol.h revision 68578
1/*
2 * Aic7xxx SCSI host adapter firmware asssembler symbol table definitions
3 *
4 * Copyright (c) 1997 Justin T. Gibbs.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions, and the following disclaimer,
12 *    without modification.
13 * 2. The name of the author may not be used to endorse or promote products
14 *    derived from this software without specific prior written permission.
15 *
16 * Alternatively, this software may be distributed under the terms of the
17 * GNU Public License ("GPL").
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * $Id: //depot/src/aic7xxx/aicasm/aicasm_symbol.h#4 $
32 *
33 * $FreeBSD: head/sys/dev/aic7xxx/aicasm/aicasm_symbol.h 68578 2000-11-10 19:54:17Z gibbs $
34 */
35
36#ifdef __linux__
37#include "../queue.h"
38#else
39#include <sys/queue.h>
40#endif
41
42typedef enum {
43	UNINITIALIZED,
44	REGISTER,
45	ALIAS,
46	SCBLOC,
47	SRAMLOC,
48	MASK,
49	BIT,
50	CONST,
51	DOWNLOAD_CONST,
52	LABEL,
53	CONDITIONAL
54}symtype;
55
56typedef enum {
57	RO = 0x01,
58	WO = 0x02,
59	RW = 0x03
60}amode_t;
61
62struct reg_info {
63	u_int8_t address;
64	int	 size;
65	amode_t	 mode;
66	u_int8_t valid_bitmask;
67	int	 typecheck_masks;
68};
69
70typedef SLIST_HEAD(symlist, symbol_node) symlist_t;
71
72struct mask_info {
73	symlist_t symrefs;
74	u_int8_t mask;
75};
76
77struct const_info {
78	u_int8_t value;
79	int	 define;
80};
81
82struct alias_info {
83	struct symbol *parent;
84};
85
86struct label_info {
87	int	address;
88};
89
90struct cond_info {
91	int	func_num;
92};
93
94typedef struct expression_info {
95        symlist_t       referenced_syms;
96        int             value;
97} expression_t;
98
99typedef struct symbol {
100	char	*name;
101	symtype	type;
102	union	{
103		struct reg_info *rinfo;
104		struct mask_info *minfo;
105		struct const_info *cinfo;
106		struct alias_info *ainfo;
107		struct label_info *linfo;
108		struct cond_info *condinfo;
109	}info;
110} symbol_t;
111
112typedef struct symbol_ref {
113	symbol_t *symbol;
114	int	 offset;
115} symbol_ref_t;
116
117typedef struct symbol_node {
118	SLIST_ENTRY(symbol_node) links;
119	symbol_t *symbol;
120} symbol_node_t;
121
122typedef struct critical_section {
123	TAILQ_ENTRY(critical_section) links;
124	int begin_addr;
125	int end_addr;
126} critical_section_t;
127
128typedef enum {
129	SCOPE_ROOT,
130	SCOPE_IF,
131	SCOPE_ELSE_IF,
132	SCOPE_ELSE
133} scope_type;
134
135typedef struct patch_info {
136	int skip_patch;
137	int skip_instr;
138} patch_info_t;
139
140typedef struct scope {
141	SLIST_ENTRY(scope) scope_stack_links;
142	TAILQ_ENTRY(scope) scope_links;
143	TAILQ_HEAD(, scope) inner_scope;
144	scope_type type;
145	int inner_scope_patches;
146	int begin_addr;
147        int end_addr;
148	patch_info_t patches[2];
149	int func_num;
150} scope_t;
151
152TAILQ_HEAD(cs_tailq, critical_section);
153SLIST_HEAD(scope_list, scope);
154TAILQ_HEAD(scope_tailq, scope);
155
156void	symbol_delete __P((symbol_t *symbol));
157
158void	symtable_open __P((void));
159
160void	symtable_close __P((void));
161
162symbol_t *
163	symtable_get __P((char *name));
164
165symbol_node_t *
166	symlist_search __P((symlist_t *symlist, char *symname));
167
168void
169	symlist_add __P((symlist_t *symlist, symbol_t *symbol, int how));
170#define SYMLIST_INSERT_HEAD	0x00
171#define SYMLIST_SORT		0x01
172
173void	symlist_free __P((symlist_t *symlist));
174
175void	symlist_merge __P((symlist_t *symlist_dest, symlist_t *symlist_src1,
176			   symlist_t *symlist_src2));
177void	symtable_dump __P((FILE *ofile));
178