From 08c7d5f85c49c05bee134d03ace666a25518a043 Mon Sep 17 00:00:00 2001 From: Brian Sumner Date: Tue, 4 Nov 2025 14:47:44 -0800 Subject: [PATCH] Add user poison functions --- amd/device-libs/asanrtl/src/shadow_mapping.cl | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/amd/device-libs/asanrtl/src/shadow_mapping.cl b/amd/device-libs/asanrtl/src/shadow_mapping.cl index d768e1e459d98..c7ceccb8c16e4 100644 --- a/amd/device-libs/asanrtl/src/shadow_mapping.cl +++ b/amd/device-libs/asanrtl/src/shadow_mapping.cl @@ -8,6 +8,7 @@ #include "shadow_mapping.h" static const __constant u8 kAsanHeapLeftRedzoneMagic = (u8)0xfa; +static const __constant u8 kAsanUserPoisonedMemoryMagic = (u8)0xf7; NO_SANITIZE_ADDR static uptr @@ -69,3 +70,84 @@ __asan_poison_region(ulong beg, ulong size) __builtin_memset(shadow_ptr, kAsanHeapLeftRedzoneMagic, shadow_size); } } + +USED NO_SANITIZE_ADDR +void +__asan_poison_memory_region(const void *addr, uptr size) +{ + if (size == 0) + return; + + uptr beg_addr = (uptr)addr; + uptr end_addr = beg_addr + size; + + __global s8 *beg_sp = (__global s8 *)MEM_TO_SHADOW(beg_addr); + s8 beg_off = (s8)(beg_addr & (SHADOW_GRANULARITY - 1)); + s8 beg_val = *beg_sp; + + __global s8 *end_sp = (__global s8 *)MEM_TO_SHADOW(end_addr); + s8 end_off = (s8)(end_addr & (SHADOW_GRANULARITY - 1)); + s8 end_val = *end_sp; + + if (beg_sp == end_sp) { + s8 val = beg_val; + if (val > 0 && val <= end_off) { + if (beg_off > 0) + *beg_sp = (val < beg_off) ? val : beg_off; + else + *beg_sp = (s8)kAsanUserPoisonedMemoryMagic; + } + return; + } + + if (beg_off > 0) { + if (beg_val == 0) + *beg_sp = beg_off; + else + *beg_sp = (beg_val < beg_off) ? beg_val : beg_off; + beg_sp++; + } + + __builtin_memset(beg_sp, kAsanUserPoisonedMemoryMagic, end_sp - beg_sp); + + if (end_val > 0 && end_val <= end_off) + *end_sp = (s8)kAsanUserPoisonedMemoryMagic; +} + +USED NO_SANITIZE_ADDR +void +__asan_unpoison_memory_region(const void *addr, uptr size) +{ + if (size == 0) + return; + + uptr beg_addr = (uptr)addr; + uptr end_addr = beg_addr + size; + + __global s8 *beg_sp = (__global s8 *)MEM_TO_SHADOW(beg_addr); + s8 beg_off = (s8)(beg_addr & (SHADOW_GRANULARITY - 1)); + s8 beg_val = *beg_sp; + + __global s8 *end_sp = (__global s8 *)MEM_TO_SHADOW(end_addr); + s8 end_off = (s8)(end_addr & (SHADOW_GRANULARITY - 1)); + s8 end_val = *end_sp; + + if (beg_sp == end_sp) { + s8 val = beg_val; + if (val != 0) + *beg_sp = (val > end_off) ? val : end_off; + return; + } + + __builtin_memset(beg_sp, 0, end_sp - beg_sp); + + if (end_off > 0 && end_val != 0) + *end_sp = (end_val > end_off) ? end_val : end_off; +} + +USED NO_SANITIZE_ADDR +int +__asan_address_is_poisoned(const void *addr) +{ + return is_address_poisoned((uptr)addr); +}