ultralog.c
2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*====================================================================
* ultralog.c
*
* Copyright 1995, Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
* Inc.; the contents of this file may not be disclosed to third
* parties, copied or duplicated in any form, in whole or in part,
* without the prior written permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to
* restrictions as set forth in subdivision (c)(1)(ii) of the Rights
* in Technical Data and Computer Software clause at DFARS
* 252.227-7013, and/or in similar or successor clauses in the FAR,
* DOD or NASA FAR Supplement. Unpublished - rights reserved under the
* Copyright Laws of the United States.
*====================================================================*/
#include <stdarg.h>
#include <stdio.h>
#include <ultralog.h>
#define PI_BASE ((u32)(0xb0700000))
static void __osLogWrite(OSLog *log, long *data, int numLongs);
void osCreateLog(OSLog *log, u32 *base, s32 byteLen)
{
log->magic = OS_LOG_MAGIC;
log->base = base;
log->len = byteLen;
log->writeOffset = 0;
}
void osLogEvent(OSLog *log, s16 code, s16 numArgs, ...)
{
int i;
va_list argPtr;
long buf[OS_LOG_MAX_ARGS + sizeof(OSLogItem)/sizeof(long)];
OSLogItem *hdr = (OSLogItem *)buf;
long *args = &buf[sizeof(OSLogItem)/sizeof(long)];
if (numArgs > OS_LOG_MAX_ARGS)
return;
hdr->timeStamp = 0; /* for now, should be RPSS counter */
hdr->argCount = numArgs;
hdr->eventID = code;
va_start(argPtr, numArgs);
for (i = 0; i < numArgs; i++) {
args[i] = va_arg(argPtr, long);
}
va_end(argPtr);
__osLogWrite(log, buf, sizeof(OSLogItem)/sizeof(long) + numArgs);
}
void osFlushLog(OSLog *log)
{
u32 *dest = (u32 *)(PI_BASE);
u32 *src = log->base;
/*
for (i = 0; i < log->len/sizeof(long); i++) {
osPiRawWriteIo((u32)dest++, *src++);
}
*/
}
void __osLogWrite(OSLog *log, long *data, int numLongs)
{
int i;
int writeOffset = log->writeOffset;
for (i = 0; i < numLongs; i++) {
*(log->base + writeOffset) = *data++;
writeOffset++;
}
log->writeOffset = writeOffset;
}
void printLog(OSLog *log)
{
int i;
u32 *data = log->base;
for (i = 0; i < log->writeOffset; i++) {
printf("0x%x\n", *data++);
}
}