| // 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), |
| }; |
| } |