1098ca2bdSWarner Losh /*- 2c5cb3888SJustin T. Gibbs * Aic7xxx SCSI host adapter firmware asssembler symbol table definitions 3c5cb3888SJustin T. Gibbs * 4718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 5718cf2ccSPedro F. Giffuni * 6c5cb3888SJustin T. Gibbs * Copyright (c) 1997 Justin T. Gibbs. 763183d8cSJustin T. Gibbs * Copyright (c) 2002 Adaptec Inc. 8c5cb3888SJustin T. Gibbs * All rights reserved. 9c5cb3888SJustin T. Gibbs * 10c5cb3888SJustin T. Gibbs * Redistribution and use in source and binary forms, with or without 11c5cb3888SJustin T. Gibbs * modification, are permitted provided that the following conditions 12c5cb3888SJustin T. Gibbs * are met: 13c5cb3888SJustin T. Gibbs * 1. Redistributions of source code must retain the above copyright 14f68f348bSJustin T. Gibbs * notice, this list of conditions, and the following disclaimer, 1541c47eeeSJustin T. Gibbs * without modification. 167ce72dbaSJustin T. Gibbs * 2. Redistributions in binary form must reproduce at minimum a disclaimer 177ce72dbaSJustin T. Gibbs * substantially similar to the "NO WARRANTY" disclaimer below 187ce72dbaSJustin T. Gibbs * ("Disclaimer") and any redistribution must be conditioned upon 197ce72dbaSJustin T. Gibbs * including a substantially similar Disclaimer requirement for further 207ce72dbaSJustin T. Gibbs * binary redistribution. 217ce72dbaSJustin T. Gibbs * 3. Neither the names of the above-listed copyright holders nor the names 227ce72dbaSJustin T. Gibbs * of any contributors may be used to endorse or promote products derived 237ce72dbaSJustin T. Gibbs * from this software without specific prior written permission. 24c5cb3888SJustin T. Gibbs * 25aa6dfd9dSJustin T. Gibbs * Alternatively, this software may be distributed under the terms of the 267ce72dbaSJustin T. Gibbs * GNU General Public License ("GPL") version 2 as published by the Free 277ce72dbaSJustin T. Gibbs * Software Foundation. 28aa6dfd9dSJustin T. Gibbs * 297ce72dbaSJustin T. Gibbs * NO WARRANTY 307ce72dbaSJustin T. Gibbs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 317ce72dbaSJustin T. Gibbs * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 327ce72dbaSJustin T. Gibbs * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 337ce72dbaSJustin T. Gibbs * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 347ce72dbaSJustin T. Gibbs * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 35c5cb3888SJustin T. Gibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 36c5cb3888SJustin T. Gibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 377ce72dbaSJustin T. Gibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 387ce72dbaSJustin T. Gibbs * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 397ce72dbaSJustin T. Gibbs * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 407ce72dbaSJustin T. Gibbs * POSSIBILITY OF SUCH DAMAGES. 41c5cb3888SJustin T. Gibbs * 4263183d8cSJustin T. Gibbs * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.h#17 $ 43c5cb3888SJustin T. Gibbs */ 44c5cb3888SJustin T. Gibbs 45c5cb3888SJustin T. Gibbs #include <sys/queue.h> 46c5cb3888SJustin T. Gibbs 47c5cb3888SJustin T. Gibbs typedef enum { 48c5cb3888SJustin T. Gibbs UNINITIALIZED, 49c5cb3888SJustin T. Gibbs REGISTER, 50c5cb3888SJustin T. Gibbs ALIAS, 51c5cb3888SJustin T. Gibbs SCBLOC, 52c5cb3888SJustin T. Gibbs SRAMLOC, 5363183d8cSJustin T. Gibbs ENUM_ENTRY, 5463183d8cSJustin T. Gibbs FIELD, 55c5cb3888SJustin T. Gibbs MASK, 5663183d8cSJustin T. Gibbs ENUM, 57c5cb3888SJustin T. Gibbs CONST, 5837507c1bSJustin T. Gibbs DOWNLOAD_CONST, 59c5cb3888SJustin T. Gibbs LABEL, 607ce72dbaSJustin T. Gibbs CONDITIONAL, 617ce72dbaSJustin T. Gibbs MACRO 62c5cb3888SJustin T. Gibbs } symtype; 63c5cb3888SJustin T. Gibbs 64c5cb3888SJustin T. Gibbs typedef enum { 65c5cb3888SJustin T. Gibbs RO = 0x01, 66c5cb3888SJustin T. Gibbs WO = 0x02, 67c5cb3888SJustin T. Gibbs RW = 0x03 68c5cb3888SJustin T. Gibbs }amode_t; 69c5cb3888SJustin T. Gibbs 7063183d8cSJustin T. Gibbs typedef SLIST_HEAD(symlist, symbol_node) symlist_t; 7163183d8cSJustin T. Gibbs 72c5cb3888SJustin T. Gibbs struct reg_info { 737ce72dbaSJustin T. Gibbs u_int address; 74c5cb3888SJustin T. Gibbs int size; 75c5cb3888SJustin T. Gibbs amode_t mode; 7663183d8cSJustin T. Gibbs symlist_t fields; 7763183d8cSJustin T. Gibbs uint8_t valid_bitmask; 7863183d8cSJustin T. Gibbs uint8_t modes; 79c5cb3888SJustin T. Gibbs int typecheck_masks; 80c5cb3888SJustin T. Gibbs }; 81c5cb3888SJustin T. Gibbs 8263183d8cSJustin T. Gibbs struct field_info { 83c5cb3888SJustin T. Gibbs symlist_t symrefs; 8463183d8cSJustin T. Gibbs uint8_t value; 8563183d8cSJustin T. Gibbs uint8_t mask; 86c5cb3888SJustin T. Gibbs }; 87c5cb3888SJustin T. Gibbs 88c5cb3888SJustin T. Gibbs struct const_info { 897ce72dbaSJustin T. Gibbs u_int value; 90c5cb3888SJustin T. Gibbs int define; 91c5cb3888SJustin T. Gibbs }; 92c5cb3888SJustin T. Gibbs 93c5cb3888SJustin T. Gibbs struct alias_info { 94c5cb3888SJustin T. Gibbs struct symbol *parent; 95c5cb3888SJustin T. Gibbs }; 96c5cb3888SJustin T. Gibbs 97c5cb3888SJustin T. Gibbs struct label_info { 98c5cb3888SJustin T. Gibbs int address; 997ce72dbaSJustin T. Gibbs int exported; 100c5cb3888SJustin T. Gibbs }; 101c5cb3888SJustin T. Gibbs 102c5cb3888SJustin T. Gibbs struct cond_info { 1033bafc9d4SJustin T. Gibbs int func_num; 104c5cb3888SJustin T. Gibbs }; 105c5cb3888SJustin T. Gibbs 1067ce72dbaSJustin T. Gibbs struct macro_arg { 1077ce72dbaSJustin T. Gibbs STAILQ_ENTRY(macro_arg) links; 1087ce72dbaSJustin T. Gibbs regex_t arg_regex; 1097ce72dbaSJustin T. Gibbs char *replacement_text; 1107ce72dbaSJustin T. Gibbs }; 111*5e912f5fSJessica Clarke STAILQ_HEAD(macro_arg_list, macro_arg); 1127ce72dbaSJustin T. Gibbs 1137ce72dbaSJustin T. Gibbs struct macro_info { 1147ce72dbaSJustin T. Gibbs struct macro_arg_list args; 1157ce72dbaSJustin T. Gibbs int narg; 1167ce72dbaSJustin T. Gibbs const char* body; 1177ce72dbaSJustin T. Gibbs }; 1187ce72dbaSJustin T. Gibbs 119c5cb3888SJustin T. Gibbs typedef struct expression_info { 120c5cb3888SJustin T. Gibbs symlist_t referenced_syms; 121c5cb3888SJustin T. Gibbs int value; 122c5cb3888SJustin T. Gibbs } expression_t; 123c5cb3888SJustin T. Gibbs 124c5cb3888SJustin T. Gibbs typedef struct symbol { 125c5cb3888SJustin T. Gibbs char *name; 126c5cb3888SJustin T. Gibbs symtype type; 127c5cb3888SJustin T. Gibbs union { 128c5cb3888SJustin T. Gibbs struct reg_info *rinfo; 12963183d8cSJustin T. Gibbs struct field_info *finfo; 130c5cb3888SJustin T. Gibbs struct const_info *cinfo; 131c5cb3888SJustin T. Gibbs struct alias_info *ainfo; 132c5cb3888SJustin T. Gibbs struct label_info *linfo; 133c5cb3888SJustin T. Gibbs struct cond_info *condinfo; 1347ce72dbaSJustin T. Gibbs struct macro_info *macroinfo; 135c5cb3888SJustin T. Gibbs }info; 136c5cb3888SJustin T. Gibbs } symbol_t; 137c5cb3888SJustin T. Gibbs 138c5cb3888SJustin T. Gibbs typedef struct symbol_ref { 139c5cb3888SJustin T. Gibbs symbol_t *symbol; 140c5cb3888SJustin T. Gibbs int offset; 141c5cb3888SJustin T. Gibbs } symbol_ref_t; 142c5cb3888SJustin T. Gibbs 143c5cb3888SJustin T. Gibbs typedef struct symbol_node { 144e3975643SJake Burkholder SLIST_ENTRY(symbol_node) links; 145c5cb3888SJustin T. Gibbs symbol_t *symbol; 146c5cb3888SJustin T. Gibbs } symbol_node_t; 147c5cb3888SJustin T. Gibbs 148083d01f2SJustin T. Gibbs typedef struct critical_section { 149083d01f2SJustin T. Gibbs TAILQ_ENTRY(critical_section) links; 150083d01f2SJustin T. Gibbs int begin_addr; 151083d01f2SJustin T. Gibbs int end_addr; 152083d01f2SJustin T. Gibbs } critical_section_t; 153083d01f2SJustin T. Gibbs 1543bafc9d4SJustin T. Gibbs typedef enum { 1553bafc9d4SJustin T. Gibbs SCOPE_ROOT, 1563bafc9d4SJustin T. Gibbs SCOPE_IF, 1573bafc9d4SJustin T. Gibbs SCOPE_ELSE_IF, 1583bafc9d4SJustin T. Gibbs SCOPE_ELSE 1593bafc9d4SJustin T. Gibbs } scope_type; 1603bafc9d4SJustin T. Gibbs 1613bafc9d4SJustin T. Gibbs typedef struct patch_info { 1623bafc9d4SJustin T. Gibbs int skip_patch; 1633bafc9d4SJustin T. Gibbs int skip_instr; 1643bafc9d4SJustin T. Gibbs } patch_info_t; 1653bafc9d4SJustin T. Gibbs 1663bafc9d4SJustin T. Gibbs typedef struct scope { 167e3975643SJake Burkholder SLIST_ENTRY(scope) scope_stack_links; 168e3975643SJake Burkholder TAILQ_ENTRY(scope) scope_links; 169e3975643SJake Burkholder TAILQ_HEAD(, scope) inner_scope; 1703bafc9d4SJustin T. Gibbs scope_type type; 1713bafc9d4SJustin T. Gibbs int inner_scope_patches; 1723bafc9d4SJustin T. Gibbs int begin_addr; 1733bafc9d4SJustin T. Gibbs int end_addr; 1743bafc9d4SJustin T. Gibbs patch_info_t patches[2]; 1753bafc9d4SJustin T. Gibbs int func_num; 1763bafc9d4SJustin T. Gibbs } scope_t; 1773bafc9d4SJustin T. Gibbs 178083d01f2SJustin T. Gibbs TAILQ_HEAD(cs_tailq, critical_section); 179e3975643SJake Burkholder SLIST_HEAD(scope_list, scope); 180e3975643SJake Burkholder TAILQ_HEAD(scope_tailq, scope); 181c5cb3888SJustin T. Gibbs 18263183d8cSJustin T. Gibbs void symbol_delete(symbol_t *symbol); 183c5cb3888SJustin T. Gibbs 18463183d8cSJustin T. Gibbs void symtable_open(void); 185c5cb3888SJustin T. Gibbs 18663183d8cSJustin T. Gibbs void symtable_close(void); 187c5cb3888SJustin T. Gibbs 188c5cb3888SJustin T. Gibbs symbol_t * 189b18a2ef1SXin LI symtable_get(const char *name); 190c5cb3888SJustin T. Gibbs 191c5cb3888SJustin T. Gibbs symbol_node_t * 19263183d8cSJustin T. Gibbs symlist_search(symlist_t *symlist, char *symname); 193c5cb3888SJustin T. Gibbs 194c5cb3888SJustin T. Gibbs void 19563183d8cSJustin T. Gibbs symlist_add(symlist_t *symlist, symbol_t *symbol, int how); 196c5cb3888SJustin T. Gibbs #define SYMLIST_INSERT_HEAD 0x00 197c5cb3888SJustin T. Gibbs #define SYMLIST_SORT 0x01 198c5cb3888SJustin T. Gibbs 19963183d8cSJustin T. Gibbs void symlist_free(symlist_t *symlist); 200c5cb3888SJustin T. Gibbs 20163183d8cSJustin T. Gibbs void symlist_merge(symlist_t *symlist_dest, symlist_t *symlist_src1, 20263183d8cSJustin T. Gibbs symlist_t *symlist_src2); 20363183d8cSJustin T. Gibbs void symtable_dump(FILE *ofile, FILE *dfile); 204