ultralog.c 2.48 KB
/*====================================================================
 * 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++);
    }
}