Annotation of XNU/osfmk/i386/db_gcc_aout.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * COPYRIGHT NOTICE
        !            24:  * 
        !            25:  * Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc. 
        !            26:  * 
        !            27:  * Permission is hereby granted to use, copy, modify and freely distribute
        !            28:  * the software in this file and its documentation for any purpose without
        !            29:  * fee, provided that the above copyright notice appears in all copies and
        !            30:  * that both the copyright notice and this permission notice appear in
        !            31:  * supporting documentation.  Further, provided that the name of Open
        !            32:  * Software Foundation, Inc. ("OSF") not be used in advertising or
        !            33:  * publicity pertaining to distribution of the software without prior
        !            34:  * written permission from OSF.  OSF makes no representations about the
        !            35:  * suitability of this software for any purpose.  It is provided "as is"
        !            36:  * without express or implied warranty.
        !            37:  */
        !            38: /*
        !            39:  * HISTORY
        !            40:  * 
        !            41:  * Revision 1.1.1.1  1998/09/22 21:05:36  wsanchez
        !            42:  * Import of Mac OS X kernel (~semeria)
        !            43:  *
        !            44:  * Revision 1.1.1.1  1998/03/07 02:25:37  wsanchez
        !            45:  * Import of OSF Mach kernel (~mburg)
        !            46:  *
        !            47:  * Revision 1.2.2.3  1994/01/28  17:23:00  chasb
        !            48:  *     Expand Copyrights
        !            49:  *     [1994/01/27  19:40:16  chasb]
        !            50:  *
        !            51:  * Revision 1.2.2.2  1993/06/09  02:27:36  gm
        !            52:  *     Added to OSF/1 R1.3 from NMK15.0.
        !            53:  *     [1993/06/02  21:04:03  jeffc]
        !            54:  * 
        !            55:  * Revision 1.2  1993/04/19  16:13:10  devrcs
        !            56:  *     pick up file_io.h from bootstrap directory
        !            57:  *     [1993/02/27  15:01:09  david]
        !            58:  * 
        !            59:  *     Added new arguments and a missing one to db_add_symbol_table
        !            60:  *     [[email protected]]
        !            61:  *     [92/12/03            bernadat]
        !            62:  * 
        !            63:  *     Added gcc symbol table handling based on db_aout.c (Revsion 2.4)
        !            64:  *     [91/07/31            tak]
        !            65:  * 
        !            66:  * Revision 1.1  1992/09/30  02:02:23  robert
        !            67:  *     Initial revision
        !            68:  * 
        !            69:  * $EndLog$
        !            70:  */
        !            71: /* CMU_HIST */
        !            72: /*
        !            73:  * Revision 2.1  91/07/31  13:13:51  jeffreyh
        !            74:  * Created.
        !            75:  * 
        !            76:  * 31-Jul-91  Jeffrey Heller (tak) at Open Software Foundation
        !            77:  *     Added gcc symbol table handling based on db_aout.c (Revsion 2.4)
        !            78:  *
        !            79:  */
        !            80: /* CMU_ENDHIST */
        !            81: /* 
        !            82:  * Mach Operating System
        !            83:  * Copyright (c) 1991,1990 Carnegie Mellon University
        !            84:  * All Rights Reserved.
        !            85:  * 
        !            86:  * Permission to use, copy, modify and distribute this software and its
        !            87:  * documentation is hereby granted, provided that both the copyright
        !            88:  * notice and this permission notice appear in all copies of the
        !            89:  * software, derivative works or modified versions, and any portions
        !            90:  * thereof, and that both notices appear in supporting documentation.
        !            91:  * 
        !            92:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            93:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            94:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            95:  * 
        !            96:  * Carnegie Mellon requests users of this software to return to
        !            97:  * 
        !            98:  *  Software Distribution Coordinator  or  [email protected]
        !            99:  *  School of Computer Science
        !           100:  *  Carnegie Mellon University
        !           101:  *  Pittsburgh PA 15213-3890
        !           102:  * 
        !           103:  * any improvements or extensions that they make and grant Carnegie Mellon
        !           104:  * the rights to redistribute these changes.
        !           105:  */
        !           106: /*
        !           107:  */
        !           108: /*
        !           109:  * Symbol table routines for a.out format files.
        !           110:  */
        !           111: 
        !           112: #include <mach/boolean.h>
        !           113: #include <machine/db_machdep.h>                /* data types */
        !           114: #include <ddb/db_sym.h>
        !           115: 
        !           116: #ifdef DB_GCC_AOUT
        !           117: 
        !           118: #include <ddb/nlist.h>                 /* a.out symbol table */
        !           119: #include <i386/stab.h>
        !           120: 
        !           121: /*
        !           122:  * An a.out symbol table as loaded into the kernel debugger:
        !           123:  *
        !           124:  * symtab      -> size of symbol entries, in bytes
        !           125:  * sp          -> first symbol entry
        !           126:  *                ...
        !           127:  * ep          -> last symbol entry + 1
        !           128:  * strtab      == start of string table
        !           129:  *                size of string table in bytes,
        !           130:  *                including this word
        !           131:  *             -> strings
        !           132:  */
        !           133: 
        !           134: /*
        !           135:  * Find pointers to the start and end of the symbol entries,
        !           136:  * given a pointer to the start of the symbol table.
        !           137:  */
        !           138: #define        db_get_aout_symtab(symtab, sp, ep) \
        !           139:        (sp = (struct nlist *)((symtab) + 1), \
        !           140:         ep = (struct nlist *)((char *)sp + *(symtab)))
        !           141: 
        !           142: X_db_sym_init(symtab, esymtab, name)
        !           143:        int *   symtab;         /* pointer to start of symbol table */
        !           144:        char *  esymtab;        /* pointer to end of string table,
        !           145:                                   for checking - rounded up to integer
        !           146:                                   boundary */
        !           147:        char *  name;
        !           148: {
        !           149:        register struct nlist   *sym_start, *sym_end;
        !           150:        register struct nlist   *sp;
        !           151:        register char * strtab;
        !           152:        register int    strlen;
        !           153: 
        !           154:        db_get_aout_symtab(symtab, sym_start, sym_end);
        !           155: 
        !           156:        strtab = (char *)sym_end;
        !           157:        strlen = *(int *)strtab;
        !           158: 
        !           159:        if (strtab + ((strlen + sizeof(int) - 1) & ~(sizeof(int)-1))
        !           160:            != esymtab)
        !           161:        {
        !           162:            db_printf("[ %s symbol table not valid ]\n", name);
        !           163:            return;
        !           164:        }
        !           165: 
        !           166:        db_printf("[ preserving %#x bytes of %s symbol table ]\n",
        !           167:                esymtab - (char *)symtab, name);
        !           168: 
        !           169:        for (sp = sym_start; sp < sym_end; sp++) {
        !           170:            register int strx;
        !           171:            strx = sp->n_un.n_strx;
        !           172:            if (strx != 0) {
        !           173:                if (strx > strlen) {
        !           174:                    db_printf("Bad string table index (%#x)\n", strx);
        !           175:                    sp->n_un.n_name = 0;
        !           176:                    continue;
        !           177:                }
        !           178:                sp->n_un.n_name = strtab + strx;
        !           179:            }
        !           180:        }
        !           181: 
        !           182:        db_add_symbol_table(sym_start, sym_end, name, (char *)symtab,
        !           183:                            0, 0, 0, FALSE);
        !           184: }
        !           185: 
        !           186: /*
        !           187:  * check file name or not (check xxxx.x pattern)
        !           188:  */
        !           189: boolean_t
        !           190: X_db_is_filename(name)
        !           191:        register char *name;
        !           192: {
        !           193:        while (*name) {
        !           194:            if (*name == '.') {
        !           195:                if (name[1])
        !           196:                    return(TRUE);
        !           197:            }
        !           198:            name++;
        !           199:        }
        !           200:        return(FALSE);
        !           201: }
        !           202: 
        !           203: /*
        !           204:  * special name comparison routine with a name in the symbol table entry
        !           205:  */
        !           206: boolean_t
        !           207: X_db_eq_name(sp, name)
        !           208:        struct nlist *sp;
        !           209:        char *name;
        !           210: {
        !           211:        register char *s1, *s2;
        !           212: 
        !           213:        s1 = sp->n_un.n_name;
        !           214:        s2 = name;
        !           215:        if (*s1 == '_' && *s2 && *s2 != '_')
        !           216:            s1++;
        !           217:        while (*s2) {
        !           218:            if (*s1++ != *s2++) {
        !           219:                /*
        !           220:                 * check .c .o file name comparison case
        !           221:                 */
        !           222:                if (*s2 == 0 && sp->n_un.n_name <= s1 - 2 
        !           223:                        && s1[-2] == '.' && s1[-1] == 'o')
        !           224:                    return(TRUE);
        !           225:                return(FALSE);
        !           226:            }
        !           227:        }
        !           228:        /*
        !           229:         * do special check for
        !           230:         *     xxx:yyy for N_FUN
        !           231:         *     xxx.ttt for N_DATA and N_BSS
        !           232:         */
        !           233:        return(*s1 == 0 || (*s1 == ':' && sp->n_type == N_FUN) || 
        !           234:                (*s1 == '.' && (sp->n_type == N_DATA || sp->n_type == N_BSS)));
        !           235: }
        !           236: 
        !           237: /*
        !           238:  * search a symbol table with name and type
        !           239:  *     fp(in,out): last found text file name symbol entry
        !           240:  */
        !           241: struct nlist *
        !           242: X_db_search_name(sp, ep, name, type, fp)
        !           243:        register struct nlist *sp;
        !           244:        struct nlist    *ep;
        !           245:        char            *name;
        !           246:        int             type;
        !           247:        struct nlist    **fp;
        !           248: {
        !           249:        struct nlist    *file_sp = *fp;
        !           250:        struct nlist    *found_sp = 0;
        !           251: 
        !           252:        for ( ; sp < ep; sp++) {
        !           253:            if (sp->n_type == N_TEXT && X_db_is_filename(sp->n_un.n_name))
        !           254:                *fp = sp;
        !           255:            if (type) {
        !           256:                if (sp->n_type == type) {
        !           257:                    if (X_db_eq_name(sp, name))
        !           258:                        return(sp);
        !           259:                }
        !           260:                if (sp->n_type == N_SO)
        !           261:                    *fp = sp;
        !           262:                continue;
        !           263:            }
        !           264:            if (sp->n_type & N_STAB)
        !           265:                continue;
        !           266:            if (sp->n_un.n_name && X_db_eq_name(sp, name)) {
        !           267:                /*
        !           268:                 * In case of qaulified search by a file,
        !           269:                 * return it immediately with some check.
        !           270:                 * Otherwise, search external one
        !           271:                 */
        !           272:                if (file_sp) {
        !           273:                    if ((file_sp == *fp) || (sp->n_type & N_EXT))
        !           274:                        return(sp);
        !           275:                } else if (sp->n_type & N_EXT)
        !           276:                    return(sp);
        !           277:                else
        !           278:                    found_sp = sp;
        !           279:            }
        !           280:        }
        !           281:        return(found_sp);
        !           282: }
        !           283: 
        !           284: /*
        !           285:  * search a symbol with file, func and line qualification
        !           286:  */
        !           287: struct nlist *
        !           288: X_db_qualified_search(stab, file, sym, line)
        !           289:        db_symtab_t     *stab;
        !           290:        char            *file;
        !           291:        char            *sym;
        !           292:        int             line;
        !           293: {
        !           294:        register struct nlist *sp = (struct nlist *)stab->start;
        !           295:        struct nlist    *ep = (struct nlist *)stab->end;
        !           296:        struct nlist    *fp = 0;
        !           297:        struct nlist    *found_sp;
        !           298:        unsigned        func_top;
        !           299:        boolean_t       in_file;
        !           300: 
        !           301:        if (file == 0 && sym == 0)
        !           302:            return(0);
        !           303:        if (file) {
        !           304:            if ((sp = X_db_search_name(sp, ep, file, N_TEXT, &fp)) == 0)
        !           305:                return(0);
        !           306:        }
        !           307:        if (sym) {
        !           308:            sp = X_db_search_name(sp, ep, sym, (line > 0)? N_FUN: 0, &fp);
        !           309:            if (sp == 0)
        !           310:                return(0);
        !           311:        }
        !           312:        if (line > 0) {
        !           313:            if (file && !X_db_eq_name(fp, file))
        !           314:                return(0);
        !           315:            found_sp = 0;
        !           316:            if (sp->n_type == N_FUN) {
        !           317:                /*
        !           318:                 * qualfied by function name
        !           319:                 *     search backward because line number entries
        !           320:                 *     for the function are above it in this case.
        !           321:                 */
        !           322:                func_top = sp->n_value;
        !           323:                for (sp--; sp >= (struct nlist *)stab->start; sp--) {
        !           324:                    if (sp->n_type != N_SLINE)
        !           325:                        continue;
        !           326:                    if (sp->n_value < func_top)
        !           327:                        break;
        !           328:                    if (sp->n_desc <= line) {
        !           329:                        if (found_sp == 0 || found_sp->n_desc < sp->n_desc)
        !           330:                            found_sp = sp;
        !           331:                        if (sp->n_desc == line)
        !           332:                            break;
        !           333:                    }
        !           334:                }
        !           335:                if (sp->n_type != N_SLINE || sp->n_value < func_top)
        !           336:                    return(0);
        !           337:            } else {
        !           338:                /*
        !           339:                 * qualified by only file name
        !           340:                 *    search forward in this case
        !           341:                 */
        !           342:                in_file = TRUE;
        !           343:                for (sp++; sp < ep; sp++) {
        !           344:                    if (sp->n_type == N_TEXT 
        !           345:                        && X_db_is_filename(sp->n_un.n_name))
        !           346:                        break;          /* enter into another file */
        !           347:                    if (sp->n_type == N_SOL) {
        !           348:                        in_file = X_db_eq_name(sp, file);
        !           349:                        continue;
        !           350:                    }
        !           351:                    if (!in_file || sp->n_type != N_SLINE)
        !           352:                        continue;
        !           353:                    if (sp->n_desc <= line) {
        !           354:                        if (found_sp == 0 || found_sp->n_desc < sp->n_desc)
        !           355:                            found_sp = sp;
        !           356:                        if (sp->n_desc == line)
        !           357:                            break;
        !           358:                    }
        !           359:                }
        !           360:            }
        !           361:            sp = found_sp;
        !           362:        }
        !           363:        return(sp);
        !           364: }
        !           365: 
        !           366: /*
        !           367:  * lookup symbol by name
        !           368:  */
        !           369: db_sym_t
        !           370: X_db_lookup(stab, symstr)
        !           371:        db_symtab_t     *stab;
        !           372:        char *          symstr;
        !           373: {
        !           374:        register        char *p;
        !           375:        register        n;
        !           376:        int             n_name;
        !           377:        int             line_number;
        !           378:        char            *file_name = 0;
        !           379:        char            *sym_name = 0;
        !           380:        char            *component[3];
        !           381:        struct nlist    *found = 0;
        !           382: 
        !           383:        /*
        !           384:         * disassemble component:   [file_name:]symbol[:line_nubmer]
        !           385:         */
        !           386:        component[0] = symstr;
        !           387:        component[1] = component[2] = 0;
        !           388:        for (p = symstr, n = 1; *p; p++) {
        !           389:            if (*p == ':') {
        !           390:                if (n >= 3)
        !           391:                        break;
        !           392:                *p = 0;
        !           393:                component[n++] = p+1;
        !           394:            }
        !           395:        }
        !           396:        if (*p != 0)
        !           397:            goto out;
        !           398:        line_number = 0;
        !           399:        n_name = n;
        !           400:        p = component[n-1];
        !           401:        if (*p >= '0' && *p <= '9') {
        !           402:            if (n == 1)
        !           403:                goto out;
        !           404:            for (line_number = 0; *p; p++) {
        !           405:                if (*p < '0' || *p > '9')
        !           406:                    goto out;
        !           407:                line_number = line_number*10 + *p - '0';
        !           408:            }
        !           409:            n_name--;
        !           410:        } else if (n >= 3)
        !           411:            goto out;
        !           412:        if (n_name == 1) {
        !           413:            if (X_db_is_filename(component[0])) {
        !           414:                file_name = component[0];
        !           415:                sym_name = 0;
        !           416:            } else {
        !           417:                file_name = 0;
        !           418:                sym_name = component[0];
        !           419:            }
        !           420:        } else {
        !           421:            file_name = component[0];
        !           422:            sym_name = component[1];
        !           423:        }
        !           424:        found = X_db_qualified_search(stab, file_name, sym_name, line_number);
        !           425:        
        !           426: out:
        !           427:        while (--n > 1)
        !           428:            component[n][-1] = ':';
        !           429:        return((db_sym_t) found);
        !           430: }
        !           431: 
        !           432: db_sym_t
        !           433: X_db_search_symbol(symtab, off, strategy, diffp)
        !           434:        db_symtab_t *   symtab;
        !           435:        register
        !           436:        db_addr_t       off;
        !           437:        db_strategy_t   strategy;
        !           438:        db_expr_t       *diffp;         /* in/out */
        !           439: {
        !           440:        register unsigned int   diff = *diffp;
        !           441:        register struct nlist   *symp = 0;
        !           442:        register struct nlist   *sp, *ep;
        !           443: 
        !           444:        sp = (struct nlist *)symtab->start;
        !           445:        ep = (struct nlist *)symtab->end;
        !           446: 
        !           447:        for (; sp < ep; sp++) {
        !           448:            if (sp->n_un.n_name == 0)
        !           449:                continue;
        !           450:            if ((sp->n_type & N_STAB) != 0)
        !           451:                continue;
        !           452:            if (off >= sp->n_value) {
        !           453:                if (off - sp->n_value < diff) {
        !           454:                    diff = off - sp->n_value;
        !           455:                    symp = sp;
        !           456:                    if (diff == 0 && (sp->n_type & N_EXT))
        !           457:                        break;
        !           458:                }
        !           459:                else if (off - sp->n_value == diff) {
        !           460:                    if (symp == 0)
        !           461:                        symp = sp;
        !           462:                    else if ((symp->n_type & N_EXT) == 0 &&
        !           463:                                (sp->n_type & N_EXT) != 0)
        !           464:                        symp = sp;      /* pick the external symbol */
        !           465:                }
        !           466:            }
        !           467:        }
        !           468:        if (symp == 0) {
        !           469:            *diffp = off;
        !           470:        }
        !           471:        else {
        !           472:            *diffp = diff;
        !           473:        }
        !           474:        return ((db_sym_t)symp);
        !           475: }
        !           476: 
        !           477: /*
        !           478:  * Return the name and value for a symbol.
        !           479:  */
        !           480: void
        !           481: X_db_symbol_values(sym, namep, valuep)
        !           482:        db_sym_t        sym;
        !           483:        char            **namep;
        !           484:        db_expr_t       *valuep;
        !           485: {
        !           486:        register struct nlist *sp;
        !           487: 
        !           488:        sp = (struct nlist *)sym;
        !           489:        if (namep)
        !           490:            *namep = sp->n_un.n_name;
        !           491:        if (valuep)
        !           492:            *valuep = sp->n_value;
        !           493: }
        !           494: 
        !           495: #define X_DB_MAX_DIFF  8       /* maximum allowable diff at the end of line */
        !           496: 
        !           497: /*
        !           498:  * search symbol by value
        !           499:  */
        !           500: X_db_search_by_addr(stab, addr, file, func, line, diff)
        !           501:        db_symtab_t     *stab;
        !           502:        register        unsigned addr;
        !           503:        char            **file;
        !           504:        char            **func;
        !           505:        int             *line;
        !           506:        unsigned        *diff;
        !           507: {
        !           508:        register        struct nlist *sp;
        !           509:        register        struct nlist *line_sp, *func_sp, *file_sp, *line_func;
        !           510:        register        func_diff, line_diff;
        !           511:        boolean_t       found_line = FALSE;
        !           512:        struct          nlist *ep = (struct nlist *)stab->end;
        !           513: 
        !           514:        line_sp = func_sp = file_sp = line_func = 0;
        !           515:        *file = *func = 0;
        !           516:        *line = 0;
        !           517:        for (sp = (struct nlist *)stab->start; sp < ep; sp++) {
        !           518:            switch(sp->n_type) {
        !           519:            case N_SLINE:
        !           520:                if (sp->n_value <= addr) {
        !           521:                    if (line_sp == 0 || line_diff >= addr - sp->n_value) {
        !           522:                        if (line_func)
        !           523:                            line_func = 0;
        !           524:                        line_sp = sp;
        !           525:                        line_diff = addr - sp->n_value;
        !           526:                    }
        !           527:                }
        !           528:                if (sp->n_value >= addr && line_sp)
        !           529:                    found_line = TRUE;
        !           530:                continue;
        !           531:            case N_FUN:
        !           532:                if ((found_line || (line_sp && line_diff < X_DB_MAX_DIFF))
        !           533:                    && line_func == 0)
        !           534:                    line_func = sp;
        !           535:                continue;
        !           536:            case N_TEXT:
        !           537:                if (X_db_is_filename(sp->n_un.n_name)) {
        !           538:                    if (sp->n_value > addr)
        !           539:                        continue;
        !           540:                    if (file_sp == 0 || file_sp->n_value < sp->n_value)
        !           541:                        file_sp = sp;
        !           542:                } else if (sp->n_value <= addr &&
        !           543:                         (func_sp == 0 || func_diff > addr - sp->n_value)) {
        !           544:                    func_sp = sp;
        !           545:                    func_diff = addr - sp->n_value;
        !           546:                }
        !           547:                continue;
        !           548:            case N_TEXT|N_EXT:
        !           549:                if (sp->n_value <= addr &&
        !           550:                         (func_sp == 0 || func_diff >= addr - sp->n_value)) {
        !           551:                    func_sp = sp;
        !           552:                    func_diff = addr - sp->n_value;
        !           553:                    if (func_diff == 0 && file_sp && func_sp)
        !           554:                        break;
        !           555:                }
        !           556:            default:
        !           557:                continue;
        !           558:            }
        !           559:            break;
        !           560:        }
        !           561:        if (line_sp) {
        !           562:            if (line_func == 0 || func_sp == 0
        !           563:                || line_func->n_value != func_sp->n_value)
        !           564:                line_sp = 0;
        !           565:        }
        !           566:        if (file_sp) {
        !           567:            *diff = addr - file_sp->n_value;
        !           568:            *file = file_sp->n_un.n_name;
        !           569:        }
        !           570:        if (func_sp) {
        !           571:            *diff = addr - func_sp->n_value;
        !           572:            *func = (func_sp->n_un.n_name[0] == '_')?
        !           573:                        func_sp->n_un.n_name + 1: func_sp->n_un.n_name;
        !           574:        }
        !           575:        if (line_sp) {
        !           576:            *diff = addr - line_sp->n_value;
        !           577:            *line = line_sp->n_desc;
        !           578:        }
        !           579:        return(file_sp || func_sp || line_sp);
        !           580: }
        !           581: 
        !           582: /* ARGSUSED */
        !           583: boolean_t
        !           584: X_db_line_at_pc(stab, sym, file, line, pc)
        !           585:        db_symtab_t     *stab;
        !           586:        db_sym_t        sym;
        !           587:        char            **file;
        !           588:        int             *line;
        !           589:        db_expr_t       pc;
        !           590: {
        !           591:        char            *func;
        !           592:        unsigned        diff;
        !           593:        boolean_t       found;
        !           594: 
        !           595:        found = X_db_search_by_addr(stab,(unsigned)pc,file,&func,line,&diff);
        !           596:        return(found && func && *file);
        !           597: }
        !           598: 
        !           599: /*
        !           600:  * Initialization routine for a.out files.
        !           601:  */
        !           602: kdb_init()
        !           603: {
        !           604:        extern char     *esym;
        !           605:        extern int      end;
        !           606: 
        !           607:        if (esym > (char *)&end) {
        !           608:            X_db_sym_init((int *)&end, esym, "mach");
        !           609:        }
        !           610: }
        !           611: 
        !           612: /*
        !           613:  * Read symbol table from file.
        !           614:  * (should be somewhere else)
        !           615:  */
        !           616: #include <bootstrap/file_io.h>
        !           617: #include <vm/vm_kern.h>
        !           618: 
        !           619: read_symtab_from_file(fp, symtab_name)
        !           620:        struct file     *fp;
        !           621:        char *          symtab_name;
        !           622: {
        !           623:        vm_size_t       resid;
        !           624:        kern_return_t   result;
        !           625:        vm_offset_t     symoff;
        !           626:        vm_size_t       symsize;
        !           627:        vm_offset_t     stroff;
        !           628:        vm_size_t       strsize;
        !           629:        vm_size_t       table_size;
        !           630:        vm_offset_t     symtab;
        !           631: 
        !           632:        if (!get_symtab(fp, &symoff, &symsize)) {
        !           633:            boot_printf("[ error %d reading %s file header ]\n",
        !           634:                        result, symtab_name);
        !           635:            return;
        !           636:        }
        !           637: 
        !           638:        stroff = symoff + symsize;
        !           639:        result = read_file(fp, (vm_offset_t)stroff,
        !           640:                        (vm_offset_t)&strsize, sizeof(strsize), &resid);
        !           641:        if (result || resid) {
        !           642:            boot_printf("[ no valid symbol table present for %s ]\n",
        !           643:                symtab_name);
        !           644:                return;
        !           645:        }
        !           646: 
        !           647:        table_size = sizeof(int) + symsize + strsize;
        !           648:        table_size = (table_size + sizeof(int)-1) & ~(sizeof(int)-1);
        !           649: 
        !           650:        result = kmem_alloc_wired(kernel_map, &symtab, table_size);
        !           651:        if (result) {
        !           652:            boot_printf("[ error %d allocating space for %s symbol table ]\n",
        !           653:                        result, symtab_name);
        !           654:            return;
        !           655:        }
        !           656: 
        !           657:        *(int *)symtab = symsize;
        !           658: 
        !           659:        result = read_file(fp, symoff,
        !           660:                        symtab + sizeof(int), symsize, &resid);
        !           661:        if (result || resid) {
        !           662:            boot_printf("[ error %d reading %s symbol table ]\n",
        !           663:                        result, symtab_name);
        !           664:            return;
        !           665:        }
        !           666: 
        !           667:        result = read_file(fp, stroff,
        !           668:                        symtab + sizeof(int) + symsize, strsize, &resid);
        !           669:        if (result || resid) {
        !           670:            boot_printf("[ error %d reading %s string table ]\n",
        !           671:                        result, symtab_name);
        !           672:            return;
        !           673:        }
        !           674: 
        !           675:        X_db_sym_init((int *)symtab,
        !           676:                        (char *)(symtab + table_size),
        !           677:                        symtab_name);
        !           678:        
        !           679: }
        !           680: 
        !           681: #endif /* DB_GCC_AOUT */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.