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(&registers);
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(&registers, 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, &registers, 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(&registers, 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(&registers, regname);
6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		SLIST_INSERT_AFTER(regnode, curnode, links);
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Output generated #defines. */
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (SLIST_FIRST(&registers) != 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(&registers);
6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		SLIST_REMOVE_HEAD(&registers, 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