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