blob: 0e9ff6cf0dd35e9c8749ee1af00ba5d3711a0af8 [file]
// Copyright 2026 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 <zircon/compiler.h>
#include <ktl/algorithm.h>
#include <ktl/span.h>
#include <ktl/string_view.h>
#include <phys/linuxboot-embed.h>
#include <pretty/hexdump.h>
#include "test-main.h"
namespace {
constexpr ktl::string_view kExpectedImage =
"Hello, world!\n\0\0" // two padding bytes to be a multiple of 4
"Lorem ipsum\n"sv;
constexpr size_t kMaxBytes = 64;
static_assert(kMaxBytes > kExpectedImage.size());
} // namespace
extern "C" __LOCAL uint64_t __executable_start[]; // NOLINT(bugprone-reserved-identifier)
int TestMain(void* bootloader_data, ktl::optional<EarlyBootZbi> zbi, arch::EarlyTicks) {
MainSymbolize symbolize("linuxboot-embed-hello-world-test");
const size_t link_size = GetLinuxbootLinkMemorySize();
const size_t header_size = GetLinuxbootHeaderMemorySize();
printf("%s: link size %#zx vs header size %#zx\n", symbolize.name(), link_size, header_size);
hexdump(__executable_start, kMaxBytes);
ktl::span image = GetLinuxbootEmbeddedImage();
printf("%s: embedded image of %#zx bytes at %p\n", symbolize.name(), image.size_bytes(),
image.data());
// Cap it at a reasonable size before dumping.
image = image.subspan(0, ktl::min(image.size_bytes(), kMaxBytes));
hexdump(image.data(), image.size_bytes());
ktl::string_view image_str{
reinterpret_cast<const char*>(image.data()),
image.size_bytes(),
};
printf("%s: image string of %#zx bytes at %p\n", symbolize.name(), //
image_str.size(), image_str.data());
printf("%s: reference string of %#zx bytes at %p\n", symbolize.name(), //
kExpectedImage.size(), kExpectedImage.data());
hexdump8(kExpectedImage.data(), kExpectedImage.size());
return image_str == kExpectedImage ? 0 : 1;
}