1 /* 2 * Copyright (c) 2023 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 #include "dfx_memory.h" 17 #include <algorithm> 18 #include <securec.h> 19 #include "dfx_define.h" 20 #include "dfx_log.h" 21 22 namespace OHOS { 23 namespace HiviewDFX { MemoryCopy(void * dst,uint8_t * data,size_t copySize,size_t offset,size_t dataSize)24 size_t DfxMemory::MemoryCopy(void *dst, uint8_t *data, size_t copySize, size_t offset, size_t dataSize) 25 { 26 if (offset >= dataSize) { 27 return 0; 28 } 29 30 size_t bytesLeft = dataSize - static_cast<size_t>(offset); 31 const unsigned char *actualBase = static_cast<const unsigned char *>(data) + offset; 32 size_t actualLen = std::min(bytesLeft, copySize); 33 if (memcpy_s(dst, actualLen, actualBase, actualLen) != 0) { 34 DFXLOG_ERROR("%s :: memcpy error\n", __func__); 35 } 36 return actualLen; 37 } 38 ReadFully(uint64_t addr,void * dst,size_t size)39 bool DfxMemory::ReadFully(uint64_t addr, void* dst, size_t size) 40 { 41 size_t rc = Read(addr, dst, size); 42 return rc == size; 43 } 44 ReadString(uint64_t addr,std::string * dst,size_t maxRead)45 bool DfxMemory::ReadString(uint64_t addr, std::string* dst, size_t maxRead) 46 { 47 char buffer[LOG_BUF_LEN] = {0}; 48 size_t size = 0; 49 for (size_t nRead = 0; nRead < maxRead; nRead += size) { 50 size_t read = std::min(sizeof(buffer), maxRead - nRead); 51 size = Read(addr + nRead, buffer, read); 52 if (size == 0) { 53 return false; 54 } 55 size_t length = strnlen(buffer, size); 56 if (length < size) { 57 if (nRead == 0) { 58 dst->assign(buffer, length); 59 return true; 60 } else { 61 dst->assign(nRead + length, '\0'); 62 return ReadFully(addr, (void*)(dst->data()), dst->size()); 63 } 64 } 65 } 66 return false; 67 } 68 Read32(uint64_t addr,uint32_t * dst)69 inline bool DfxMemory::Read32(uint64_t addr, uint32_t* dst) 70 { 71 return ReadFully(addr, dst, sizeof(uint32_t)); 72 } 73 Read64(uint64_t addr,uint64_t * dst)74 inline bool DfxMemory::Read64(uint64_t addr, uint64_t* dst) 75 { 76 return ReadFully(addr, dst, sizeof(uint64_t)); 77 } 78 79 } // namespace HiviewDFX 80 } // namespace OHOS 81