One Hat Cyber Team
Your IP :
216.73.216.216
Server IP :
194.44.31.54
Server :
Linux zen.imath.kiev.ua 4.18.0-553.77.1.el8_10.x86_64 #1 SMP Fri Oct 3 14:30:23 UTC 2025 x86_64
Server Software :
Apache/2.4.37 (Rocky Linux) OpenSSL/1.1.1k
PHP Version :
5.6.40
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
usr
/
include
/
llvm
/
ExecutionEngine
/
Orc
/
View File Name :
MemoryMapper.h
//===- MemoryMapper.h - Cross-process memory mapper -------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Cross-process (and in-process) memory mapping and transfer // //===----------------------------------------------------------------------===// #ifndef LLVM_EXECUTIONENGINE_ORC_MEMORYMAPPER_H #define LLVM_EXECUTIONENGINE_ORC_MEMORYMAPPER_H #include "llvm/ExecutionEngine/Orc/Core.h" #include "llvm/ExecutionEngine/Orc/Shared/MemoryFlags.h" #include "llvm/Support/Process.h" #include <mutex> namespace llvm { namespace orc { /// Manages mapping, content transfer and protections for JIT memory class MemoryMapper { public: /// Represents a single allocation containing multiple segments and /// initialization and deinitialization actions struct AllocInfo { struct SegInfo { ExecutorAddrDiff Offset; const char *WorkingMem; size_t ContentSize; size_t ZeroFillSize; AllocGroup AG; }; ExecutorAddr MappingBase; std::vector<SegInfo> Segments; shared::AllocActions Actions; }; using OnReservedFunction = unique_function<void(Expected<ExecutorAddrRange>)>; // Page size of the target process virtual unsigned int getPageSize() = 0; /// Reserves address space in executor process virtual void reserve(size_t NumBytes, OnReservedFunction OnReserved) = 0; /// Provides working memory virtual char *prepare(ExecutorAddr Addr, size_t ContentSize) = 0; using OnInitializedFunction = unique_function<void(Expected<ExecutorAddr>)>; /// Ensures executor memory is synchronized with working copy memory, sends /// functions to be called after initilization and before deinitialization and /// applies memory protections /// Returns a unique address identifying the allocation. This address should /// be passed to deinitialize to run deallocation actions (and reset /// permissions where possible). virtual void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) = 0; using OnDeinitializedFunction = unique_function<void(Error)>; /// Runs previously specified deinitialization actions /// Executor addresses returned by initialize should be passed virtual void deinitialize(ArrayRef<ExecutorAddr> Allocations, OnDeinitializedFunction OnDeInitialized) = 0; using OnReleasedFunction = unique_function<void(Error)>; /// Release address space acquired through reserve() virtual void release(ArrayRef<ExecutorAddr> Reservations, OnReleasedFunction OnRelease) = 0; virtual ~MemoryMapper(); }; class InProcessMemoryMapper : public MemoryMapper { public: InProcessMemoryMapper(size_t PageSize); static Expected<std::unique_ptr<InProcessMemoryMapper>> Create(); unsigned int getPageSize() override { return PageSize; } void reserve(size_t NumBytes, OnReservedFunction OnReserved) override; void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override; char *prepare(ExecutorAddr Addr, size_t ContentSize) override; void deinitialize(ArrayRef<ExecutorAddr> Allocations, OnDeinitializedFunction OnDeInitialized) override; void release(ArrayRef<ExecutorAddr> Reservations, OnReleasedFunction OnRelease) override; ~InProcessMemoryMapper() override; private: struct Allocation { size_t Size; std::vector<shared::WrapperFunctionCall> DeinitializationActions; }; using AllocationMap = DenseMap<ExecutorAddr, Allocation>; struct Reservation { size_t Size; std::vector<ExecutorAddr> Allocations; }; using ReservationMap = DenseMap<void *, Reservation>; std::mutex Mutex; ReservationMap Reservations; AllocationMap Allocations; size_t PageSize; }; class SharedMemoryMapper final : public MemoryMapper { public: struct SymbolAddrs { ExecutorAddr Instance; ExecutorAddr Reserve; ExecutorAddr Initialize; ExecutorAddr Deinitialize; ExecutorAddr Release; }; SharedMemoryMapper(ExecutorProcessControl &EPC, SymbolAddrs SAs, size_t PageSize); static Expected<std::unique_ptr<SharedMemoryMapper>> Create(ExecutorProcessControl &EPC, SymbolAddrs SAs); unsigned int getPageSize() override { return PageSize; } void reserve(size_t NumBytes, OnReservedFunction OnReserved) override; char *prepare(ExecutorAddr Addr, size_t ContentSize) override; void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override; void deinitialize(ArrayRef<ExecutorAddr> Allocations, OnDeinitializedFunction OnDeInitialized) override; void release(ArrayRef<ExecutorAddr> Reservations, OnReleasedFunction OnRelease) override; ~SharedMemoryMapper() override; private: struct Reservation { void *LocalAddr; size_t Size; }; ExecutorProcessControl &EPC; SymbolAddrs SAs; std::mutex Mutex; std::map<ExecutorAddr, Reservation> Reservations; size_t PageSize; }; } // namespace orc } // end namespace llvm #endif // LLVM_EXECUTIONENGINE_ORC_MEMORYMAPPER_H