This source file includes following definitions.
- printint
- printptr
- printk
- panic
- printkinit
1
2
3
4
5 #include <stdarg.h>
6
7 #include "types.h"
8 #include "param.h"
9 #include "spinlock.h"
10 #include "sleeplock.h"
11 #include "fs.h"
12 #include "file.h"
13 #include "memlayout.h"
14 #include "riscv.h"
15 #include "defs.h"
16 #include "proc.h"
17
18 volatile int panicking = 0;
19 volatile int panicked = 0;
20
21
22 static struct {
23 struct spinlock lock;
24 } pr;
25
26 static char digits[] = "0123456789abcdef";
27
28 static void
29 printint(long long xx, int base, int sign)
30 {
31 char buf[20];
32 int i;
33 unsigned long long x;
34
35 if (sign && (sign = (xx < 0)))
36 x = -xx;
37 else
38 x = xx;
39
40 i = 0;
41 do {
42 buf[i++] = digits[x % base];
43 } while ((x /= base) != 0);
44
45 if (sign)
46 buf[i++] = '-';
47
48 while (--i >= 0)
49 consputc(buf[i]);
50 }
51
52 static void
53 printptr(uint64 x)
54 {
55 int i;
56 consputc('0');
57 consputc('x');
58 for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
59 consputc(digits[x >> (sizeof(uint64) * 8 - 4)]);
60 }
61
62
63 int
64 printk(char *fmt, ...)
65 {
66 va_list ap;
67 int i, cx, c0, c1, c2;
68 char *s;
69
70 if (panicking == 0)
71 acquire(&pr.lock);
72
73 va_start(ap, fmt);
74 for (i = 0; (cx = fmt[i] & 0xff) != 0; i++) {
75 if (cx != '%') {
76 consputc(cx);
77 continue;
78 }
79 i++;
80 c0 = fmt[i + 0] & 0xff;
81 c1 = c2 = 0;
82 if (c0)
83 c1 = fmt[i + 1] & 0xff;
84 if (c1)
85 c2 = fmt[i + 2] & 0xff;
86 if (c0 == 'd') {
87 printint(va_arg(ap, int), 10, 1);
88 } else if (c0 == 'l' && c1 == 'd') {
89 printint(va_arg(ap, uint64), 10, 1);
90 i += 1;
91 } else if (c0 == 'l' && c1 == 'l' && c2 == 'd') {
92 printint(va_arg(ap, uint64), 10, 1);
93 i += 2;
94 } else if (c0 == 'u') {
95 printint(va_arg(ap, uint32), 10, 0);
96 } else if (c0 == 'l' && c1 == 'u') {
97 printint(va_arg(ap, uint64), 10, 0);
98 i += 1;
99 } else if (c0 == 'l' && c1 == 'l' && c2 == 'u') {
100 printint(va_arg(ap, uint64), 10, 0);
101 i += 2;
102 } else if (c0 == 'x') {
103 printint(va_arg(ap, uint32), 16, 0);
104 } else if (c0 == 'l' && c1 == 'x') {
105 printint(va_arg(ap, uint64), 16, 0);
106 i += 1;
107 } else if (c0 == 'l' && c1 == 'l' && c2 == 'x') {
108 printint(va_arg(ap, uint64), 16, 0);
109 i += 2;
110 } else if (c0 == 'p') {
111 printptr(va_arg(ap, uint64));
112 } else if (c0 == 'c') {
113 consputc(va_arg(ap, uint));
114 } else if (c0 == 's') {
115 if ((s = va_arg(ap, char *)) == 0)
116 s = "(null)";
117 for (; *s; s++)
118 consputc(*s);
119 } else if (c0 == '%') {
120 consputc('%');
121 } else if (c0 == 0) {
122 break;
123 } else {
124
125 consputc('%');
126 consputc(c0);
127 }
128 }
129 va_end(ap);
130
131 if (panicking == 0)
132 release(&pr.lock);
133
134 return 0;
135 }
136
137 void
138 panic(char *s)
139 {
140 panicking = 1;
141 printk("panic: ");
142 printk("%s\n", s);
143 panicked = 1;
144 for (;;)
145 ;
146 }
147
148 void
149 printkinit(void)
150 {
151 initlock(&pr.lock, "pr");
152 }