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