aicasm_symbol.h revision 23925
123925Sgibbs/*
223925Sgibbs * Aic7xxx SCSI host adapter firmware asssembler symbol table definitions
323925Sgibbs *
423925Sgibbs * Copyright (c) 1997 Justin T. Gibbs.
523925Sgibbs * All rights reserved.
623925Sgibbs *
723925Sgibbs * Redistribution and use in source and binary forms, with or without
823925Sgibbs * modification, are permitted provided that the following conditions
923925Sgibbs * are met:
1023925Sgibbs * 1. Redistributions of source code must retain the above copyright
1123925Sgibbs *    notice immediately at the beginning of the file, without modification,
1223925Sgibbs *    this list of conditions, and the following disclaimer.
1323925Sgibbs * 2. Redistributions in binary form must reproduce the above copyright
1423925Sgibbs *    notice, this list of conditions and the following disclaimer in the
1523925Sgibbs *    documentation and/or other materials provided with the distribution.
1623925Sgibbs * 3. The name of the author may not be used to endorse or promote products
1723925Sgibbs *    derived from this software without specific prior written permission.
1823925Sgibbs *
1923925Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2023925Sgibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2123925Sgibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2223925Sgibbs * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2323925Sgibbs * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2423925Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2523925Sgibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2623925Sgibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2723925Sgibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2823925Sgibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2923925Sgibbs * SUCH DAMAGE.
3023925Sgibbs *
3123925Sgibbs *      $Id$
3223925Sgibbs */
3323925Sgibbs
3423925Sgibbs#include <sys/queue.h>
3523925Sgibbs
3623925Sgibbstypedef enum {
3723925Sgibbs	UNINITIALIZED,
3823925Sgibbs	REGISTER,
3923925Sgibbs	ALIAS,
4023925Sgibbs	SCBLOC,
4123925Sgibbs	SRAMLOC,
4223925Sgibbs	MASK,
4323925Sgibbs	BIT,
4423925Sgibbs	CONST,
4523925Sgibbs	LABEL,
4623925Sgibbs	CONDITIONAL
4723925Sgibbs}symtype;
4823925Sgibbs
4923925Sgibbstypedef enum {
5023925Sgibbs	RO = 0x01,
5123925Sgibbs	WO = 0x02,
5223925Sgibbs	RW = 0x03
5323925Sgibbs}amode_t;
5423925Sgibbs
5523925Sgibbsstruct reg_info {
5623925Sgibbs	u_int8_t address;
5723925Sgibbs	int	 size;
5823925Sgibbs	amode_t	 mode;
5923925Sgibbs	u_int8_t valid_bitmask;
6023925Sgibbs	int	 typecheck_masks;
6123925Sgibbs};
6223925Sgibbs
6323925Sgibbstypedef SLIST_HEAD(symlist, symbol_node) symlist_t;
6423925Sgibbs
6523925Sgibbsstruct mask_info {
6623925Sgibbs	symlist_t symrefs;
6723925Sgibbs	u_int8_t mask;
6823925Sgibbs};
6923925Sgibbs
7023925Sgibbsstruct const_info {
7123925Sgibbs	u_int8_t value;
7223925Sgibbs	int	 define;
7323925Sgibbs};
7423925Sgibbs
7523925Sgibbsstruct alias_info {
7623925Sgibbs	struct symbol *parent;
7723925Sgibbs};
7823925Sgibbs
7923925Sgibbsstruct label_info {
8023925Sgibbs	int	address;
8123925Sgibbs};
8223925Sgibbs
8323925Sgibbsstruct cond_info {
8423925Sgibbs	int	value;
8523925Sgibbs};
8623925Sgibbs
8723925Sgibbstypedef struct expression_info {
8823925Sgibbs        symlist_t       referenced_syms;
8923925Sgibbs        int             value;
9023925Sgibbs} expression_t;
9123925Sgibbs
9223925Sgibbstypedef struct symbol {
9323925Sgibbs	char	*name;
9423925Sgibbs	symtype	type;
9523925Sgibbs	union	{
9623925Sgibbs		struct reg_info *rinfo;
9723925Sgibbs		struct mask_info *minfo;
9823925Sgibbs		struct const_info *cinfo;
9923925Sgibbs		struct alias_info *ainfo;
10023925Sgibbs		struct label_info *linfo;
10123925Sgibbs		struct cond_info *condinfo;
10223925Sgibbs	}info;
10323925Sgibbs} symbol_t;
10423925Sgibbs
10523925Sgibbstypedef struct symbol_ref {
10623925Sgibbs	symbol_t *symbol;
10723925Sgibbs	int	 offset;
10823925Sgibbs} symbol_ref_t;
10923925Sgibbs
11023925Sgibbstypedef struct symbol_node {
11123925Sgibbs	SLIST_ENTRY(symbol_node) links;
11223925Sgibbs	symbol_t *symbol;
11323925Sgibbs}symbol_node_t;
11423925Sgibbs
11523925Sgibbstypedef struct patch {
11623925Sgibbs        STAILQ_ENTRY(patch) links;
11723925Sgibbs	int	  negative;
11823925Sgibbs	int	  begin;
11923925Sgibbs        int	  end;
12023925Sgibbs	int	  options;
12123925Sgibbs} patch_t;
12223925Sgibbs
12323925Sgibbsvoid	symbol_delete __P((symbol_t *symbol));
12423925Sgibbs
12523925Sgibbsvoid	symtable_open __P((void));
12623925Sgibbs
12723925Sgibbsvoid	symtable_close __P((void));
12823925Sgibbs
12923925Sgibbssymbol_t *
13023925Sgibbs	symtable_get __P((char *name));
13123925Sgibbs
13223925Sgibbssymbol_node_t *
13323925Sgibbs	symlist_search __P((symlist_t *symlist, char *symname));
13423925Sgibbs
13523925Sgibbsvoid
13623925Sgibbs	symlist_add __P((symlist_t *symlist, symbol_t *symbol, int how));
13723925Sgibbs#define SYMLIST_INSERT_HEAD	0x00
13823925Sgibbs#define SYMLIST_SORT		0x01
13923925Sgibbs
14023925Sgibbsvoid	symlist_free __P((symlist_t *symlist));
14123925Sgibbs
14223925Sgibbsvoid	symlist_merge __P((symlist_t *symlist_dest, symlist_t *symlist_src1,
14323925Sgibbs			   symlist_t *symlist_src2));
14423925Sgibbsvoid	symtable_dump __P((FILE *ofile));
145