1 /* 2 * Copyright (c) 2024 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_JSPANDAFILE_ABC_BUFFER_CACHE_H 17 #define ECMASCRIPT_JSPANDAFILE_ABC_BUFFER_CACHE_H 18 19 #include <string> 20 #include "ecmascript/ecma_vm.h" 21 #include "ecmascript/js_thread.h" 22 23 namespace panda::ecmascript { 24 25 enum AbcBufferType { NORMAL_BUFFER, SECURE_BUFFER }; 26 struct AbcBufferInfo { 27 void *buffer_ ; 28 size_t size_; 29 AbcBufferType bufferType_; 30 AbcBufferInfoAbcBufferInfo31 AbcBufferInfo(void *buffer, size_t size, AbcBufferType bufferType) 32 : buffer_(buffer), size_(size), bufferType_(bufferType) {} AbcBufferInfoAbcBufferInfo33 AbcBufferInfo() 34 : buffer_(nullptr), size_(0), bufferType_(AbcBufferType::NORMAL_BUFFER) {} 35 }; 36 37 /* 38 * If JSPandafileManager's loadedJSPandaFiles_ delete cache during sharedgc process, 39 * buffer cannot get in later module LoadJsPandafile process, which will cause crash. 40 * This map can help use buffer to get *pf again. 41 */ 42 class AbcBufferCache { 43 public: 44 AbcBufferCache() = default; ~AbcBufferCache()45 ~AbcBufferCache() 46 { 47 abcBufferMap_.clear(); 48 } 49 AddAbcBufferToCache(const CString & fileName,const void * buffer,size_t size,AbcBufferType bufferType)50 void AddAbcBufferToCache(const CString &fileName, const void *buffer, size_t size, AbcBufferType bufferType) 51 { 52 abcBufferMap_.emplace(fileName, AbcBufferInfo(const_cast<void *>(buffer), size, bufferType)); 53 } 54 DeleteAbcBufferFromCache(const CString & fileName)55 void DeleteAbcBufferFromCache(const CString &fileName) 56 { 57 auto iter = abcBufferMap_.find(fileName); 58 if (iter == abcBufferMap_.end()) { 59 return; 60 } 61 abcBufferMap_.erase(iter); 62 } 63 FindJSPandaFileInAbcBufferCache(const CString & fileName)64 AbcBufferInfo FindJSPandaFileInAbcBufferCache(const CString &fileName) const 65 { 66 auto iter = abcBufferMap_.find(fileName); 67 if (iter == abcBufferMap_.end()) { 68 return AbcBufferInfo(); 69 } 70 return iter->second; 71 } 72 73 private: 74 std::unordered_map<CString, AbcBufferInfo> abcBufferMap_; 75 }; 76 77 class AbcBufferCacheScope { 78 public: AbcBufferCacheScope(JSThread * thread,const CString & filename,const void * buffer,size_t size,AbcBufferType bufferType)79 AbcBufferCacheScope(JSThread *thread, const CString &filename, const void *buffer, 80 size_t size, AbcBufferType bufferType): filename_(filename) 81 { 82 abcBufferCache_ = thread->GetEcmaVM()->GetAbcBufferCache(); 83 ASSERT(abcBufferCache_ != nullptr); 84 abcBufferCache_->AddAbcBufferToCache(filename_, buffer, size, bufferType); 85 } 86 AbcBufferCacheScope(JSThread * thread,const CString & filename,const void * buffer,size_t size,JSPandaFile * jsPandaFile,void * fileMapper)87 AbcBufferCacheScope(JSThread *thread, const CString &filename, const void *buffer, size_t size, 88 JSPandaFile *jsPandaFile, void *fileMapper) 89 : filename_(filename), jsPandaFile_(jsPandaFile), fileMapper_(fileMapper) 90 { 91 abcBufferCache_ = thread->GetEcmaVM()->GetAbcBufferCache(); 92 ASSERT(abcBufferCache_ != nullptr); 93 // if input has fileMapper, assume it's secure memory 94 abcBufferCache_->AddAbcBufferToCache(filename_, buffer, size, AbcBufferType::SECURE_BUFFER); 95 } 96 ~AbcBufferCacheScope()97 ~AbcBufferCacheScope() 98 { 99 ASSERT(abcBufferCache_ != nullptr); 100 abcBufferCache_->DeleteAbcBufferFromCache(filename_); 101 // secure memory & make sure buffer is not used in pandafile 102 if (fileMapper_ != nullptr && jsPandaFile_->GetFileMapper() != fileMapper_) { 103 // release secure memory buffer 104 JSPandaFile::CallReleaseSecureMemFunc(fileMapper_); 105 } 106 } 107 108 private: 109 const CString filename_; 110 JSPandaFile *jsPandaFile_ {nullptr}; 111 void *fileMapper_ {nullptr}; 112 AbcBufferCache *abcBufferCache_ {nullptr}; 113 }; 114 } // namespace panda::ecmascript 115 #endif // ECMASCRIPT_JSPANDAFILE_ABC_BUFFER_CACHE_H