// 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 <inttypes.h>
#include <lib/smbios/smbios.h>
#include <stdio.h>
#include <string.h>
#include <zircon/compiler.h>
#include <zircon/types.h>

#include <algorithm>
#include <iterator>

#include <fbl/algorithm.h>

namespace {

uint8_t ComputeChecksum(const uint8_t* data, size_t len) {
  unsigned int sum = 0;
  for (size_t i = 0; i < len; ++i) {
    sum += data[i];
  }
  return static_cast<uint8_t>(sum);
}

}  // namespace

namespace smbios {

StringTable::StringTable() {}
StringTable::~StringTable() {}

zx_status_t StringTable::Init(const Header* h, size_t max_struct_len) {
  if (h->length > max_struct_len) {
    return ZX_ERR_IO_DATA_INTEGRITY;
  }

  size_t max_string_table_len = max_struct_len - h->length;
  start_ = reinterpret_cast<const char*>(h) + h->length;

  // Make sure the table is big enough to include the two trailing NULs
  if (max_string_table_len < 2) {
    return ZX_ERR_IO_DATA_INTEGRITY;
  }

  // Check if the string table is empty
  if (start_[0] == 0 && start_[1] == 0) {
    length_ = 2;
    return ZX_OK;
  }

  size_t start_idx = 0;
  if (start_[0] == 0) {
    // We know that this isn't the end of the table, since the next byte
    // isn't NUL.  Skip examining this leading zero-length string in the
    // loop below, so that we can simplify the iteration.  During the
    // iteration below, we have the invariant that either
    // 1) i points to the start of the first string in the table and that
    // string is not 0-length
    // 2) i points to a subsequent string in the table, so a zero-length
    // string implies two consecutive NULs were found (the end of table
    // marker).
    start_idx = 1;
  }

  for (size_t i = start_idx; i < max_string_table_len;) {
    size_t len = strnlen(start_ + i, max_string_table_len - i);

    if (len == 0) {
      length_ = i + 1;  // Include the trailing null
      return ZX_OK;
    }

    // strnlen returns the length not including the NUL.  Note that if
    // no NUL was found, it returns max_string_table_len - i, which will exceed
    // the loop conditions.
    i += len + 1;
  }
  return ZX_ERR_IO_DATA_INTEGRITY;
}

zx_status_t StringTable::GetString(size_t idx, const char** out) const {
  if (idx == 0) {
    *out = "<null>";
    return ZX_OK;
  }
  *out = "<missing string>";

  for (size_t i = 0; i < length_;) {
    size_t len = strnlen(start_ + i, length_ - i);

    if (len == 0) {
      if (i != 0) {
        return ZX_ERR_NOT_FOUND;
      }

      if (length_ - i < 2) {
        return ZX_ERR_IO_DATA_INTEGRITY;
      }
      if (start_[i + 1] == 0) {
        return ZX_ERR_NOT_FOUND;
      }
    }
    if (idx == 1) {
      *out = start_ + i;
      return ZX_OK;
    }
    idx--;
    i += len + 1;
  }
  ZX_DEBUG_ASSERT(false);
  // Should not be reachable, since Init should have checked
  return ZX_ERR_IO_DATA_INTEGRITY;
}

void StringTable::Dump() const {
  const char* str;
  for (size_t i = 1; GetString(i, &str) == ZX_OK; ++i) {
    printf("  str %zu: %s\n", i, str);
  }
}

bool EntryPoint2_1::IsValid() const {
  if (memcmp(anchor_string, SMBIOS2_ANCHOR, std::size(anchor_string))) {
    printf("smbios: bad anchor %4s\n", anchor_string);
    return false;
  }

  uint8_t real_length = length;
  if (length != 0x1f) {
    // 0x1e is allowed due to errata in the SMBIOS 2.1 spec.  It really means
    // 0x1f.
    if (length == 0x1e) {
      real_length = 0x1f;
    } else {
      printf("smbios: bad len: %u\n", real_length);
      return false;
    }
  }

  if (ComputeChecksum(reinterpret_cast<const uint8_t*>(this), real_length) != 0) {
    printf("smbios: bad checksum\n");
    return false;
  }
  if (ep_rev != 0) {
    printf("smbios: bad version %u\n", ep_rev);
    return false;
  }

  if (memcmp(intermediate_anchor_string, SMBIOS2_INTERMEDIATE_ANCHOR,
             std::size(intermediate_anchor_string))) {
    printf("smbios: bad intermediate anchor %5s\n", intermediate_anchor_string);
    return false;
  }
  if (ComputeChecksum(reinterpret_cast<const uint8_t*>(&intermediate_anchor_string),
                      real_length - offsetof(EntryPoint2_1, intermediate_anchor_string)) != 0) {
    printf("smbios: bad intermediate checksum\n");
    return false;
  }

  if ((uint32_t)(struct_table_phys + struct_table_length) < struct_table_phys) {
    return false;
  }

  return true;
}

void EntryPoint2_1::Dump() const {
  printf("SMBIOS EntryPoint v2.1:\n");
  printf("  specification version: %u.%u\n", major_ver, minor_ver);
  printf("  max struct size: %u\n", max_struct_size);
  printf("  struct table: %u bytes @0x%08x, %u entries\n", struct_table_length, struct_table_phys,
         struct_count);
}

bool SpecVersion::IncludesVersion(uint8_t spec_major_ver, uint8_t spec_minor_ver) const {
  if (major_ver > spec_major_ver) {
    return true;
  }
  if (major_ver < spec_major_ver) {
    return false;
  }
  return minor_ver >= spec_minor_ver;
}

void BiosInformationStruct2_0::Dump(const StringTable& st) const {
  printf("SMBIOS BIOS Information Struct v2.0:\n");
  printf("  vendor: %s\n", st.GetString(vendor_str_idx));
  printf("  BIOS version: %s\n", st.GetString(bios_version_str_idx));
  printf("  BIOS starting address segment: 0x%04x\n", bios_starting_address_segment);
  printf("  BIOS release date: %s\n", st.GetString(bios_release_date_str_idx));
  printf("  BIOS ROM size: 0x%02x\n", bios_rom_size);
  printf("  BIOS characteristics: 0x%016" PRIx64 "\n", bios_characteristics);
  for (size_t i = sizeof(*this); i < hdr.length; ++i) {
    printf("  BIOS characteristics extended: 0x%02x\n", bios_characteristics_ext[i]);
  }
}

void BiosInformationStruct2_4::Dump(const StringTable& st) const {
  printf("SMBIOS BIOS Information Struct v2.4:\n");
  printf("  vendor: %s\n", st.GetString(vendor_str_idx));
  printf("  BIOS version: %s\n", st.GetString(bios_version_str_idx));
  printf("  BIOS starting address segment: 0x%04x\n", bios_starting_address_segment);
  printf("  BIOS release date: %s\n", st.GetString(bios_release_date_str_idx));
  printf("  BIOS ROM size: 0x%02x\n", bios_rom_size);
  printf("  BIOS characteristics: 0x%016" PRIx64 "\n", bios_characteristics);
  printf("  BIOS characteristics extended: 0x%04x\n", bios_characteristics_ext);
  printf("  BIOS version number: %u.%u\n", bios_major_release, bios_minor_release);
  printf("  EC version number: %u.%u\n", ec_major_release, ec_minor_release);
  if (hdr.length > sizeof(*this)) {
    printf("  %zu bytes of unknown trailing contents\n", hdr.length - sizeof(*this));
  }
}

void SystemInformationStruct2_0::Dump(const StringTable& st) const {
  printf("SMBIOS System Information Struct v2.0:\n");
  printf("  manufacturer: %s\n", st.GetString(manufacturer_str_idx));
  printf("  product: %s\n", st.GetString(product_name_str_idx));
  printf("  version: %s\n", st.GetString(version_str_idx));
  if (hdr.length > sizeof(*this)) {
    printf("  %zu bytes of unknown trailing contents\n", hdr.length - sizeof(*this));
  }
}

void SystemInformationStruct2_1::Dump(const StringTable& st) const {
  printf("SMBIOS System Information Struct v2.1:\n");
  printf("  manufacturer: %s\n", st.GetString(manufacturer_str_idx));
  printf("  product: %s\n", st.GetString(product_name_str_idx));
  printf("  version: %s\n", st.GetString(version_str_idx));
  printf("  wakeup_type: 0x%x\n", wakeup_type);
  if (hdr.length > sizeof(*this)) {
    printf("  %zu bytes of unknown trailing contents\n", hdr.length - sizeof(*this));
  }
}

void SystemInformationStruct2_4::Dump(const StringTable& st) const {
  printf("SMBIOS System Information Struct v2.4:\n");
  printf("  manufacturer: %s\n", st.GetString(manufacturer_str_idx));
  printf("  product: %s\n", st.GetString(product_name_str_idx));
  printf("  version: %s\n", st.GetString(version_str_idx));
  printf("  wakeup_type: 0x%x\n", wakeup_type);
  printf("  SKU: %s\n", st.GetString(sku_number_str_idx));
  printf("  family: %s\n", st.GetString(family_str_idx));
  if (hdr.length > sizeof(*this)) {
    printf("  %zu bytes of unknown trailing contents\n", hdr.length - sizeof(*this));
  }
}

#ifndef _KERNEL
void BaseboardInformationStruct::Dump(const StringTable& st) const {
  printf("SMBIOS Baseboard Information Struct:\n");
  printf("  manufacturer: %s\n", st.GetString(manufacturer_str_idx));
  printf("  product: %s\n", st.GetString(product_name_str_idx));
  printf("  version: %s\n", st.GetString(version_str_idx));
  printf("  feature flags (%spresent): 0x%02x\n", feature_flags().has_value() ? "" : "not ",
         feature_flags().value_or(0));
  printf("  location: %s\n", st.GetString(location_in_chassis_str_idx().value_or(0)));
  printf("  board_type (%spresent): 0x%02x\n", board_type().has_value() ? "" : "not ",
         board_type().value_or(0));
}
#endif

zx_status_t EntryPoint2_1::WalkStructs(uintptr_t struct_table_virt, StructWalkCallback cb) const {
  size_t idx = 0;
  uintptr_t curr_addr = struct_table_virt;
  const uintptr_t table_end = curr_addr + struct_table_length;
  while (curr_addr + sizeof(Header) < table_end) {
    auto hdr = reinterpret_cast<const Header*>(curr_addr);
    if (curr_addr + hdr->length > table_end) {
      return ZX_ERR_IO_DATA_INTEGRITY;
    }
    StringTable st;
    zx_status_t status =
        st.Init(hdr, std::max(table_end - curr_addr, static_cast<size_t>(max_struct_size)));
    if (status != ZX_OK) {
      return status;
    }

    status = cb(version(), hdr, st);
    if (status == ZX_ERR_STOP) {
      return ZX_OK;
    } else if (status != ZX_OK && status != ZX_ERR_NEXT) {
      return status;
    }
    idx++;

    if (idx == struct_count) {
      return ZX_OK;
    }

    // Skip over the embedded strings
    curr_addr += hdr->length + st.length();
  }

  return ZX_ERR_IO_DATA_INTEGRITY;
}

}  // namespace smbios
