xref: /llvm-project/compiler-rt/lib/msan/msan_poisoning.h (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
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