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