1 /* This file contains a collection of miscellaneous procedures:
2 * panic: abort MINIX due to a fatal error
3 * kputc: buffered putc used by kernel printf
6 #include "kernel/kernel.h"
7 #include "arch_proto.h"
9 #include <minix/syslib.h>
15 #include <minix/sys_config.h>
17 #define ARE_PANICING 0xDEADC0FF
19 /*===========================================================================*
21 *===========================================================================*/
22 void panic(const char *fmt
, ...)
25 /* The system has run aground of a fatal kernel error. Terminate execution. */
26 if (kinfo
.minix_panicing
== ARE_PANICING
) {
29 kinfo
.minix_panicing
= ARE_PANICING
;
31 printf("kernel panic: ");
38 printf("kernel on CPU %d: ", cpuid
);
42 if(get_cpulocal_var(proc_ptr
)) {
43 printf("current process : ");
44 proc_stacktrace(get_cpulocal_var(proc_ptr
));
52 /*===========================================================================*
54 *===========================================================================*/
56 int c
/* character to append */
59 /* Accumulate a single character for a kernel message. Send a notification
60 * to the output drivers if an END_OF_KMESS is encountered.
62 if (c
!= END_OF_KMESS
) {
63 int maxblpos
= sizeof(kmess
.kmess_buf
) - 2;
65 if (kinfo
.do_serial_debug
) {
71 kmess
.km_buf
[kmess
.km_next
] = c
; /* put normal char in buffer */
72 kmess
.kmess_buf
[kmess
.blpos
] = c
;
73 if (kmess
.km_size
< sizeof(kmess
.km_buf
))
75 kmess
.km_next
= (kmess
.km_next
+ 1) % _KMESS_BUF_SIZE
;
76 if(kmess
.blpos
== maxblpos
) {
77 memmove(kmess
.kmess_buf
,
78 kmess
.kmess_buf
+1, sizeof(kmess
.kmess_buf
)-1);
80 } else if (!(kinfo
.minix_panicing
|| kinfo
.do_serial_debug
)) {
85 /*===========================================================================*
87 *===========================================================================*/
89 int e
/* error code */
92 panic("_exit called from within the kernel, should not happen. (err %i)", e
);