Deleted Added
sdiff udiff text old ( 11793:ef606668d247 ) new ( 12392:e0dbdf30a2a5 )
full compact
1/*
2 * Copyright (c) 2004-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Nathan Binkert
29 * Ali Saidi
30 */
31
32#include "kern/linux/printk.hh"
33
34#include <sys/types.h>
35
36#include <algorithm>
37
38#include "base/trace.hh"
39#include "cpu/thread_context.hh"
40#include "sim/arguments.hh"
41
42using namespace std;
43
44
45void
46Printk(stringstream &out, Arguments args)
47{
48 char *p = (char *)args++;
49
50 while (*p) {
51 switch (*p) {
52 case '%': {
53 bool more = true;
54 bool islong = false;
55 bool leftjustify = false;
56 bool format = false;
57 bool zero = false;
58 int width = 0;
59 while (more && *++p) {
60 switch (*p) {
61 case 'l':
62 case 'L':
63 islong = true;
64 break;
65 case '-':
66 leftjustify = true;
67 break;
68 case '#':
69 format = true;
70 break;
71 case '0':
72 if (width)
73 width *= 10;
74 else
75 zero = true;
76 break;
77 default:
78 if (*p >= '1' && *p <= '9')
79 width = 10 * width + *p - '0';
80 else
81 more = false;
82 break;
83 }
84 }
85
86 bool hexnum = false;
87 bool octal = false;
88 bool sign = false;
89 switch (*p) {
90 case 'X':
91 case 'x':
92 hexnum = true;
93 break;
94 case 'O':
95 case 'o':
96 octal = true;
97 break;
98 case 'D':
99 case 'd':
100 sign = true;
101 break;
102 case 'P':
103 format = true;
104 M5_FALLTHROUGH;
105 case 'p':
106 hexnum = true;
107 break;
108 }
109
110 switch (*p) {
111 case 'D':
112 case 'd':
113 case 'U':
114 case 'u':
115 case 'X':
116 case 'x':
117 case 'O':
118 case 'o':
119 case 'P':
120 case 'p': {
121 if (hexnum)
122 out << hex;
123
124 if (octal)
125 out << oct;
126
127 if (format) {
128 if (!zero)
129 out.setf(ios::showbase);
130 else {
131 if (hexnum) {
132 out << "0x";
133 width -= 2;
134 } else if (octal) {
135 out << "0";
136 width -= 1;
137 }
138 }
139 }
140
141 if (zero)
142 out.fill('0');
143
144 if (width > 0)
145 out.width(width);
146
147 if (leftjustify && !zero)
148 out.setf(ios::left);
149
150 if (sign) {
151 if (islong)
152 out << (int64_t)args;
153 else
154 out << (int32_t)args;
155 } else {
156 if (islong)
157 out << (uint64_t)args;
158 else
159 out << (uint32_t)args;
160 }
161
162 if (zero)
163 out.fill(' ');
164
165 if (width > 0)
166 out.width(0);
167
168 out << dec;
169
170 ++args;
171 }
172 break;
173
174 case 's': {
175 const char *s = (char *)args;
176 if (!s)
177 s = "<NULL>";
178
179 if (width > 0)
180 out.width(width);
181 if (leftjustify)
182 out.setf(ios::left);
183
184 out << s;
185 ++args;
186 }
187 break;
188 case 'C':
189 case 'c': {
190 uint64_t mask = (*p == 'C') ? 0xffL : 0x7fL;
191 uint64_t num;
192 int cwidth;
193
194 if (islong) {
195 num = (uint64_t)args;
196 cwidth = sizeof(uint64_t);
197 } else {
198 num = (uint32_t)args;
199 cwidth = sizeof(uint32_t);
200 }
201
202 while (cwidth-- > 0) {
203 char c = (char)(num & mask);
204 if (c)
205 out << c;
206 num >>= 8;
207 }
208
209 ++args;
210 }
211 break;
212 case 'b': {
213 uint64_t n = (uint64_t)args++;
214 char *s = (char *)args++;
215 out << s << ": " << n;
216 }
217 break;
218 case 'n':
219 case 'N': {
220 args += 2;
221#if 0
222 uint64_t n = (uint64_t)args++;
223 struct reg_values *rv = (struct reg_values *)args++;
224#endif
225 }
226 break;
227 case 'r':
228 case 'R': {
229 args += 2;
230#if 0
231 uint64_t n = (uint64_t)args++;
232 struct reg_desc *rd = (struct reg_desc *)args++;
233#endif
234 }
235 break;
236 case '%':
237 out << '%';
238 break;
239 }
240 ++p;
241 }
242 break;
243 case '\n':
244 out << endl;
245 ++p;
246 break;
247 case '\r':
248 ++p;
249 if (*p != '\n')
250 out << endl;
251 break;
252
253 default: {
254 size_t len = strcspn(p, "%\n\r\0");
255 out.write(p, len);
256 p += len;
257 }
258 }
259 }
260
261}