cf9a4ec79b
Coverity was flagging a recursive include between kernel.h and cpulocals.h. As cpulocals.h also included proc.h, we can move that include statement into kernel.h, and clean up the source files' include statements accordingly.
91 lines
2.4 KiB
C
91 lines
2.4 KiB
C
/* This file contains a collection of miscellaneous procedures:
|
|
* panic: abort MINIX due to a fatal error
|
|
* kputc: buffered putc used by kernel printf
|
|
*/
|
|
|
|
#include "kernel.h"
|
|
#include "arch_proto.h"
|
|
|
|
#include <minix/syslib.h>
|
|
#include <unistd.h>
|
|
#include <stdarg.h>
|
|
#include <signal.h>
|
|
#include <string.h>
|
|
|
|
#include <minix/sys_config.h>
|
|
|
|
#define ARE_PANICING 0xDEADC0FF
|
|
|
|
/*===========================================================================*
|
|
* panic *
|
|
*===========================================================================*/
|
|
void panic(const char *fmt, ...)
|
|
{
|
|
va_list arg;
|
|
/* The system has run aground of a fatal kernel error. Terminate execution. */
|
|
if (kinfo.minix_panicing == ARE_PANICING) {
|
|
reset();
|
|
}
|
|
kinfo.minix_panicing = ARE_PANICING;
|
|
if (fmt != NULL) {
|
|
printf("kernel panic: ");
|
|
va_start(arg, fmt);
|
|
vprintf(fmt, arg);
|
|
printf("\n");
|
|
}
|
|
|
|
printf("kernel on CPU %d: ", cpuid);
|
|
util_stacktrace();
|
|
|
|
#if 0
|
|
if(get_cpulocal_var(proc_ptr)) {
|
|
printf("current process : ");
|
|
proc_stacktrace(get_cpulocal_var(proc_ptr));
|
|
}
|
|
#endif
|
|
|
|
/* Abort MINIX. */
|
|
minix_shutdown(NULL);
|
|
}
|
|
|
|
/*===========================================================================*
|
|
* kputc *
|
|
*===========================================================================*/
|
|
void kputc(c)
|
|
int c; /* character to append */
|
|
{
|
|
/* Accumulate a single character for a kernel message. Send a notification
|
|
* to the output driver if an END_OF_KMESS is encountered.
|
|
*/
|
|
if (c != END_OF_KMESS) {
|
|
int maxblpos = sizeof(kmess.kmess_buf) - 2;
|
|
#ifdef DEBUG_SERIAL
|
|
if (kinfo.do_serial_debug) {
|
|
if(c == '\n')
|
|
ser_putc('\r');
|
|
ser_putc(c);
|
|
}
|
|
#endif
|
|
kmess.km_buf[kmess.km_next] = c; /* put normal char in buffer */
|
|
kmess.kmess_buf[kmess.blpos] = c;
|
|
if (kmess.km_size < sizeof(kmess.km_buf))
|
|
kmess.km_size += 1;
|
|
kmess.km_next = (kmess.km_next + 1) % _KMESS_BUF_SIZE;
|
|
if(kmess.blpos == maxblpos) {
|
|
memmove(kmess.kmess_buf,
|
|
kmess.kmess_buf+1, sizeof(kmess.kmess_buf)-1);
|
|
} else kmess.blpos++;
|
|
} else {
|
|
int p;
|
|
endpoint_t outprocs[] = OUTPUT_PROCS_ARRAY;
|
|
if(!(kinfo.minix_panicing || kinfo.do_serial_debug)) {
|
|
for(p = 0; outprocs[p] != NONE; p++) {
|
|
if(isokprocn(outprocs[p])) {
|
|
send_sig(outprocs[p], SIGKMESS);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|