Coherent4.2.10/coh.386/lib/cmn_put.c

/* $Header: $ */

#define	_DDI_DKI	1
#define	_SYSV4		1

/*
 * Simple im-memory traceback buffer for kernel debugging.
 *
 * This module exists to service the DDI/DKI cmn_err () function, which takes
 * care of details like locking. This function is a simple debugging output
 * which logs characters to a wrap-around memory buffer that might be useful
 * for post-mortem kernel debugging.
 *
 * $Log: $
 */

/*
 *-IMPORTS:
 *	<common/ccompat.h>
 *		__USE_PROTO__
 *		__ARGS ()
 *	<common/xdebug.h>
 *		__LOCAL__
 */

#include <common/ccompat.h>
#include <common/xdebug.h>


#ifndef	DEBUG_BUF_SIZE
#define	DEBUG_BUF_SIZE	1024
#endif


#define	SIGNATURE	"$PUTBUF:"


/*
 * Local state for the simple debug output.
 */

__LOCAL__ struct {
	unsigned char	signature [sizeof (SIGNATURE)];
	unsigned	offset;
	unsigned char	buffer [DEBUG_BUF_SIZE];
} _putbuf = {
	SIGNATURE
};


/*
 *-STATUS:
 *	Private to cmn_err ()
 *
 *-NAME:
 *	_put_putbuf ()	simple post-mortem debugging output
 *
 *-ARGUMENTS:
 *	outch		The character to record in the post-mortem traceback
 *			buffer.
 *
 *-DESCRIPTION:
 *	This function provides system-specific debugging output support for
 *	the DDI/DKI cnm_err () function, interfacing to a simple wraparound
 *	traceback buffer.
 *
 *-NOTES:
 *	This function does not sleep.
 *
 *	Driver-defined basic locks, read/write locks and sleep locks may
 *	be held across calls to this function.
 *
 *	In systems where the contents of main memory are not usually
 *	available after a crash and restart, the traceback memory may be
 *	stored off-line (recorded through a serial port), or checkpointed
 *	into memory not touched by the system boot process (such as network
 *	adapter buffer memory). In such systems, the traceback output may
 *	be "buffered" and only flushed when requested to record a '\n'
 */

#if	__USE_PROTO__
void (_put_putbuf) (unsigned char outch)
#else
void
_put_putbuf __ARGS ((outch))
unsigned char	outch;
#endif
{
	_putbuf.buffer [_putbuf.offset] = outch;
	_putbuf.offset = (_putbuf.offset + 1) % sizeof (_putbuf.buffer);
}