blob: 91c2e7df5c814adc2a4b2525064287da02ec4083 [file] [log] [blame]
// 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 <stdio.h>
#include <hwreg/internal.h>
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<uint64_t>(num_bits);
uint64_t val = static_cast<uint64_t>((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[%" PRIu32 ":%" PRIu32 "]: 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