blob: c32dac6231f91902c9bfc5c2fe171e7d036e6d04 [file] [log] [blame]
// Copyright 2021 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 <lib/llvm-profdata/llvm-profdata.h>
#include <zircon/assert.h>
#include <ktl/byte.h>
#include <ktl/move.h>
#include <ktl/span.h>
#include <object/vm_object_dispatcher.h>
#include <phys/handoff.h>
#include <vm/vm_object_paged.h>
#include "private.h"
#include <ktl/enforce.h>
namespace {
constexpr ktl::string_view kSymbolizerName = "data/phys/symbolizer.log";
constexpr ktl::string_view kLlvmProfdataName = "data/phys/physboot.profraw";
Handle* MakePhysVmo(ktl::span<const ktl::byte> dump, ktl::string_view vmo_name) {
if (dump.empty()) {
return nullptr;
}
// Create a VMO to hold the whole dump.
fbl::RefPtr<VmObjectPaged> vmo;
zx_status_t status = VmObjectPaged::Create(PMM_ALLOC_FLAG_ANY, 0, dump.size_bytes(), &vmo);
ZX_ASSERT(status == ZX_OK);
status = vmo->Write(dump.data(), 0, dump.size_bytes());
ZX_ASSERT(status == ZX_OK);
zx_rights_t rights;
KernelHandle<VmObjectDispatcher> handle;
status =
VmObjectDispatcher::Create(ktl::move(vmo), dump.size_bytes(),
VmObjectDispatcher::InitialMutability::kMutable, &handle, &rights);
ZX_ASSERT(status == ZX_OK);
handle.dispatcher()->set_name(vmo_name.data(), vmo_name.size());
return Handle::Make(ktl::move(handle), rights & ~ZX_RIGHT_WRITE).release();
}
} // namespace
InstrumentationDataVmo PhysSymbolizerVmo() {
ktl::string_view log = gPhysHandoff->instrumentation.symbolizer_log.get();
ktl::span log_bytes = ktl::as_bytes(ktl::span(log.data(), log.size()));
return {.handle = MakePhysVmo(log_bytes, kSymbolizerName)};
}
InstrumentationDataVmo PhysLlvmProfdataVmo() {
ktl::span profdata_bytes = gPhysHandoff->instrumentation.llvm_profdata.get();
return {
.announce = LlvmProfdata::kAnnounce,
.sink_name = LlvmProfdata::kDataSinkName,
.handle = MakePhysVmo(profdata_bytes, kLlvmProfdataName),
};
}