00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <types.h>
00031 #include <kern/unistd.h>
00032 #include <stdarg.h>
00033 #include <lib.h>
00034 #include <spl.h>
00035 #include <thread.h>
00036 #include <current.h>
00037 #include <synch.h>
00038 #include <mainbus.h>
00039 #include <vfs.h>
00040
00041
00042
00043 uint32_t dbflags = 0;
00044
00045
00046 static struct lock *kprintf_lock;
00047
00048
00049 static struct spinlock kprintf_spinlock;
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 void
00063 kprintf_bootstrap(void)
00064 {
00065 KASSERT(kprintf_lock == NULL);
00066
00067 kprintf_lock = lock_create("kprintf_lock");
00068 if (kprintf_lock == NULL) {
00069 panic("Could not create kprintf_lock\n");
00070 }
00071 spinlock_init(&kprintf_spinlock);
00072 }
00073
00074
00075
00076
00077 static
00078 void
00079 console_send(void *junk, const char *data, size_t len)
00080 {
00081 size_t i;
00082
00083 (void)junk;
00084
00085 for (i=0; i<len; i++) {
00086 putch(data[i]);
00087 }
00088 }
00089
00090
00091
00092
00093 int
00094 kprintf(const char *fmt, ...)
00095 {
00096 int chars;
00097 va_list ap;
00098 bool dolock;
00099
00100 dolock = kprintf_lock != NULL
00101 && curthread->t_in_interrupt == false
00102 && curthread->t_iplhigh_count == 0;
00103
00104 if (dolock) {
00105 lock_acquire(kprintf_lock);
00106 }
00107 else {
00108 spinlock_acquire(&kprintf_spinlock);
00109 }
00110 putch_prepare();
00111
00112 va_start(ap, fmt);
00113 chars = __vprintf(console_send, NULL, fmt, ap);
00114 va_end(ap);
00115
00116 putch_complete();
00117 if (dolock) {
00118 lock_release(kprintf_lock);
00119 }
00120 else {
00121 spinlock_release(&kprintf_spinlock);
00122 }
00123
00124 return chars;
00125 }
00126
00127
00128
00129
00130
00131
00132 void
00133 panic(const char *fmt, ...)
00134 {
00135 va_list ap;
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 static volatile int evil;
00149
00150 if (evil == 0) {
00151 evil = 1;
00152
00153
00154
00155
00156
00157
00158
00159 splhigh();
00160 }
00161
00162 if (evil == 1) {
00163 evil = 2;
00164
00165
00166 thread_panic();
00167 }
00168
00169 if (evil == 2) {
00170 evil = 3;
00171
00172
00173 kprintf("panic: ");
00174 putch_prepare();
00175 va_start(ap, fmt);
00176 __vprintf(console_send, NULL, fmt, ap);
00177 va_end(ap);
00178 putch_complete();
00179 }
00180
00181 if (evil == 3) {
00182 evil = 4;
00183
00184
00185 vfs_sync();
00186 }
00187
00188 if (evil == 4) {
00189 evil = 5;
00190
00191
00192 mainbus_panic();
00193 }
00194
00195
00196
00197
00198
00199 for (;;);
00200 }
00201
00202
00203
00204
00205 void
00206 badassert(const char *expr, const char *file, int line, const char *func)
00207 {
00208 panic("Assertion failed: %s, at %s:%d (%s)\n",
00209 expr, file, line, func);
00210 }