* This file is part of the MindStudio project.
* Copyright (c) 2025 Huawei Technologies Co.,Ltd.
*
* MindStudio is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* ------------------------------------------------------------------------- */
#include "HijackedFunc.h"
#include "acl_rt_impl/AscendclImplOrigin.h"
#include "core/FuncSelector.h"
#include "runtime/inject_helpers/LocalDevice.h"
#include "utils/InjectLogger.h"
#include "utils/Protocol.h"
#include "utils/Serialize.h"
HijackedFuncOfAclrtMemcpy2dImpl::HijackedFuncOfAclrtMemcpy2dImpl()
: HijackedFuncType(AclRuntimeLibName(), "aclrtMemcpy2dImpl") {}
void HijackedFuncOfAclrtMemcpy2dImpl::Pre(void *dst, size_t dpitch, const void *src, size_t spitch,
size_t width, size_t height, aclrtMemcpyKind kind)
{
if (height > MAX_MEMORY_RECORD_HEIGHT) {
WARN_LOG("Height truncated from %zu to %zu for AclrtMemcpy2d", height, MAX_MEMORY_RECORD_HEIGHT);
height = MAX_MEMORY_RECORD_HEIGHT;
}
if (IsSanitizer()) {
PacketHead head = { PacketType::MEMORY_RECORD };
HostMemRecord record{};
record.infoSrc = MemInfoSrc::ACL;
record.memSize = width;
auto dstAddr = reinterpret_cast<uint64_t>(dst);
auto srcAddr = reinterpret_cast<uint64_t>(src);
for (size_t r = 0; r < height; ++r) {
if ((kind == ACL_MEMCPY_HOST_TO_DEVICE || kind == ACL_MEMCPY_DEVICE_TO_DEVICE) &&
(dstAddr <= UINT64_MAX - static_cast<uint64_t>(r * dpitch))) {
record.type = MemOpType::STORE;
record.dstAddr = dstAddr + static_cast<uint64_t>(r * dpitch);
LocalDevice::Local().Notify(Serialize(head, record));
}
if ((kind == ACL_MEMCPY_DEVICE_TO_HOST || kind == ACL_MEMCPY_DEVICE_TO_DEVICE) &&
(srcAddr <= UINT64_MAX - static_cast<uint64_t>(r * spitch))) {
record.type = MemOpType::LOAD;
record.dstAddr = srcAddr + static_cast<uint64_t>(r * spitch);
LocalDevice::Local().Notify(Serialize(head, record));
}
}
}
}