text: // Copyright 2020 The Fuchsia Authors
  //
  // Use of this source code is governed by a MIT-style
  // license that can be found in the LICENSE file or at
  // https://opensource.org/licenses/MIT
  
  #include <stdio.h>
  
  #include <string_view>
  
  #include "test-main.h"
  
  #if defined(__x86_64__) || defined(__i386__)
  #include <lib/arch/x86/boot-cpuid.h>
  #include <lib/arch/x86/feature.h>
  
  #include <hwreg/x86msr.h>
  #endif
  
  const char Symbolize::kProgramName_[] = "hello-world-test";
  
  int TestMain(void*, arch::EarlyTicks) {
    printf("Hello, world!\n\n");
  
  #if defined(__x86_64__) || defined(__i386__)
    arch::BootCpuidIo io;
  
    {
      arch::ProcessorName processor(io);
      std::string_view name = processor.name();
      printf("Processor: %.*s\n", static_cast<int>(name.size()), name.data());
    }
  
    {
      arch::HypervisorName hypervisor(io);
      std::string_view name = hypervisor.name();
      name = name.empty() ? "None" : name;
      printf("Hypervisor: %.*s\n", static_cast<int>(name.size()), name.data());
    }
  
    printf("CPU features:\n");
    constexpr auto print_feature = [](const char* name, auto value, auto high_bit, auto low_bit) {
      if (name && value) {
        printf("\t%s\n", name);
      }
    };
    arch::BootCpuid<arch::CpuidFeatureFlagsC>().ForEachField(print_feature);
    arch::BootCpuid<arch::CpuidFeatureFlagsD>().ForEachField(print_feature);
    arch::BootCpuid<arch::CpuidExtendedFeatureFlagsB>().ForEachField(print_feature);
    // TODO(fxbug.dev/68404): Print when we can afford to.
    // arch::BootCpuid<arch::CpuidAmdFeatureFlagsC>().ForEachField(print_feature);
  
    printf("Extended features enabled:\n");
    hwreg::X86MsrIo msr;
    arch::X86ExtendedFeatureEnableRegisterMsr::Get()  //
        .ReadFrom(&msr)
        .ForEachField(print_feature);
  #endif
  
    return 0;
  }
  