Annotation of XNU/osfmk/kern/xpr.c, revision 1.1.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:  * @OSF_COPYRIGHT@
                     24:  */
                     25: /*
                     26:  * HISTORY
                     27:  * 
                     28:  * Revision 1.1.1.1  1998/09/22 21:05:32  wsanchez
                     29:  * Import of Mac OS X kernel (~semeria)
                     30:  *
                     31:  * Revision 1.1.1.1  1998/03/07 02:25:57  wsanchez
                     32:  * Import of OSF Mach kernel (~mburg)
                     33:  *
                     34:  * Revision 1.2.46.1  1997/09/22  17:41:21  barbou
                     35:  *     MP+RT: protect cpu_number() usage against preemption.
                     36:  *     [97/09/16            barbou]
                     37:  *
                     38:  * Revision 1.2.25.5  1996/07/31  09:56:06  paire
                     39:  *     Merged with nmk20b7_shared (1.2.41.1)
                     40:  *     [96/06/10            paire]
                     41:  * 
                     42:  * Revision 1.2.41.1  1996/04/15  14:35:12  bernadat
                     43:  *     Keep interrupts disabled while accessing XPR_TIMESTAMP.
                     44:  *     [96/04/12            bernadat]
                     45:  * 
                     46:  * Revision 1.2.25.4  1995/02/24  15:22:42  alanl
                     47:  *     DIPC:  Merge from nmk17b2 to nmk18b8.
                     48:  *     Notes:  Restore portable locks package, derived from nmk17b2.
                     49:  *     [95/02/07            alanl]
                     50:  * 
                     51:  * Revision 1.2.28.3  1994/12/09  22:25:16  dwm
                     52:  *     mk6 CR801 - merge up from nmk18b4 to nmk18b7
                     53:  *     * Rev 1.2.25.2  1994/10/21  18:30:41  joe
                     54:  *       Added ETAP support
                     55:  *     [1994/12/09  21:10:59  dwm]
                     56:  * 
                     57:  * Revision 1.2.28.2  1994/11/10  06:15:29  dwm
                     58:  *     mk6 CR764 - s/spinlock/simple_lock/ (name change only)
                     59:  *     [1994/11/10  05:58:48  dwm]
                     60:  * 
                     61:  * Revision 1.2.28.1  1994/11/04  10:10:56  dwm
                     62:  *     mk6 CR668 - 1.3b26 merge
                     63:  *     * Revision 1.2.5.7  1994/05/06  18:54:13  tmt
                     64:  *     Merge in DEC Alpha changes to osc1.3b19.
                     65:  *     include <mach/machine/vm_types.h>
                     66:  *     64 bit cleanup.
                     67:  *     * End1.3merge
                     68:  *     [1994/11/04  09:39:17  dwm]
                     69:  * 
                     70:  * Revision 1.2.25.1  1994/09/23  02:32:39  ezf
                     71:  *     change marker to not FREE
                     72:  *     [1994/09/22  21:38:29  ezf]
                     73:  * 
                     74:  * Revision 1.2.22.1  1994/06/09  14:14:11  dswartz
                     75:  *     Preemption merge.
                     76:  *     [1994/06/09  14:08:38  dswartz]
                     77:  * 
                     78:  * Revision 1.2.5.5  1993/08/12  20:16:51  bernard
                     79:  *     Last pass for ANSI prototypes - CR#9523
                     80:  *     [1993/08/12  15:43:24  bernard]
                     81:  * 
                     82:  * Revision 1.2.5.4  1993/08/02  17:26:05  rod
                     83:  *     ANSI prototypes:  zap explicit include of machine/setjmp.h.  CR #9523.
                     84:  *     [1993/08/01  13:36:31  rod]
                     85:  * 
                     86:  * Revision 1.2.5.3  1993/07/27  18:09:05  rod
                     87:  *     Add ANSI prototypes.  CR #9523.
                     88:  *     [1993/07/27  14:33:23  rod]
                     89:  * 
                     90:  * Revision 1.2.5.2  1993/06/09  02:39:13  gm
                     91:  *     CR9176 - ANSI C violations: trailing tokens on CPP
                     92:  *     directives, extra semicolons after decl_ ..., asm keywords
                     93:  *     [1993/06/07  19:07:51  jeffc]
                     94:  * 
                     95:  *     Added to OSF/1 R1.3 from NMK15.0.
                     96:  *     [1993/06/02  21:15:13  jeffc]
                     97:  * 
                     98:  * Revision 1.2  1993/04/19  16:31:21  devrcs
                     99:  *     Added void to fcns that still needed it.
                    100:  *     [93/02/05            bruel]
                    101:  * 
                    102:  * Revision 1.1  1992/09/30  02:10:39  robert
                    103:  *     Initial revision
                    104:  * 
                    105:  * $EndLog$
                    106:  */
                    107: /* CMU_HIST */
                    108: /*
                    109:  * Revision 2.9.5.2  92/03/03  16:20:57  jeffreyh
                    110:  *     Fix Log.
                    111:  *     [92/02/24  13:24:44  jeffreyh]
                    112:  * 
                    113:  * Revision 2.9.5.1  92/02/18  19:13:03  jeffreyh
                    114:  *     Added an xpr_search function to which you can give
                    115:  *     a selection function.
                    116:  *     [92/02/11  08:13:23  bernadat]
                    117:  * 
                    118:  * Revision 2.9.4.1  92/02/13  18:53:47  jeffreyh
                    119:  *     Added an xpr_search function to which you can give
                    120:  *     a selection function.
                    121:  *     [92/02/11  08:13:23  bernadat]
                    122:  * 
                    123:  * Revision 2.9.3.1  92/02/11  17:19:59  jeffreyh
                    124:  *     Added an xpr_search function to which you can give
                    125:  *     a selection function.
                    126:  *     [92/02/11  08:13:23  bernadat]
                    127:  * 
                    128:  * Revision 2.9.2.1  92/02/11  08:13:23  bernadat
                    129:  *     Added an xpr_search function to which you can give
                    130:  *     a selection function.
                    131:  * 
                    132:  * 
                    133:  * Revision 2.9  91/10/09  16:11:50  af
                    134:  *     Removed xpr_save.  Modified xpr_dump to make it useful
                    135:  *     for dumping xpr buffers in user space tasks.
                    136:  *     [91/09/20            rpd]
                    137:  * 
                    138:  *     Turned on xprenable by default.  xprbootstrap now preserves
                    139:  *     the original contents of the buffer if xprenable is off.
                    140:  *     [91/09/18            rpd]
                    141:  * 
                    142:  * Revision 2.8  91/08/28  11:14:56  jsb
                    143:  *     Fixed xprbootstrap to zero the allocate memory.
                    144:  *     [91/08/18            rpd]
                    145:  * 
                    146:  * Revision 2.7  91/05/18  14:34:37  rpd
                    147:  *     Added xprenable and other minor changes so that the xpr buffer
                    148:  *     may be examined after a spontaneous reboot.
                    149:  *     [91/05/03            rpd]
                    150:  *     Fixed the initialization check in xpr.
                    151:  *     Fixed xpr_dump.
                    152:  *     [91/04/02            rpd]
                    153:  * 
                    154:  * Revision 2.6  91/05/14  16:50:09  mrt
                    155:  *     Correcting copyright
                    156:  * 
                    157:  * Revision 2.5  91/03/16  14:53:24  rpd
                    158:  *     Updated for new kmem_alloc interface.
                    159:  *     [91/03/03            rpd]
                    160:  * 
                    161:  * Revision 2.4  91/02/05  17:31:13  mrt
                    162:  *     Changed to new Mach copyright
                    163:  *     [91/02/01  16:21:17  mrt]
                    164:  * 
                    165:  * Revision 2.3  90/09/09  14:33:04  rpd
                    166:  *     Use decl_simple_lock_data.
                    167:  *     [90/08/30            rpd]
                    168:  * 
                    169:  * Revision 2.2  89/11/29  14:09:21  af
                    170:  *     Added xpr_dump() to print on console the content of the buffer,
                    171:  *     only valid for KDB usage.
                    172:  *     [89/11/12            af]
                    173:  * 
                    174:  *     MACH_KERNEL: include sys/cpu_number.h instead of machine/cpu.h.
                    175:  *     Clean up comments.
                    176:  *     [88/12/19            dbg]
                    177:  * 
                    178:  * Revision 2.1  89/08/03  15:49:11  rwd
                    179:  * Created.
                    180:  * 
                    181:  * Revision 2.2  88/12/19  02:48:30  mwyoung
                    182:  *     Fix include file references.
                    183:  *     [88/11/22  02:17:01  mwyoung]
                    184:  *     
                    185:  *     Separate initialization into two phases.
                    186:  *     [88/11/22  01:13:11  mwyoung]
                    187:  * 
                    188:  *  6-Jan-88  Michael Young (mwyoung) at Carnegie-Mellon University
                    189:  *     Eliminate use of arg6 in order to allow a more shapely event structure.
                    190:  *
                    191:  * 30-Dec-87  David Golub (dbg) at Carnegie-Mellon University
                    192:  *     Delinted.
                    193:  *
                    194:  *  7-Dec-87  Richard Sanzi (sanzi) at Carnegie-Mellon University
                    195:  *     Added xpr_save() routine.
                    196:  *
                    197:  */ 
                    198: /* CMU_ENDHIST */
                    199: /* 
                    200:  * Mach Operating System
                    201:  * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
                    202:  * All Rights Reserved.
                    203:  * 
                    204:  * Permission to use, copy, modify and distribute this software and its
                    205:  * documentation is hereby granted, provided that both the copyright
                    206:  * notice and this permission notice appear in all copies of the
                    207:  * software, derivative works or modified versions, and any portions
                    208:  * thereof, and that both notices appear in supporting documentation.
                    209:  * 
                    210:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                    211:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                    212:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                    213:  * 
                    214:  * Carnegie Mellon requests users of this software to return to
                    215:  * 
                    216:  *  Software Distribution Coordinator  or  [email protected]
                    217:  *  School of Computer Science
                    218:  *  Carnegie Mellon University
                    219:  *  Pittsburgh PA 15213-3890
                    220:  * 
                    221:  * any improvements or extensions that they make and grant Carnegie Mellon
                    222:  * the rights to redistribute these changes.
                    223:  */
                    224: #include <mach_kdb.h>
                    225: /*
                    226:  * xpr silent tracing circular buffer.
                    227:  */
                    228: 
                    229: #include <cpus.h>
                    230: 
                    231: #include <mach/machine/vm_types.h>
                    232: #include <kern/xpr.h>
                    233: #include <kern/lock.h>
                    234: #include <kern/spl.h>
                    235: #include <kern/cpu_number.h>
                    236: #include <kern/misc_protos.h>
                    237: #include <kern/thread.h>
                    238: #include <vm/vm_kern.h>
                    239: #include <string.h>
                    240: 
                    241: /*
                    242:  *     After a spontaneous reboot, it is desirable to look
                    243:  *     at the old xpr buffer.  Assuming xprbootstrap allocates
                    244:  *     the buffer in the same place in physical memory and
                    245:  *     the reboot doesn't clear memory, this should work.
                    246:  *     xprptr will be reset, but the saved value should be OK.
                    247:  *     Just set xprenable false so the buffer isn't overwritten.
                    248:  */
                    249: 
                    250: decl_simple_lock_data(,xprlock)
                    251: boolean_t xprenable = TRUE;    /* Enable xpr tracing */
                    252: int nxprbufs = 0;      /* Number of contiguous xprbufs allocated */
                    253: int xprflags = 0;      /* Bit mask of xpr flags enabled */
                    254: struct xprbuf *xprbase;        /* Pointer to circular buffer nxprbufs*sizeof(xprbuf)*/
                    255: struct xprbuf *xprptr; /* Currently allocated xprbuf */
                    256: struct xprbuf *xprlast;        /* Pointer to end of circular buffer */
                    257: 
                    258: void
                    259: xpr(
                    260:        char    *msg,
                    261:        long    arg1,
                    262:        long    arg2,
                    263:        long    arg3,
                    264:        long    arg4,
                    265:        long    arg5)
                    266: {
                    267:        spl_t s;
                    268:        register struct xprbuf *x;
                    269: 
                    270:        /* If we aren't initialized, ignore trace request */
                    271:        if (!xprenable || (xprptr == 0))
                    272:                return;
                    273:        /* Guard against all interrupts and allocate next buffer. */
                    274: 
                    275:        s = splhigh();
                    276:        simple_lock(&xprlock);
                    277:        x = xprptr++;
                    278:        if (xprptr >= xprlast) {
                    279:                /* wrap around */
                    280:                xprptr = xprbase;
                    281:        }
                    282:        /* Save xprptr in allocated memory. */
                    283:        *(struct xprbuf **)xprlast = xprptr;
                    284:        simple_unlock(&xprlock);
                    285:        x->timestamp = XPR_TIMESTAMP;
                    286:        splx(s);
                    287:        x->msg = msg;
                    288:        x->arg1 = arg1;
                    289:        x->arg2 = arg2;
                    290:        x->arg3 = arg3;
                    291:        x->arg4 = arg4;
                    292:        x->arg5 = arg5;
                    293:        mp_disable_preemption();
                    294:        x->cpuinfo = cpu_number();
                    295:        mp_enable_preemption();
                    296: }
                    297: 
                    298: void 
                    299: xprbootstrap(void)
                    300: {
                    301:        vm_offset_t     addr;
                    302:        vm_size_t       size;
                    303:        kern_return_t   kr;
                    304: 
                    305:        simple_lock_init(&xprlock, ETAP_MISC_XPR);
                    306:        if (nxprbufs == 0)
                    307:                return; /* assume XPR support not desired */
                    308: 
                    309:        /* leave room at the end for a saved copy of xprptr */
                    310:        size = nxprbufs * sizeof(struct xprbuf) + sizeof xprptr;
                    311: 
                    312:        kr = kmem_alloc_wired(kernel_map, &addr, size);
                    313:        if (kr != KERN_SUCCESS)
                    314:                panic("xprbootstrap");
                    315: 
                    316:        if (xprenable) {
                    317:                /*
                    318:                 *      If xprenable is set (the default) then we zero
                    319:                 *      the buffer so xpr_dump doesn't encounter bad pointers.
                    320:                 *      If xprenable isn't set, then we preserve
                    321:                 *      the original contents of the buffer.  This is useful
                    322:                 *      if memory survives reboots, so xpr_dump can show
                    323:                 *      the previous buffer contents.
                    324:                 */
                    325: 
                    326:                (void) memset((void *) addr, 0, size);
                    327:        }
                    328: 
                    329:        xprbase = (struct xprbuf *) addr;
                    330:        xprlast = &xprbase[nxprbufs];
                    331:        xprptr = xprbase;       /* setting xprptr enables tracing */
                    332: }
                    333: 
                    334: int            xprinitial = 0;
                    335: 
                    336: void
                    337: xprinit(void)
                    338: {
                    339:        xprflags |= xprinitial;
                    340: }
                    341: 
                    342: #if    MACH_KDB
                    343: #include <ddb/db_output.h>
                    344: 
                    345: /*
                    346:  * Prototypes for functions called from the debugger
                    347:  */
                    348: void
                    349: xpr_dump(
                    350:        struct xprbuf   *base,
                    351:        int             nbufs);
                    352: 
                    353: void
                    354: xpr_search(
                    355:        int     arg_index,
                    356:        int     value);
                    357: 
                    358: extern jmp_buf_t *db_recover;
                    359: 
                    360: /*
                    361:  *     Print current content of xpr buffers (KDB's sake)
                    362:  *     Use stack order to make it understandable.
                    363:  *
                    364:  *     Called as "!xpr_dump" this dumps the kernel's xpr buffer.
                    365:  *     Called with arguments, it can dump xpr buffers in user tasks,
                    366:  *     assuming they use the same format as the kernel.
                    367:  */
                    368: void
                    369: xpr_dump(
                    370:        struct xprbuf   *base,
                    371:        int             nbufs)
                    372: {
                    373:        jmp_buf_t db_jmpbuf;
                    374:        jmp_buf_t *prev;
                    375:        struct xprbuf *last, *ptr;
                    376:        register struct xprbuf *x;
                    377:        int i;
                    378:        spl_t s;
                    379: 
                    380:        if (base == 0) {
                    381:                base = xprbase;
                    382:                nbufs = nxprbufs;
                    383:        }
                    384: 
                    385:        if (nbufs == 0)
                    386:                return;
                    387: 
                    388:        if (base == xprbase) {
                    389:                s = splhigh();
                    390:                simple_lock(&xprlock);
                    391:        }
                    392: 
                    393:        last = base + nbufs;
                    394:        ptr = * (struct xprbuf **) last;
                    395: 
                    396:        prev = db_recover;
                    397:        if (_setjmp(db_recover = &db_jmpbuf) == 0)
                    398:            for (x = ptr, i = 0; i < nbufs; i++) {
                    399:                if (--x < base)
                    400:                        x = last - 1;
                    401: 
                    402:                if (x->msg == 0)
                    403:                        break;
                    404: 
                    405:                db_printf("<%d:%x:%x> ", x - base, x->cpuinfo, x->timestamp);
                    406:                db_printf(x->msg, x->arg1,x->arg2,x->arg3,x->arg4,x->arg5);
                    407:            }
                    408:        db_recover = prev;
                    409: 
                    410:        if (base == xprbase) {
                    411:                simple_unlock(&xprlock);
                    412:                splx(s);
                    413:        }
                    414: }
                    415: 
                    416: /*
                    417:  * dump xpr table with a selection criteria.
                    418:  * argument number "arg_index" must equal "value"
                    419:  */
                    420: 
                    421: void
                    422: xpr_search(
                    423:        int     arg_index,
                    424:        int     value)
                    425: {
                    426:        jmp_buf_t db_jmpbuf;
                    427:        jmp_buf_t *prev;
                    428:        register struct xprbuf *x;
                    429:        spl_t s;
                    430:        int n;
                    431: 
                    432:        if (!nxprbufs)
                    433:                return;
                    434: 
                    435:        n = nxprbufs;
                    436: 
                    437:        s = splhigh();
                    438:        simple_lock(&xprlock);
                    439: 
                    440:        prev = db_recover;
                    441:        if (_setjmp(db_recover = &db_jmpbuf) == 0)
                    442:            for (x = *(struct xprbuf **)xprlast ; n--; ) {
                    443:                if (--x < xprbase)
                    444:                        x = xprlast - 1;
                    445: 
                    446:                if (x->msg == 0) {
                    447:                        break;
                    448:                }
                    449: 
                    450:                if (*((&x->arg1)+arg_index) != value)
                    451:                        continue;
                    452: 
                    453:                db_printf("<%d:%d:%x> ", x - xprbase,
                    454:                          x->cpuinfo, x->timestamp);
                    455:                db_printf(x->msg, x->arg1,x->arg2,x->arg3,x->arg4,x->arg5);
                    456:            }
                    457:        db_recover = prev;
                    458: 
                    459:        simple_unlock(&xprlock);
                    460:        splx(s);
                    461: }
                    462: #endif /* MACH_KDB */

unix.superglobalmegacorp.com

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