gem5  v21.1.0.2
helpers.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 #include "kern/linux/helpers.hh"
39 
40 #include "base/compiler.hh"
41 #include "cpu/thread_context.hh"
42 #include "mem/port_proxy.hh"
43 #include "sim/byteswap.hh"
44 #include "sim/system.hh"
45 
46 namespace gem5
47 {
48 
49 struct GEM5_PACKED DmesgEntry
50 {
51  uint64_t ts_nsec;
52  uint16_t len;
53  uint16_t text_len;
54  uint16_t dict_len;
55  uint8_t facility;
56  uint8_t flags;
57 };
58 
59 static int
60 dumpDmesgEntry(const uint8_t *base, const uint8_t *end, const ByteOrder bo,
61  std::ostream &os)
62 {
63  const size_t max_length = end - base;
64  DmesgEntry de;
65 
66  if (max_length < sizeof(de)) {
67  warn("Malformed dmesg entry\n");
68  return -1;
69  }
70 
71  memcpy(&de, base, sizeof(de));
72  de.ts_nsec = gtoh(de.ts_nsec, bo);
73  de.len = gtoh(de.len, bo);
74  de.text_len = gtoh(de.text_len, bo);
75 
76  if (de.len < sizeof(de) ||
77  max_length < de.len ||
78  max_length < sizeof(DmesgEntry) + de.text_len) {
79 
80  warn("Malformed dmesg entry:\n");
81  warn("\tMax length: %i\n", max_length);
82  warn("\tde.len: %i\n", de.len);
83  warn("\tde.text_len: %i\n", de.text_len);
84  return -1;
85  }
86 
87  ccprintf(os, "[%.6f] ", de.ts_nsec * 10e-9);
88  os.write((char *)base + sizeof(de), de.text_len);
89  os << std::endl;
90 
91  return de.len;
92 }
93 
94 void
95 linux::dumpDmesg(ThreadContext *tc, std::ostream &os)
96 {
97  System *system = tc->getSystemPtr();
98  const ByteOrder bo = system->getGuestByteOrder();
99  const auto &symtab = system->workload->symtab(tc);
100  PortProxy &proxy = tc->getVirtProxy();
101 
102  auto lb = symtab.find("__log_buf");
103  auto lb_len = symtab.find("log_buf_len");
104  auto first = symtab.find("log_first_idx");
105  auto next = symtab.find("log_next_idx");
106 
107  auto end_it = symtab.end();
108 
109  if (lb == end_it || lb_len == end_it ||
110  first == end_it || next == end_it) {
111  warn("Failed to find kernel dmesg symbols.\n");
112  return;
113  }
114 
115  uint32_t log_buf_len = proxy.read<uint32_t>(lb_len->address, bo);
116  uint32_t log_first_idx = proxy.read<uint32_t>(first->address, bo);
117  uint32_t log_next_idx = proxy.read<uint32_t>(next->address, bo);
118 
119  if (log_first_idx >= log_buf_len || log_next_idx >= log_buf_len) {
120  warn("dmesg pointers/length corrupted\n");
121  return;
122  }
123 
124  // Normalize and read the dmesg ring buffer
125  std::vector<uint8_t> log_buf(log_buf_len);
126  int length;
127  if (log_first_idx < log_next_idx) {
128  length = log_next_idx - log_first_idx;
129  if (length < 0 || length > log_buf.size()) {
130  warn("Unexpected dmesg buffer length\n");
131  return;
132  }
133  proxy.readBlob(lb->address + log_first_idx, log_buf.data(), length);
134  } else {
135  const int length_2 = log_buf_len - log_first_idx;
136  if (length_2 < 0 || length_2 + log_next_idx > log_buf.size()) {
137  warn("Unexpected dmesg buffer length\n");
138  return;
139  }
140  length = log_buf_len;
141  proxy.readBlob(lb->address + log_first_idx, log_buf.data(), length_2);
142  proxy.readBlob(lb->address, log_buf.data() + length_2, log_next_idx);
143  }
144 
145  // Print dmesg buffer content
146  const uint8_t *cur = log_buf.data(), *end = log_buf.data() + length;
147  while (cur < end) {
148  int ret = dumpDmesgEntry(cur, end, bo, os);
149  if (ret < 0)
150  return;
151  cur += ret;
152  }
153 }
154 
155 } // namespace gem5
gem5::ThreadContext::getSystemPtr
virtual System * getSystemPtr()=0
warn
#define warn(...)
Definition: logging.hh:245
gem5::DmesgEntry::text_len
uint16_t text_len
Definition: helpers.cc:53
system.hh
gem5::DmesgEntry::len
uint16_t len
Definition: helpers.cc:52
gem5::ArmISA::e
Bitfield< 9 > e
Definition: misc_types.hh:64
helpers.hh
gem5::X86ISA::system
Bitfield< 15 > system
Definition: misc.hh:1003
std::vector< uint8_t >
gem5::X86ISA::base
Bitfield< 51, 12 > base
Definition: pagetable.hh:141
gem5::ccprintf
void ccprintf(cp::Print &print)
Definition: cprintf.hh:130
gem5::DmesgEntry
Definition: helpers.cc:49
gem5::dumpDmesgEntry
static int dumpDmesgEntry(const uint8_t *base, const uint8_t *end, const ByteOrder bo, std::ostream &os)
Definition: helpers.cc:60
gem5::X86ISA::de
Bitfield< 3 > de
Definition: misc.hh:641
gem5::System
Definition: system.hh:77
gem5::ThreadContext
ThreadContext is the external interface to all thread state for anything outside of the CPU.
Definition: thread_context.hh:93
gem5::ThreadContext::getVirtProxy
virtual PortProxy & getVirtProxy()=0
gem5::PowerISA::bo
Bitfield< 25, 21 > bo
Definition: types.hh:82
gem5::DmesgEntry::dict_len
uint16_t dict_len
Definition: helpers.cc:54
gem5::PortProxy::read
T read(Addr address) const
Read sizeof(T) bytes from address and return as object T.
Definition: port_proxy.hh:287
port_proxy.hh
gem5::gtoh
T gtoh(T value, ByteOrder guest_byte_order)
Definition: byteswap.hh:194
gem5::PortProxy
This object is a proxy for a port or other object which implements the functional response protocol,...
Definition: port_proxy.hh:86
compiler.hh
gem5::PortProxy::readBlob
void readBlob(Addr addr, void *p, int size) const
Higher level interfaces based on the above.
Definition: port_proxy.hh:182
gem5::DmesgEntry::ts_nsec
uint64_t ts_nsec
Definition: helpers.cc:51
gem5::linux::dumpDmesg
void dumpDmesg(ThreadContext *tc, std::ostream &os)
Dump Linux's dmesg log buffer to the an output stream.
Definition: helpers.cc:95
gem5::DmesgEntry::facility
uint8_t facility
Definition: helpers.cc:55
gem5::X86ISA::os
Bitfield< 17 > os
Definition: misc.hh:809
gem5::DmesgEntry::flags
uint8_t flags
Definition: helpers.cc:56
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: decoder.cc:40
thread_context.hh
byteswap.hh

Generated on Tue Sep 21 2021 12:25:25 for gem5 by doxygen 1.8.17