blob: 45f9a64c7b41133f787218541201f43296f34bd2 [file] [log] [blame]
// Copyright 2022 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 "src/devices/board/tests/acpi-host-tests/table.h"
namespace acpi {
uint8_t ChecksumTable(void* data, size_t length) {
uint8_t* array = static_cast<uint8_t*>(data);
uint8_t total = 0;
for (size_t i = 0; i < length; i++) {
total += array[i];
}
// Invert because the checksum value should make (total + checksum == 0) hold.
return -total;
}
std::vector<uint8_t> AcpiXsdt::EncodeXsdt(std::vector<uint64_t> entries) {
this->length = static_cast<uint32_t>(sizeof(*this) + entries.size() * sizeof(uint64_t));
std::vector<uint8_t> ret(this->length);
this->checksum = 0;
uint8_t sum_header = -ChecksumTable(this, sizeof(*this));
uint8_t sum_entries = -ChecksumTable(entries.data(), sizeof(uint64_t) * entries.size());
sum_header += sum_entries;
this->checksum = -sum_header;
memcpy(ret.data(), this, sizeof(*this));
memcpy(ret.data() + sizeof(*this), entries.data(), entries.size() * sizeof(uint64_t));
return ret;
}
} // namespace acpi