printk.cc revision 1762
19665Sandreas.hansson@arm.com/*
29520SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan
39520SN/A * All rights reserved.
49520SN/A *
59520SN/A * Redistribution and use in source and binary forms, with or without
69520SN/A * modification, are permitted provided that the following conditions are
79520SN/A * met: redistributions of source code must retain the above copyright
89520SN/A * notice, this list of conditions and the following disclaimer;
99520SN/A * redistributions in binary form must reproduce the above copyright
109520SN/A * notice, this list of conditions and the following disclaimer in the
119520SN/A * documentation and/or other materials provided with the distribution;
129520SN/A * neither the name of the copyright holders nor the names of its
139520SN/A * contributors may be used to endorse or promote products derived from
149520SN/A * this software without specific prior written permission.
159520SN/A *
169520SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179520SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189520SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199520SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209520SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219520SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229520SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239520SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249520SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259520SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269520SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279520SN/A */
289520SN/A
299520SN/A#include <sys/types.h>
309520SN/A#include <algorithm>
319520SN/A
329520SN/A#include "base/cprintf.hh"
339520SN/A#include "base/trace.hh"
349520SN/A#include "sim/host.hh"
359520SN/A#include "targetarch/arguments.hh"
369520SN/A#include "targetarch/vtophys.hh"
379665Sandreas.hansson@arm.com#include "kern/linux/printk.hh"
389520SN/A
399520SN/Ausing namespace std;
409520SN/A
419520SN/A
4211183Serfan.azarkhish@unibo.itvoid
439520SN/APrintk(AlphaArguments args)
449520SN/A{
459665Sandreas.hansson@arm.com    char *p = (char *)args++;
469665Sandreas.hansson@arm.com
479665Sandreas.hansson@arm.com    ios::fmtflags saved_flags = DebugOut().flags();
489520SN/A    char old_fill = DebugOut().fill();
499665Sandreas.hansson@arm.com    int old_precision = DebugOut().precision();
509665Sandreas.hansson@arm.com
519520SN/A    while (*p) {
529520SN/A        switch (*p) {
539520SN/A          case '%': {
549520SN/A              bool more = true;
559665Sandreas.hansson@arm.com              bool islong = false;
569665Sandreas.hansson@arm.com              bool leftjustify = false;
579520SN/A              bool format = false;
589520SN/A              bool zero = false;
599520SN/A              int width = 0;
609520SN/A              while (more && *++p) {
6110789Sandreas.hansson@arm.com                  switch (*p) {
629520SN/A                    case 'l':
639520SN/A                    case 'L':
6410789Sandreas.hansson@arm.com                      islong = true;
659665Sandreas.hansson@arm.com                      break;
669520SN/A                    case '-':
679665Sandreas.hansson@arm.com                      leftjustify = true;
689520SN/A                      break;
699520SN/A                    case '#':
709665Sandreas.hansson@arm.com                      format = true;
7110789Sandreas.hansson@arm.com                      break;
729520SN/A                    case '0':
739665Sandreas.hansson@arm.com                      if (width)
749520SN/A                          width *= 10;
759665Sandreas.hansson@arm.com                      else
769520SN/A                          zero = true;
779520SN/A                      break;
789520SN/A                    default:
799520SN/A                      if (*p >= '1' && *p <= '9')
809520SN/A                          width = 10 * width + *p - '0';
819520SN/A                      else
829520SN/A                          more = false;
839520SN/A                      break;
849520SN/A                  }
859665Sandreas.hansson@arm.com              }
869665Sandreas.hansson@arm.com
8710789Sandreas.hansson@arm.com              bool hexnum = false;
889520SN/A              bool octal = false;
899665Sandreas.hansson@arm.com              bool sign = false;
909665Sandreas.hansson@arm.com              switch (*p) {
919665Sandreas.hansson@arm.com                case 'X':
929520SN/A                case 'x':
9310675Sandreas.hansson@arm.com                  hexnum = true;
9410442Snilay@cs.wisc.edu                  break;
9510442Snilay@cs.wisc.edu                case 'O':
9610442Snilay@cs.wisc.edu                case 'o':
9710442Snilay@cs.wisc.edu                  octal = true;
9810442Snilay@cs.wisc.edu                  break;
9910442Snilay@cs.wisc.edu                case 'D':
10010442Snilay@cs.wisc.edu                case 'd':
10110675Sandreas.hansson@arm.com                  sign = true;
10210442Snilay@cs.wisc.edu                  break;
10310677Sandreas.hansson@arm.com                case 'P':
10410677Sandreas.hansson@arm.com                  format = true;
10510677Sandreas.hansson@arm.com                case 'p':
10610677Sandreas.hansson@arm.com                  hexnum = true;
10710677Sandreas.hansson@arm.com                  break;
10810677Sandreas.hansson@arm.com              }
10910677Sandreas.hansson@arm.com
11010442Snilay@cs.wisc.edu              switch (*p) {
11110442Snilay@cs.wisc.edu                case 'D':
11210442Snilay@cs.wisc.edu                case 'd':
11310442Snilay@cs.wisc.edu                case 'U':
11410442Snilay@cs.wisc.edu                case 'u':
11510442Snilay@cs.wisc.edu                case 'X':
11610442Snilay@cs.wisc.edu                case 'x':
11710442Snilay@cs.wisc.edu                case 'O':
11810442Snilay@cs.wisc.edu                case 'o':
11910442Snilay@cs.wisc.edu                case 'P':
12010442Snilay@cs.wisc.edu                case 'p': {
12110442Snilay@cs.wisc.edu                  if (hexnum)
12210442Snilay@cs.wisc.edu                      DebugOut() << hex;
12310442Snilay@cs.wisc.edu
12410442Snilay@cs.wisc.edu                  if (octal)
12510442Snilay@cs.wisc.edu                      DebugOut() << oct;
12610442Snilay@cs.wisc.edu
12710442Snilay@cs.wisc.edu                  if (format) {
12810442Snilay@cs.wisc.edu                      if (!zero)
12910442Snilay@cs.wisc.edu                          DebugOut().setf(ios::showbase);
13010442Snilay@cs.wisc.edu                      else {
13110675Sandreas.hansson@arm.com                          if (hexnum) {
13210442Snilay@cs.wisc.edu                              DebugOut() << "0x";
13310442Snilay@cs.wisc.edu                              width -= 2;
13410442Snilay@cs.wisc.edu                          } else if (octal) {
13510442Snilay@cs.wisc.edu                              DebugOut() << "0";
13610442Snilay@cs.wisc.edu                              width -= 1;
13710675Sandreas.hansson@arm.com                          }
13810677Sandreas.hansson@arm.com                      }
13910677Sandreas.hansson@arm.com                  }
14010442Snilay@cs.wisc.edu
14110442Snilay@cs.wisc.edu                  if (zero)
14210442Snilay@cs.wisc.edu                      DebugOut().fill('0');
14310442Snilay@cs.wisc.edu
1449836Sandreas.hansson@arm.com                  if (width > 0)
1459836Sandreas.hansson@arm.com                      DebugOut().width(width);
1469836Sandreas.hansson@arm.com
1479836Sandreas.hansson@arm.com                  if (leftjustify && !zero)
1489836Sandreas.hansson@arm.com                      DebugOut().setf(ios::left);
1499836Sandreas.hansson@arm.com
1509836Sandreas.hansson@arm.com                  if (sign) {
1519836Sandreas.hansson@arm.com                      if (islong)
1529836Sandreas.hansson@arm.com                          DebugOut() << (int64_t)args;
1539836Sandreas.hansson@arm.com                      else
1549836Sandreas.hansson@arm.com                          DebugOut() << (int32_t)args;
15511183Serfan.azarkhish@unibo.it                  } else {
15611551Sabdul.mutaal@gmail.com                      if (islong)
15711551Sabdul.mutaal@gmail.com                          DebugOut() << (uint64_t)args;
15811551Sabdul.mutaal@gmail.com                      else
15911551Sabdul.mutaal@gmail.com                          DebugOut() << (uint32_t)args;
16011183Serfan.azarkhish@unibo.it                  }
16111183Serfan.azarkhish@unibo.it
16211183Serfan.azarkhish@unibo.it                  if (zero)
16311183Serfan.azarkhish@unibo.it                      DebugOut().fill(' ');
16410993Sjungma@eit.uni-kl.de
16510993Sjungma@eit.uni-kl.de                  if (width > 0)
16611818SChristian.Menard@tu-dresden.de                      DebugOut().width(0);
16710993Sjungma@eit.uni-kl.de
16810993Sjungma@eit.uni-kl.de                  DebugOut() << dec;
16910993Sjungma@eit.uni-kl.de
17010993Sjungma@eit.uni-kl.de                  ++args;
17110993Sjungma@eit.uni-kl.de                }
17210993Sjungma@eit.uni-kl.de                  break;
17310780SCurtis.Dunham@arm.com
17411183Serfan.azarkhish@unibo.it                case 's': {
17510780SCurtis.Dunham@arm.com                    char *s = (char *)args;
17611183Serfan.azarkhish@unibo.it                    if (!s)
17710780SCurtis.Dunham@arm.com                        s = "<NULL>";
17811183Serfan.azarkhish@unibo.it
17910780SCurtis.Dunham@arm.com                    if (width > 0)
18010780SCurtis.Dunham@arm.com                        DebugOut().width(width);
1819836Sandreas.hansson@arm.com                    if (leftjustify)
1829836Sandreas.hansson@arm.com                        DebugOut().setf(ios::left);
1839836Sandreas.hansson@arm.com
1849836Sandreas.hansson@arm.com                    DebugOut() << s;
1859836Sandreas.hansson@arm.com                    ++args;
1869836Sandreas.hansson@arm.com                }
18710442Snilay@cs.wisc.edu                  break;
1889836Sandreas.hansson@arm.com                case 'C':
1899836Sandreas.hansson@arm.com                case 'c': {
1909836Sandreas.hansson@arm.com                    uint64_t mask = (*p == 'C') ? 0xffL : 0x7fL;
19111251Sradhika.jagtap@ARM.com                    uint64_t num;
19211251Sradhika.jagtap@ARM.com                    int width;
19311251Sradhika.jagtap@ARM.com
19411251Sradhika.jagtap@ARM.com                    if (islong) {
19511251Sradhika.jagtap@ARM.com                        num = (uint64_t)args;
19610675Sandreas.hansson@arm.com                        width = sizeof(uint64_t);
19710675Sandreas.hansson@arm.com                    } else {
19810675Sandreas.hansson@arm.com                        num = (uint32_t)args;
19910675Sandreas.hansson@arm.com                        width = sizeof(uint32_t);
20010675Sandreas.hansson@arm.com                    }
20110675Sandreas.hansson@arm.com
2029836Sandreas.hansson@arm.com                    while (width-- > 0) {
2039836Sandreas.hansson@arm.com                        char c = (char)(num & mask);
2049836Sandreas.hansson@arm.com                        if (c)
2059836Sandreas.hansson@arm.com                            DebugOut() << c;
2069836Sandreas.hansson@arm.com                        num >>= 8;
20710620Sandreas.hansson@arm.com                    }
20810675Sandreas.hansson@arm.com
20910620Sandreas.hansson@arm.com                    ++args;
21010620Sandreas.hansson@arm.com                }
21110620Sandreas.hansson@arm.com                  break;
21210620Sandreas.hansson@arm.com                case 'b': {
21310620Sandreas.hansson@arm.com                  uint64_t n = (uint64_t)args++;
21410620Sandreas.hansson@arm.com                  char *s = (char *)args++;
21511251Sradhika.jagtap@ARM.com                  DebugOut() << s << ": " << n;
21611251Sradhika.jagtap@ARM.com                }
21711251Sradhika.jagtap@ARM.com                  break;
21811251Sradhika.jagtap@ARM.com                case 'n':
21911251Sradhika.jagtap@ARM.com                case 'N': {
22010620Sandreas.hansson@arm.com                    args += 2;
2219836Sandreas.hansson@arm.com#if 0
22211183Serfan.azarkhish@unibo.it                    uint64_t n = (uint64_t)args++;
2239836Sandreas.hansson@arm.com                    struct reg_values *rv = (struct reg_values *)args++;
2249836Sandreas.hansson@arm.com#endif
22511183Serfan.azarkhish@unibo.it                }
22611551Sabdul.mutaal@gmail.com                  break;
22711551Sabdul.mutaal@gmail.com                case 'r':
22811551Sabdul.mutaal@gmail.com                case 'R': {
22911551Sabdul.mutaal@gmail.com                    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                  DebugOut() << '%';
238                  break;
239              }
240              ++p;
241          }
242            break;
243          case '\n':
244            DebugOut() << endl;
245            ++p;
246            break;
247          case '\r':
248            ++p;
249            if (*p != '\n')
250                DebugOut() << endl;
251            break;
252
253          default: {
254              size_t len = strcspn(p, "%\n\r\0");
255              DebugOut().write(p, len);
256              p += len;
257          }
258        }
259    }
260
261    DebugOut().flags(saved_flags);
262    DebugOut().fill(old_fill);
263    DebugOut().precision(old_precision);
264}
265
266