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