206 lines · c
1/*2 * Aic7xxx SCSI host adapter firmware assembler symbol table definitions3 *4 * Copyright (c) 1997 Justin T. Gibbs.5 * Copyright (c) 2002 Adaptec Inc.6 * All rights reserved.7 *8 * Redistribution and use in source and binary forms, with or without9 * modification, are permitted provided that the following conditions10 * are met:11 * 1. Redistributions of source code must retain the above copyright12 * notice, this list of conditions, and the following disclaimer,13 * without modification.14 * 2. Redistributions in binary form must reproduce at minimum a disclaimer15 * substantially similar to the "NO WARRANTY" disclaimer below16 * ("Disclaimer") and any redistribution must be conditioned upon17 * including a substantially similar Disclaimer requirement for further18 * binary redistribution.19 * 3. Neither the names of the above-listed copyright holders nor the names20 * of any contributors may be used to endorse or promote products derived21 * from this software without specific prior written permission.22 *23 * Alternatively, this software may be distributed under the terms of the24 * GNU General Public License ("GPL") version 2 as published by the Free25 * Software Foundation.26 *27 * NO WARRANTY28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT32 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE38 * POSSIBILITY OF SUCH DAMAGES.39 *40 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.h#17 $41 *42 * $FreeBSD$43 */44 45#include "../queue.h"46 47typedef enum {48 UNINITIALIZED,49 REGISTER,50 ALIAS,51 SCBLOC,52 SRAMLOC,53 ENUM_ENTRY,54 FIELD,55 MASK,56 ENUM,57 CONST,58 DOWNLOAD_CONST,59 LABEL,60 CONDITIONAL,61 MACRO62} symtype;63 64typedef enum {65 RO = 0x01,66 WO = 0x02,67 RW = 0x0368}amode_t;69 70typedef SLIST_HEAD(symlist, symbol_node) symlist_t;71 72struct reg_info {73 u_int address;74 int size;75 amode_t mode;76 symlist_t fields;77 uint8_t valid_bitmask;78 uint8_t modes;79 int typecheck_masks;80};81 82struct field_info {83 symlist_t symrefs;84 uint8_t value;85 uint8_t mask;86};87 88struct const_info {89 u_int value;90 int define;91};92 93struct alias_info {94 struct symbol *parent;95};96 97struct label_info {98 int address;99 int exported;100};101 102struct cond_info {103 int func_num;104};105 106struct macro_arg {107 STAILQ_ENTRY(macro_arg) links;108 regex_t arg_regex;109 char *replacement_text;110};111STAILQ_HEAD(macro_arg_list, macro_arg);112 113struct macro_info {114 struct macro_arg_list args;115 int narg;116 const char* body;117};118 119typedef struct expression_info {120 symlist_t referenced_syms;121 int value;122} expression_t;123 124typedef struct symbol {125 char *name;126 symtype type;127 int count;128 union {129 struct reg_info *rinfo;130 struct field_info *finfo;131 struct const_info *cinfo;132 struct alias_info *ainfo;133 struct label_info *linfo;134 struct cond_info *condinfo;135 struct macro_info *macroinfo;136 } info;137 int dont_generate_debug_code;138} symbol_t;139 140typedef struct symbol_ref {141 symbol_t *symbol;142 int offset;143} symbol_ref_t;144 145typedef struct symbol_node {146 SLIST_ENTRY(symbol_node) links;147 symbol_t *symbol;148} symbol_node_t;149 150typedef struct critical_section {151 TAILQ_ENTRY(critical_section) links;152 int begin_addr;153 int end_addr;154} critical_section_t;155 156typedef enum {157 SCOPE_ROOT,158 SCOPE_IF,159 SCOPE_ELSE_IF,160 SCOPE_ELSE161} scope_type;162 163typedef struct patch_info {164 int skip_patch;165 int skip_instr;166} patch_info_t;167 168typedef struct scope {169 SLIST_ENTRY(scope) scope_stack_links;170 TAILQ_ENTRY(scope) scope_links;171 TAILQ_HEAD(, scope) inner_scope;172 scope_type type;173 int inner_scope_patches;174 int begin_addr;175 int end_addr;176 patch_info_t patches[2];177 int func_num;178} scope_t;179 180TAILQ_HEAD(cs_tailq, critical_section);181SLIST_HEAD(scope_list, scope);182TAILQ_HEAD(scope_tailq, scope);183 184void symbol_delete(symbol_t *symbol);185 186void symtable_open(void);187 188void symtable_close(void);189 190symbol_t *191 symtable_get(char *name);192 193symbol_node_t *194 symlist_search(symlist_t *symlist, char *symname);195 196void197 symlist_add(symlist_t *symlist, symbol_t *symbol, int how);198#define SYMLIST_INSERT_HEAD 0x00199#define SYMLIST_SORT 0x01200 201void symlist_free(symlist_t *symlist);202 203void symlist_merge(symlist_t *symlist_dest, symlist_t *symlist_src1,204 symlist_t *symlist_src2);205void symtable_dump(FILE *ofile, FILE *dfile);206