// Copyright 2017 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include namespace hwreg { namespace internal { void FieldPrinter::Print(uint64_t value, char* buf, size_t len) const { unsigned num_bits = bit_high_incl_ - bit_low_ + 1; uint64_t mask = internal::ComputeMask(num_bits); uint64_t val = static_cast((value >> bit_low_) & mask); #ifdef _KERNEL // The kernel does not support the * directive in printf, so we lose out on // the length-matching padding. snprintf(buf, len, "%s[%u:%u]: 0x%" PRIx64 " (%" PRIu64 ")", name_, bit_high_incl_, bit_low_, val, val); #else int pad_len = (num_bits + 3) / 4; snprintf(buf, len, "%s[%u:%u]: 0x%0*" PRIx64 " (%" PRIu64 ")", name_, bit_high_incl_, bit_low_, pad_len, val, val); #endif // _KERNEL buf[len - 1] = 0; } void PrintRegisterPrintf(FieldPrinter fields[], size_t num_fields, uint64_t reg_value, uint64_t fields_mask, int register_width_bytes) { PrintRegister([](const char* arg) { printf("%s\n", arg); }, fields, num_fields, reg_value, fields_mask, register_width_bytes); } } // namespace internal } // namespace hwreg