// SPDX-License-Identifier: MIT /* $info$ tags: LinuxSyscalls|syscalls-shared $end_info$ */ #pragma once #include #include #include #include struct sock_fprog; struct sock_filter; namespace FEX::HLE { class BPFEmitter final : public ARMEmitter::Emitter { public: struct WorkingBuffer { struct seccomp_data Data; uint32_t ScratchMemory[BPF_MEMWORDS]; // Defined as 16 words. }; BPFEmitter() = default; uint64_t JITFilter(uint32_t flags, const sock_fprog* prog); void* GetFunc() const { return Func; } size_t AllocationSize() const { return FuncSize; } private: template uint64_t HandleLoad(uint32_t BPFIP, const sock_filter* Inst); template uint64_t HandleStore(uint32_t BPFIP, const sock_filter* Inst); template uint64_t HandleALU(uint32_t BPFIP, const sock_filter* Inst); template uint64_t HandleJmp(uint32_t BPFIP, uint32_t NumInst, const sock_filter* Inst); template uint64_t HandleRet(uint32_t BPFIP, const sock_filter* Inst); template uint64_t HandleMisc(uint32_t BPFIP, const sock_filter* Inst); template uint64_t HandleEmission(uint32_t flags, const sock_fprog* prog); fextl::unordered_map JumpLabels; fextl::unordered_map ConstPool; using JumpLabelIterator = decltype(JumpLabels)::iterator; void* Func {}; size_t FuncSize {}; }; } // namespace FEX::HLE