184adb5d1SEvgeniy Stepanov //===-- msan_poisoning.h ----------------------------------------*- C++ -*-===// 284adb5d1SEvgeniy Stepanov // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 684adb5d1SEvgeniy Stepanov // 784adb5d1SEvgeniy Stepanov //===----------------------------------------------------------------------===// 884adb5d1SEvgeniy Stepanov // 984adb5d1SEvgeniy Stepanov // This file is a part of MemorySanitizer. 1084adb5d1SEvgeniy Stepanov // 1184adb5d1SEvgeniy Stepanov //===----------------------------------------------------------------------===// 1284adb5d1SEvgeniy Stepanov 1384adb5d1SEvgeniy Stepanov #ifndef MSAN_POISONING_H 1484adb5d1SEvgeniy Stepanov #define MSAN_POISONING_H 1584adb5d1SEvgeniy Stepanov 1684adb5d1SEvgeniy Stepanov #include "msan.h" 1784adb5d1SEvgeniy Stepanov 1884adb5d1SEvgeniy Stepanov namespace __msan { 1984adb5d1SEvgeniy Stepanov 2084adb5d1SEvgeniy Stepanov // Return origin for the first poisoned byte in the memory range, or 0. 2184adb5d1SEvgeniy Stepanov u32 GetOriginIfPoisoned(uptr addr, uptr size); 2284adb5d1SEvgeniy Stepanov 2384adb5d1SEvgeniy Stepanov // Walk [addr, addr+size) app memory region, copying origin tags from the 2484adb5d1SEvgeniy Stepanov // corresponding positions in [src_origin, src_origin+size) where the 2584adb5d1SEvgeniy Stepanov // corresponding shadow in [src_shadow, src_shadow+size) is non-zero. 2684adb5d1SEvgeniy Stepanov void SetOriginIfPoisoned(uptr addr, uptr src_shadow, uptr size, u32 src_origin); 2784adb5d1SEvgeniy Stepanov 2884adb5d1SEvgeniy Stepanov // Copy origin from src (app address) to dst (app address), creating chained 2984adb5d1SEvgeniy Stepanov // origin ids as necessary, without overriding origin for fully initialized 3084adb5d1SEvgeniy Stepanov // quads. 3184adb5d1SEvgeniy Stepanov void CopyOrigin(const void *dst, const void *src, uptr size, StackTrace *stack); 3284adb5d1SEvgeniy Stepanov 3384adb5d1SEvgeniy Stepanov // memmove() shadow and origin. Dst and src are application addresses. 3484adb5d1SEvgeniy Stepanov // See CopyOrigin() for the origin copying logic. 3584adb5d1SEvgeniy Stepanov void MoveShadowAndOrigin(const void *dst, const void *src, uptr size, 3684adb5d1SEvgeniy Stepanov StackTrace *stack); 3784adb5d1SEvgeniy Stepanov 3884adb5d1SEvgeniy Stepanov // memcpy() shadow and origin. Dst and src are application addresses. 3984adb5d1SEvgeniy Stepanov // See CopyOrigin() for the origin copying logic. 4084adb5d1SEvgeniy Stepanov void CopyShadowAndOrigin(const void *dst, const void *src, uptr size, 4184adb5d1SEvgeniy Stepanov StackTrace *stack); 4284adb5d1SEvgeniy Stepanov 4384adb5d1SEvgeniy Stepanov // memcpy() app memory, and do "the right thing" to the corresponding shadow and 4484adb5d1SEvgeniy Stepanov // origin regions. 4584adb5d1SEvgeniy Stepanov void CopyMemory(void *dst, const void *src, uptr size, StackTrace *stack); 4684adb5d1SEvgeniy Stepanov 4784adb5d1SEvgeniy Stepanov // Fill shadow will value. Ptr is an application address. 4884adb5d1SEvgeniy Stepanov void SetShadow(const void *ptr, uptr size, u8 value); 4984adb5d1SEvgeniy Stepanov 5084adb5d1SEvgeniy Stepanov // Set origin for the memory region. 5184adb5d1SEvgeniy Stepanov void SetOrigin(const void *dst, uptr size, u32 origin); 5284adb5d1SEvgeniy Stepanov 5384adb5d1SEvgeniy Stepanov // Mark memory region uninitialized, with origins. 5484adb5d1SEvgeniy Stepanov void PoisonMemory(const void *dst, uptr size, StackTrace *stack); 5584adb5d1SEvgeniy Stepanov 5684adb5d1SEvgeniy Stepanov } // namespace __msan 5784adb5d1SEvgeniy Stepanov 5884adb5d1SEvgeniy Stepanov #endif // MSAN_POISONING_H 59