1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ECMASCRIPT_PLATFORM_MAP_H 17 #define ECMASCRIPT_PLATFORM_MAP_H 18 19 #include <cstddef> 20 21 #include "ecmascript/common.h" 22 23 namespace panda::ecmascript { 24 class MemMap { 25 public: MemMap()26 MemMap() : originAddr_(nullptr), mem_(nullptr), size_(0) {} MemMap(void * mem,size_t size)27 MemMap(void *mem, size_t size) : originAddr_(mem), mem_(mem), size_(size) {}; MemMap(void * originAddr,void * mem,size_t size)28 MemMap(void *originAddr, void *mem, size_t size) : originAddr_(originAddr), mem_(mem), size_(size) {}; 29 ~MemMap() = default; 30 Reset()31 void Reset() 32 { 33 originAddr_ = nullptr; 34 mem_ = nullptr; 35 size_ = 0; 36 } 37 GetMem()38 inline void *GetMem() const 39 { 40 return mem_; 41 } 42 GetSize()43 inline size_t GetSize() const 44 { 45 return size_; 46 } 47 GetOriginAddr()48 inline void *GetOriginAddr() const 49 { 50 return originAddr_; 51 } 52 private: 53 void *originAddr_ {nullptr}; 54 void *mem_ {nullptr}; 55 size_t size_ {0}; 56 }; 57 58 enum class PageTagType : uint8_t { 59 HEAP, 60 MACHINE_CODE, 61 MEMPOOL_CACHE, 62 }; 63 64 #ifdef PANDA_TARGET_WINDOWS 65 #define PAGE_PROT_NONE 0x01 66 #define PAGE_PROT_READ 0x02 67 #define PAGE_PROT_READWRITE 0x04 68 #define PAGE_PROT_EXEC_READ 0x20 69 #define PAGE_PROT_EXEC_READWRITE 0x40 70 #else 71 #define PAGE_PROT_NONE 0 72 #define PAGE_PROT_READ 1 73 #define PAGE_PROT_READWRITE 3 74 #define PAGE_PROT_EXEC_READ 5 75 #define PAGE_PROT_EXEC_READWRITE 7 76 #endif 77 78 MemMap PUBLIC_API PageMap(size_t size, int prot = PAGE_PROT_NONE, size_t alignment = 0); 79 void PUBLIC_API PageUnmap(MemMap it); 80 MemMap PUBLIC_API MachineCodePageMap(size_t size, int prot = PAGE_PROT_NONE, size_t alignment = 0); 81 void PUBLIC_API MachineCodePageUnmap(MemMap it); 82 void PageRelease(void *mem, size_t size); 83 void PagePreRead(void *mem, size_t size); 84 void PageTag(void *mem, size_t size, PageTagType type); 85 void PageClearTag(void *mem, size_t size); 86 const char *GetPageTagString(PageTagType type); 87 void PageProtect(void *mem, size_t size, int prot); 88 size_t PageSize(); 89 } // namespace panda::ecmascript 90 #endif // ECMASCRIPT_PLATFORM_MAP_H 91