11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 270f23fd66bc821a0e99647f70a809e277cc93c4cJustin P. Mattock * Aic7xxx SCSI host adapter firmware assembler symbol table implementation 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 1997 Justin T. Gibbs. 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2002 Adaptec Inc. 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved. 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met: 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice, this list of conditions, and the following disclaimer, 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification. 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * substantially similar to the "NO WARRANTY" disclaimer below 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ("Disclaimer") and any redistribution must be conditioned upon 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including a substantially similar Disclaimer requirement for further 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * binary redistribution. 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of any contributors may be used to endorse or promote products derived 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from this software without specific prior written permission. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation. 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES. 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.c#24 $ 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * $FreeBSD$ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <sys/types.h> 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __linux__ 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "aicdb.h" 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <db.h> 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <fcntl.h> 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <inttypes.h> 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <regex.h> 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdio.h> 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdlib.h> 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <string.h> 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <sysexits.h> 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "aicasm_symbol.h" 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "aicasm.h" 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DB *symtable; 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymbol_t * 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymbol_create(char *name) 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_t *new_symbol; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds new_symbol = (symbol_t *)malloc(sizeof(symbol_t)); 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (new_symbol == NULL) { 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds perror("Unable to create new symbol"); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_SOFTWARE); 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memset(new_symbol, 0, sizeof(*new_symbol)); 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds new_symbol->name = strdup(name); 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (new_symbol->name == NULL) 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds stop("Unable to strdup symbol name", EX_SOFTWARE); 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds new_symbol->type = UNINITIALIZED; 803dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke new_symbol->count = 1; 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (new_symbol); 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymbol_delete(symbol_t *symbol) 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symtable != NULL) { 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DBT key; 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds key.data = symbol->name; 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds key.size = strlen(symbol->name); 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symtable->del(symtable, &key, /*flags*/0); 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(symbol->type) { 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SCBLOC: 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SRAMLOC: 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case REGISTER: 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symbol->info.rinfo != NULL) 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(symbol->info.rinfo); 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ALIAS: 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symbol->info.ainfo != NULL) 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(symbol->info.ainfo); 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case MASK: 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case FIELD: 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ENUM: 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ENUM_ENTRY: 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symbol->info.finfo != NULL) { 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_free(&symbol->info.finfo->symrefs); 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(symbol->info.finfo); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case DOWNLOAD_CONST: 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case CONST: 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symbol->info.cinfo != NULL) 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(symbol->info.cinfo); 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case LABEL: 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symbol->info.linfo != NULL) 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(symbol->info.linfo); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UNINITIALIZED: 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(symbol->name); 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(symbol); 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymtable_open() 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symtable = dbopen(/*filename*/NULL, 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds O_CREAT | O_NONBLOCK | O_RDWR, /*mode*/0, DB_HASH, 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /*openinfo*/NULL); 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symtable == NULL) { 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds perror("Symbol table creation failed"); 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_SOFTWARE); 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* NOTREACHED */ 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymtable_close() 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symtable != NULL) { 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DBT key; 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DBT data; 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (symtable->seq(symtable, &key, &data, R_FIRST) == 0) { 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_t *stored_ptr; 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memcpy(&stored_ptr, data.data, sizeof(stored_ptr)); 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_delete(stored_ptr); 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symtable->close(symtable); 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The semantics of get is to return an uninitialized symbol entry 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * if a lookup fails. 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymbol_t * 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymtable_get(char *name) 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_t *stored_ptr; 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DBT key; 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DBT data; 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int retval; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds key.data = (void *)name; 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds key.size = strlen(name); 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((retval = symtable->get(symtable, &key, &data, /*flags*/0)) != 0) { 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (retval == -1) { 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds perror("Symbol table get operation failed"); 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_SOFTWARE); 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* NOTREACHED */ 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (retval == 1) { 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Symbol wasn't found, so create a new one */ 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_t *new_symbol; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds new_symbol = symbol_create(name); 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data.data = &new_symbol; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data.size = sizeof(new_symbol); 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symtable->put(symtable, &key, &data, 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /*flags*/0) !=0) { 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds perror("Symtable put failed"); 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_SOFTWARE); 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (new_symbol); 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds perror("Unexpected return value from db get routine"); 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_SOFTWARE); 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* NOTREACHED */ 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memcpy(&stored_ptr, data.data, sizeof(stored_ptr)); 2023dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke stored_ptr->count++; 2033dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke data.data = &stored_ptr; 2043dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke if (symtable->put(symtable, &key, &data, /*flags*/0) !=0) { 2053dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke perror("Symtable put failed"); 2063dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke exit(EX_SOFTWARE); 2073dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke } 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (stored_ptr); 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymbol_node_t * 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymlist_search(symlist_t *symlist, char *symname) 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *curnode; 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_FIRST(symlist); 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while(curnode != NULL) { 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(symname, curnode->symbol->name) == 0) 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_NEXT(curnode, links); 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (curnode); 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymlist_add(symlist_t *symlist, symbol_t *symbol, int how) 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *newnode; 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds newnode = (symbol_node_t *)malloc(sizeof(symbol_node_t)); 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (newnode == NULL) { 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds stop("symlist_add: Unable to malloc symbol_node", EX_SOFTWARE); 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* NOTREACHED */ 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds newnode->symbol = symbol; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (how == SYMLIST_SORT) { 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *curnode; 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int field; 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds field = FALSE; 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(symbol->type) { 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case REGISTER: 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SCBLOC: 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SRAMLOC: 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case FIELD: 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case MASK: 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ENUM: 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ENUM_ENTRY: 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds field = TRUE; 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds stop("symlist_add: Invalid symbol type for sorting", 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EX_SOFTWARE); 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* NOTREACHED */ 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_FIRST(symlist); 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (curnode == NULL 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds || (field 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds && (curnode->symbol->type > newnode->symbol->type 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds || (curnode->symbol->type == newnode->symbol->type 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds && (curnode->symbol->info.finfo->value > 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds newnode->symbol->info.finfo->value)))) 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds || (!field && (curnode->symbol->info.rinfo->address > 2663dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke newnode->symbol->info.rinfo->address))) { 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INSERT_HEAD(symlist, newnode, links); 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (1) { 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (SLIST_NEXT(curnode, links) == NULL) { 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INSERT_AFTER(curnode, newnode, 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds links); 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_t *cursymbol; 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cursymbol = SLIST_NEXT(curnode, links)->symbol; 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((field 2813dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke && (cursymbol->type > symbol->type 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds || (cursymbol->type == symbol->type 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds && (cursymbol->info.finfo->value > 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol->info.finfo->value)))) 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds || (!field 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds && (cursymbol->info.rinfo->address > 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol->info.rinfo->address))) { 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INSERT_AFTER(curnode, newnode, 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds links); 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_NEXT(curnode, links); 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INSERT_HEAD(symlist, newnode, links); 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymlist_free(symlist_t *symlist) 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *node1, *node2; 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds node1 = SLIST_FIRST(symlist); 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (node1 != NULL) { 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds node2 = SLIST_NEXT(node1, links); 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(node1); 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds node1 = node2; 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(symlist); 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymlist_merge(symlist_t *symlist_dest, symlist_t *symlist_src1, 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_t *symlist_src2) 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *node; 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *symlist_dest = *symlist_src1; 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while((node = SLIST_FIRST(symlist_src2)) != NULL) { 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_REMOVE_HEAD(symlist_src2, links); 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INSERT_HEAD(symlist_dest, node, links); 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* These are now empty */ 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(symlist_src1); 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(symlist_src2); 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaic_print_file_prologue(FILE *ofile) 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (ofile == NULL) 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"/*\n" 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" * DO NOT EDIT - This file is automatically generated\n" 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" * from the following source files:\n" 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" *\n" 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"%s */\n", 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds versions); 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaic_print_include(FILE *dfile, char *include_file) 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dfile == NULL) 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(dfile, "\n#include \"%s\"\n\n", include_file); 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaic_print_reg_dump_types(FILE *ofile) 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (ofile == NULL) 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 3613dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"typedef int (%sreg_print_t)(u_int, u_int *, u_int);\n" 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"typedef struct %sreg_parse_entry {\n" 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" char *name;\n" 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" uint8_t value;\n" 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" uint8_t mask;\n" 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"} %sreg_parse_entry_t;\n" 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"\n", 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefix, prefix, prefix); 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaic_print_reg_dump_start(FILE *dfile, symbol_node_t *regnode) 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dfile == NULL) 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(dfile, 3803dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke"static const %sreg_parse_entry_t %s_parse_table[] = {\n", 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefix, 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regnode->symbol->name); 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaic_print_reg_dump_end(FILE *ofile, FILE *dfile, 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *regnode, u_int num_entries) 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *lower_name; 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *letter; 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds lower_name = strdup(regnode->symbol->name); 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (lower_name == NULL) 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds stop("Unable to strdup symbol name", EX_SOFTWARE); 3953dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (letter = lower_name; *letter != '\0'; letter++) 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *letter = tolower(*letter); 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dfile != NULL) { 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (num_entries != 0) 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(dfile, 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"\n" 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"};\n" 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"\n"); 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(dfile, 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"int\n" 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"%s%s_print(u_int regvalue, u_int *cur_col, u_int wrap)\n" 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"{\n" 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" return (%sprint_register(%s%s, %d, \"%s\",\n" 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" 0x%02x, regvalue, cur_col, wrap));\n" 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"}\n" 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"\n", 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefix, 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds lower_name, 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefix, 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_entries != 0 ? regnode->symbol->name : "NULL", 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_entries != 0 ? "_parse_table" : "", 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_entries, 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regnode->symbol->name, 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regnode->symbol->info.rinfo->address); 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"#if AIC_DEBUG_REGISTERS\n" 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"%sreg_print_t %s%s_print;\n" 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"#else\n" 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"#define %s%s_print(regvalue, cur_col, wrap) \\\n" 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" %sprint_register(NULL, 0, \"%s\", 0x%02x, regvalue, cur_col, wrap)\n" 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"#endif\n" 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"\n", 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefix, 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefix, 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds lower_name, 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefix, 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds lower_name, 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefix, 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regnode->symbol->name, 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regnode->symbol->info.rinfo->address); 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaic_print_reg_dump_entry(FILE *dfile, symbol_node_t *curnode) 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int num_tabs; 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dfile == NULL) 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(dfile, 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds" { \"%s\",", 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->name); 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_tabs = 3 - (strlen(curnode->symbol->name) + 5) / 8; 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (num_tabs-- > 0) 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputc('\t', dfile); 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(dfile, "0x%02x, 0x%02x }", 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->info.finfo->value, 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->info.finfo->mask); 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssymtable_dump(FILE *ofile, FILE *dfile) 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Sort the registers by address with a simple insertion sort. 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Put bitmasks next to the first register that defines them. 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Put constants at the end. 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_t registers; 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_t masks; 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_t constants; 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_t download_constants; 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_t aliases; 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_t exported_labels; 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *curnode; 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *regnode; 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DBT key; 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DBT data; 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int flag; 4823dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke int reg_count = 0, reg_used = 0; 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int i; 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (symtable == NULL) 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(®isters); 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(&masks); 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(&constants); 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(&download_constants); 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(&aliases); 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INIT(&exported_labels); 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds flag = R_FIRST; 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (symtable->seq(symtable, &key, &data, flag) == 0) { 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_t *cursym; 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memcpy(&cursym, data.data, sizeof(cursym)); 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(cursym->type) { 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case REGISTER: 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SCBLOC: 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SRAMLOC: 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_add(®isters, cursym, SYMLIST_SORT); 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case MASK: 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case FIELD: 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ENUM: 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ENUM_ENTRY: 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_add(&masks, cursym, SYMLIST_SORT); 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case CONST: 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_add(&constants, cursym, 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SYMLIST_INSERT_HEAD); 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case DOWNLOAD_CONST: 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_add(&download_constants, cursym, 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SYMLIST_INSERT_HEAD); 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ALIAS: 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_add(&aliases, cursym, 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SYMLIST_INSERT_HEAD); 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case LABEL: 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cursym->info.linfo->exported == 0) 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_add(&exported_labels, cursym, 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SYMLIST_INSERT_HEAD); 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds flag = R_NEXT; 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Register dianostic functions/declarations first. */ 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aic_print_file_prologue(ofile); 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aic_print_reg_dump_types(ofile); 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aic_print_file_prologue(dfile); 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aic_print_include(dfile, stock_include_file); 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_FOREACH(curnode, ®isters, links) { 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 542fa25b99a503f68594a1787e6f31159a5aec77928Denys Vlasenko if (curnode->symbol->dont_generate_debug_code) 543fa25b99a503f68594a1787e6f31159a5aec77928Denys Vlasenko continue; 544fa25b99a503f68594a1787e6f31159a5aec77928Denys Vlasenko 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(curnode->symbol->type) { 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case REGISTER: 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SCBLOC: 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SRAMLOC: 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symlist_t *fields; 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *fieldnode; 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int num_entries; 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_entries = 0; 5553dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke reg_count++; 5563dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke if (curnode->symbol->count == 1) 5573dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke break; 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fields = &curnode->symbol->info.rinfo->fields; 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_FOREACH(fieldnode, fields, links) { 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (num_entries == 0) 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aic_print_reg_dump_start(dfile, 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode); 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (dfile != NULL) 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs(",\n", dfile); 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_entries++; 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aic_print_reg_dump_entry(dfile, fieldnode); 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aic_print_reg_dump_end(ofile, dfile, 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode, num_entries); 5703dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke reg_used++; 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5763dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke fprintf(stderr, "%s: %d of %d register definitions used\n", appname, 5773dbd10f3d8b00dad35d3fac95e91c066ae71d9a8Hannes Reinecke reg_used, reg_count); 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Fold in the masks and bits */ 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (SLIST_FIRST(&masks) != NULL) { 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *regname; 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_FIRST(&masks); 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_REMOVE_HEAD(&masks, links); 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regnode = SLIST_FIRST(&curnode->symbol->info.finfo->symrefs); 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regname = regnode->symbol->name; 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regnode = symlist_search(®isters, regname); 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INSERT_AFTER(regnode, curnode, links); 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Add the aliases */ 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (SLIST_FIRST(&aliases) != NULL) { 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *regname; 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_FIRST(&aliases); 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_REMOVE_HEAD(&aliases, links); 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regname = curnode->symbol->info.ainfo->parent->name; 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds regnode = symlist_search(®isters, regname); 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_INSERT_AFTER(regnode, curnode, links); 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Output generated #defines. */ 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (SLIST_FIRST(®isters) != NULL) { 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *curnode; 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int value; 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *tab_str; 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *tab_str2; 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_FIRST(®isters); 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_REMOVE_HEAD(®isters, links); 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(curnode->symbol->type) { 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case REGISTER: 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SCBLOC: 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SRAMLOC: 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "\n"); 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds value = curnode->symbol->info.rinfo->address; 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str = "\t"; 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str2 = "\t\t"; 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ALIAS: 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_t *parent; 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds parent = curnode->symbol->info.ainfo->parent; 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds value = parent->info.rinfo->address; 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str = "\t"; 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str2 = "\t\t"; 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case MASK: 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case FIELD: 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ENUM: 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ENUM_ENTRY: 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds value = curnode->symbol->info.finfo->value; 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str = "\t\t"; 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str2 = "\t"; 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds value = 0; /* Quiet compiler */ 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str = NULL; 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str2 = NULL; 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds stop("symtable_dump: Invalid symbol type " 6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "encountered", EX_SOFTWARE); 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "#define%s%-16s%s0x%02x\n", 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tab_str, curnode->symbol->name, tab_str2, 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds value); 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(curnode); 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "\n\n"); 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (SLIST_FIRST(&constants) != NULL) { 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *curnode; 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_FIRST(&constants); 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_REMOVE_HEAD(&constants, links); 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "#define\t%-8s\t0x%02x\n", 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->name, 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->info.cinfo->value); 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(curnode); 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "\n\n/* Downloaded Constant Definitions */\n"); 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; SLIST_FIRST(&download_constants) != NULL; i++) { 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *curnode; 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_FIRST(&download_constants); 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_REMOVE_HEAD(&download_constants, links); 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "#define\t%-8s\t0x%02x\n", 6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->name, 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->info.cinfo->value); 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(curnode); 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "#define\tDOWNLOAD_CONST_COUNT\t0x%02x\n", i); 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "\n\n/* Exported Labels */\n"); 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (SLIST_FIRST(&exported_labels) != NULL) { 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds symbol_node_t *curnode; 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode = SLIST_FIRST(&exported_labels); 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLIST_REMOVE_HEAD(&exported_labels, links); 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(ofile, "#define\tLABEL_%-8s\t0x%02x\n", 6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->name, 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds curnode->symbol->info.linfo->address); 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free(curnode); 6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 694