1139749Simp/*-
223925Sgibbs * Aic7xxx SCSI host adapter firmware asssembler symbol table definitions
323925Sgibbs *
423925Sgibbs * Copyright (c) 1997 Justin T. Gibbs.
5102668Sgibbs * Copyright (c) 2002 Adaptec Inc.
623925Sgibbs * All rights reserved.
723925Sgibbs *
823925Sgibbs * Redistribution and use in source and binary forms, with or without
923925Sgibbs * modification, are permitted provided that the following conditions
1023925Sgibbs * are met:
1123925Sgibbs * 1. Redistributions of source code must retain the above copyright
1226997Sgibbs *    notice, this list of conditions, and the following disclaimer,
1354211Sgibbs *    without modification.
1495376Sgibbs * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1595376Sgibbs *    substantially similar to the "NO WARRANTY" disclaimer below
1695376Sgibbs *    ("Disclaimer") and any redistribution must be conditioned upon
1795376Sgibbs *    including a substantially similar Disclaimer requirement for further
1895376Sgibbs *    binary redistribution.
1995376Sgibbs * 3. Neither the names of the above-listed copyright holders nor the names
2095376Sgibbs *    of any contributors may be used to endorse or promote products derived
2195376Sgibbs *    from this software without specific prior written permission.
2223925Sgibbs *
2363457Sgibbs * Alternatively, this software may be distributed under the terms of the
2495376Sgibbs * GNU General Public License ("GPL") version 2 as published by the Free
2595376Sgibbs * Software Foundation.
2663457Sgibbs *
2795376Sgibbs * NO WARRANTY
2895376Sgibbs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2995376Sgibbs * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3095376Sgibbs * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3195376Sgibbs * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3295376Sgibbs * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3323925Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3423925Sgibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3595376Sgibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3695376Sgibbs * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
3795376Sgibbs * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3895376Sgibbs * POSSIBILITY OF SUCH DAMAGES.
3923925Sgibbs *
40102668Sgibbs * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.h#17 $
4165943Sgibbs *
4250477Speter * $FreeBSD$
4323925Sgibbs */
4423925Sgibbs
4523925Sgibbs#include <sys/queue.h>
4623925Sgibbs
4723925Sgibbstypedef enum {
4823925Sgibbs	UNINITIALIZED,
4923925Sgibbs	REGISTER,
5023925Sgibbs	ALIAS,
5123925Sgibbs	SCBLOC,
5223925Sgibbs	SRAMLOC,
53102668Sgibbs	ENUM_ENTRY,
54102668Sgibbs	FIELD,
5523925Sgibbs	MASK,
56102668Sgibbs	ENUM,
5723925Sgibbs	CONST,
5829897Sgibbs	DOWNLOAD_CONST,
5923925Sgibbs	LABEL,
6095376Sgibbs	CONDITIONAL,
6195376Sgibbs	MACRO
6295376Sgibbs} symtype;
6323925Sgibbs
6423925Sgibbstypedef enum {
6523925Sgibbs	RO = 0x01,
6623925Sgibbs	WO = 0x02,
6723925Sgibbs	RW = 0x03
6823925Sgibbs}amode_t;
6923925Sgibbs
70102668Sgibbstypedef SLIST_HEAD(symlist, symbol_node) symlist_t;
71102668Sgibbs
7223925Sgibbsstruct reg_info {
73102668Sgibbs	u_int	  address;
74102668Sgibbs	int	  size;
75102668Sgibbs	amode_t	  mode;
76102668Sgibbs	symlist_t fields;
77102668Sgibbs	uint8_t	  valid_bitmask;
78102668Sgibbs	uint8_t	  modes;
79102668Sgibbs	int	  typecheck_masks;
8023925Sgibbs};
8123925Sgibbs
82102668Sgibbsstruct field_info {
8323925Sgibbs	symlist_t symrefs;
84102668Sgibbs	uint8_t	  value;
85102668Sgibbs	uint8_t	  mask;
8623925Sgibbs};
8723925Sgibbs
8823925Sgibbsstruct const_info {
8995376Sgibbs	u_int	value;
9095376Sgibbs	int	define;
9123925Sgibbs};
9223925Sgibbs
9323925Sgibbsstruct alias_info {
9423925Sgibbs	struct symbol *parent;
9523925Sgibbs};
9623925Sgibbs
9723925Sgibbsstruct label_info {
9823925Sgibbs	int	address;
9995376Sgibbs	int	exported;
10023925Sgibbs};
10123925Sgibbs
10223925Sgibbsstruct cond_info {
10339220Sgibbs	int	func_num;
10423925Sgibbs};
10523925Sgibbs
10695376Sgibbsstruct macro_arg {
10795376Sgibbs	STAILQ_ENTRY(macro_arg)	links;
10895376Sgibbs	regex_t	arg_regex;
10995376Sgibbs	char   *replacement_text;
11095376Sgibbs};
11195376SgibbsSTAILQ_HEAD(macro_arg_list, macro_arg) args;
11295376Sgibbs
11395376Sgibbsstruct macro_info {
11495376Sgibbs	struct macro_arg_list args;
11595376Sgibbs	int   narg;
11695376Sgibbs	const char* body;
11795376Sgibbs};
11895376Sgibbs
11923925Sgibbstypedef struct expression_info {
12023925Sgibbs        symlist_t       referenced_syms;
12123925Sgibbs        int             value;
12223925Sgibbs} expression_t;
12323925Sgibbs
12423925Sgibbstypedef struct symbol {
12523925Sgibbs	char	*name;
12623925Sgibbs	symtype	type;
12723925Sgibbs	union	{
12895376Sgibbs		struct reg_info	  *rinfo;
129102668Sgibbs		struct field_info *finfo;
13023925Sgibbs		struct const_info *cinfo;
13123925Sgibbs		struct alias_info *ainfo;
13223925Sgibbs		struct label_info *linfo;
13395376Sgibbs		struct cond_info  *condinfo;
13495376Sgibbs		struct macro_info *macroinfo;
13523925Sgibbs	}info;
13623925Sgibbs} symbol_t;
13723925Sgibbs
13823925Sgibbstypedef struct symbol_ref {
13923925Sgibbs	symbol_t *symbol;
14023925Sgibbs	int	 offset;
14123925Sgibbs} symbol_ref_t;
14223925Sgibbs
14323925Sgibbstypedef struct symbol_node {
14460938Sjake	SLIST_ENTRY(symbol_node) links;
14523925Sgibbs	symbol_t *symbol;
14666270Sgibbs} symbol_node_t;
14723925Sgibbs
14866270Sgibbstypedef struct critical_section {
14966270Sgibbs	TAILQ_ENTRY(critical_section) links;
15066270Sgibbs	int begin_addr;
15166270Sgibbs	int end_addr;
15266270Sgibbs} critical_section_t;
15366270Sgibbs
15439220Sgibbstypedef enum {
15539220Sgibbs	SCOPE_ROOT,
15639220Sgibbs	SCOPE_IF,
15739220Sgibbs	SCOPE_ELSE_IF,
15839220Sgibbs	SCOPE_ELSE
15939220Sgibbs} scope_type;
16023925Sgibbs
16139220Sgibbstypedef struct patch_info {
16239220Sgibbs	int skip_patch;
16339220Sgibbs	int skip_instr;
16439220Sgibbs} patch_info_t;
16539220Sgibbs
16639220Sgibbstypedef struct scope {
16760938Sjake	SLIST_ENTRY(scope) scope_stack_links;
16860938Sjake	TAILQ_ENTRY(scope) scope_links;
16960938Sjake	TAILQ_HEAD(, scope) inner_scope;
17039220Sgibbs	scope_type type;
17139220Sgibbs	int inner_scope_patches;
17239220Sgibbs	int begin_addr;
17339220Sgibbs        int end_addr;
17439220Sgibbs	patch_info_t patches[2];
17539220Sgibbs	int func_num;
17639220Sgibbs} scope_t;
17739220Sgibbs
17866270SgibbsTAILQ_HEAD(cs_tailq, critical_section);
17960938SjakeSLIST_HEAD(scope_list, scope);
18060938SjakeTAILQ_HEAD(scope_tailq, scope);
18139220Sgibbs
182102668Sgibbsvoid	symbol_delete(symbol_t *symbol);
18323925Sgibbs
184102668Sgibbsvoid	symtable_open(void);
18523925Sgibbs
186102668Sgibbsvoid	symtable_close(void);
18723925Sgibbs
18823925Sgibbssymbol_t *
189193244Sdelphij	symtable_get(const char *name);
19023925Sgibbs
19123925Sgibbssymbol_node_t *
192102668Sgibbs	symlist_search(symlist_t *symlist, char *symname);
19323925Sgibbs
19423925Sgibbsvoid
195102668Sgibbs	symlist_add(symlist_t *symlist, symbol_t *symbol, int how);
19623925Sgibbs#define SYMLIST_INSERT_HEAD	0x00
19723925Sgibbs#define SYMLIST_SORT		0x01
19823925Sgibbs
199102668Sgibbsvoid	symlist_free(symlist_t *symlist);
20023925Sgibbs
201102668Sgibbsvoid	symlist_merge(symlist_t *symlist_dest, symlist_t *symlist_src1,
202102668Sgibbs		      symlist_t *symlist_src2);
203102668Sgibbsvoid	symtable_dump(FILE *ofile, FILE *dfile);
204