gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
printk.cc
Go to the documentation of this file.
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 
42 using namespace std;
43 
44 
45 void
46 Printk(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;
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  }
222  break;
223  case 'r':
224  case 'R': {
225  args += 2;
226  }
227  break;
228  case '%':
229  out << '%';
230  break;
231  }
232  ++p;
233  }
234  break;
235  case '\n':
236  out << endl;
237  ++p;
238  break;
239  case '\r':
240  ++p;
241  if (*p != '\n')
242  out << endl;
243  break;
244 
245  default: {
246  size_t len = strcspn(p, "%\n\r\0");
247  out.write(p, len);
248  p += len;
249  }
250  }
251  }
252 
253 }
Overload hash function for BasicBlockRange type.
Definition: vec_reg.hh:586
Bitfield< 31 > n
Bitfield< 4 > s
#define M5_FALLTHROUGH
Definition: compiler.hh:86
Bitfield< 18, 16 > len
Bitfield< 29 > c
Bitfield< 31, 29 > format
void Printk(stringstream &out, Arguments args)
Definition: printk.cc:46
Bitfield< 4 > width
Bitfield< 3, 0 > mask
Definition: types.hh:64
Bitfield< 0 > p

Generated on Fri Feb 28 2020 16:27:01 for gem5 by doxygen 1.8.13