|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Mach Operating System
27: * Copyright (c) 1989 Carnegie-Mellon University
28: * Copyright (c) 1988 Carnegie-Mellon University
29: * Copyright (c) 1987 Carnegie-Mellon University
30: * All rights reserved. The CMU software License Agreement specifies
31: * the terms and conditions for use and redistribution.
32: */
33: /*
34: * xpr silent tracing circular buffer.
35: */
36:
37: #if NeXT
38: #define NO_IPLMEAS 1
39: #endif NeXT
40:
41: #import <kern/xpr.h>
42: #import <kern/lock.h>
43: #import <bsd/machine/cpu.h>
44: #import <machine/param.h> /* for splhigh */
45: #import <vm/vm_kern.h>
46: #import <machine/spl.h>
47:
48: decl_simple_lock_data(,xprlock)
49:
50: #if NeXT
51: /* always allocate xpr buffers so xprs can be enabled anytime */
52: int nxprbufs = 512; /* Number of contiguous xprbufs allocated */
53: #else NeXT
54: int nxprbufs = 0; /* Number of contiguous xprbufs allocated */
55: #endif NeXT
56: unsigned int xprflags = 0; /* Bit mask of xpr flags enabled */
57: unsigned int xprwrap = TRUE; /* xpr's wrap in buf or just stop at end */
58: struct xprbuf *xprbase; /* Pointer to circular buffer nxprbufs*sizeof(xprbuf)*/
59: struct xprbuf *xprptr; /* Currently allocated xprbuf */
60: struct xprbuf *xprlast; /* Pointer to end of circular buffer */
61: unsigned xprlocked = 0; /* when TRUE, disables logging */
62:
63: /*VARARGS1*/
64: xpr(msg, arg1, arg2, arg3, arg4, arg5, arg6)
65: char *msg;
66: {
67: register s;
68: register struct xprbuf *x;
69:
70: #ifdef lint
71: arg6++;
72: #endif lint
73:
74: /* If we aren't initialized, ignore trace request */
75: if (!nxprbufs || xprptr == 0 || xprlocked)
76: return;
77: /* Guard against all interrupts and allocate next buffer */
78: s = splhigh();
79: simple_lock(&xprlock);
80: x = xprptr++;
81: if (xprptr >= xprlast) {
82: /* wrap around */
83: xprptr = xprwrap ? xprbase : xprlast - 1;
84: }
85: x->timestamp = XPR_TIMESTAMP;
86: simple_unlock(&xprlock);
87: splx(s);
88: x->msg = msg;
89: x->arg1 = arg1;
90: x->arg2 = arg2;
91: x->arg3 = arg3;
92: x->arg4 = arg4;
93: x->arg5 = arg5;
94: x->cpuinfo = cpu_number();
95: }
96:
97: xprbootstrap()
98: {
99: simple_lock_init(&xprlock);
100: if (nxprbufs == 0 && xprflags == 0)
101: return; /* assume XPR support not desired */
102: else if (nxprbufs == 0)
103: nxprbufs=512; /* if flags are set must do something */
104: xprbase = (struct xprbuf *)kmem_alloc(kernel_map,
105: (vm_size_t)(nxprbufs * sizeof(struct xprbuf)));
106: xprlast = &xprbase[nxprbufs];
107: xprptr = xprbase;
108: }
109:
110: int xprinitial = 0;
111:
112: xprinit()
113: {
114: xprflags |= xprinitial;
115: }
116:
117: /*
118: * Save 'number' of xpr buffers to the area provided by buffer.
119: */
120:
121: xpr_save(buffer,number)
122: struct xprbuf *buffer;
123: int number;
124: {
125: int i,s;
126: struct xprbuf *x;
127: s = splhigh();
128: simple_lock(&xprlock);
129: if (number > nxprbufs) number = nxprbufs;
130: x = xprptr;
131:
132: for (i = number - 1; i >= 0 ; i-- ) {
133: if (--x < xprbase) {
134: /* wrap around */
135: x = xprlast - 1;
136: }
137: bcopy(x,&buffer[i],sizeof(struct xprbuf));
138: }
139: simple_unlock(&xprlock);
140: splx(s);
141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.