set(CLR_SANITIZE_CXX_OPTIONS "")
set(CLR_SANITIZE_LINK_OPTIONS "")
- if(DEFINED ENV{TIZEN_ASAN_ENVIRONMENT})
- if (CLR_CMAKE_TARGET_ARCH_ARM OR CLR_CMAKE_TARGET_ARCH_AMD64)
- message(STATUS "TIZEN_ASAN_ENVIRONMENT is enabled.")
- # add definitions to enable ASan support for only external libraries (supported only Tizen)
- add_definitions(-DTIZEN_ASAN_ENVIRONMENT -DHAS_ADDRESS_SANITIZER)
- set(TIZEN_ASAN_ENVIRONMENT 1)
- else()
- message(STATUS "TIZEN_ASAN_ENVIRONMENT cannot be enabled. Current arch is not supported.")
- endif()
- endif()
-
# set the CLANG sanitizer flags for debug build
if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED)
# obtain settings from running enablesanitizers.sh
export ASAN_OPTIONS=use_sigaltstack=false:`cat /ASAN_OPTIONS`
/usr/bin/gcc-unforce-options
export LD_LIBRARY_PATH=`pwd`/libicu-57.1
-
-# enable ASan support for only external libs
-export TIZEN_ASAN_ENVIRONMENT=1
+export CPPFLAGS+=" -DHAS_ADDRESS_SANITIZER "
}
BASE_FLAGS=" --target=%{_host} -gdwarf-4 "
#---------------------------
# Build the single file host
#---------------------------
-if(NOT CLR_CROSS_COMPONENTS_BUILD AND NOT TIZEN_ASAN_ENVIRONMENT)
+if(NOT CLR_CROSS_COMPONENTS_BUILD)
set(CLR_SINGLE_FILE_HOST_ONLY 1)
add_subdirectory(${CLR_SRC_NATIVE_DIR}/corehost/apphost/static Corehost.Static)
add_dependencies(runtime singlefilehost)
IN NATIVE_LIBRARY_HANDLE dl_handle,
IN LPCSTR lpProcName);
-#ifdef TIZEN_ASAN_ENVIRONMENT
-PALIMPORT
-BOOL
-PALAPI
-PAL_IsSanitizedLibraryDirect(
- IN NATIVE_LIBRARY_HANDLE dl_handle);
-#endif
-
/*++
Function:
PAL_LOADLoadPEFile
thread/threadsusp.cpp
)
-if (TIZEN_ASAN_ENVIRONMENT)
- list(APPEND SOURCES
- loader/tizenasanenvmodule.cpp
- )
-endif()
-
if(NOT CLR_CMAKE_USE_SYSTEM_LIBUNWIND)
set(LIBUNWIND_OBJECTS $<TARGET_OBJECTS:libunwind>)
endif(NOT CLR_CMAKE_USE_SYSTEM_LIBUNWIND)
#include <gnu/lib-names.h>
#endif
-#ifdef TIZEN_ASAN_ENVIRONMENT
-#include "tizenasanenvmodule.h"
-#endif // TIZEN_ASAN_ENVIRONMENT
-
using namespace CorUnix;
// In safemath.h, Template SafeInt uses macro _ASSERTE, which need to use variable
return address;
}
-#ifdef TIZEN_ASAN_ENVIRONMENT
-/*
-Function:
- PAL_IsSanitizedLibraryDirect
-
- Check whether the native library is sanitized.
-
- Returns TRUE if the native library is sanitized; FALSE otherwise.
-*/
-PALIMPORT
-BOOL
-PALAPI
-PAL_IsSanitizedLibraryDirect(
- IN NATIVE_LIBRARY_HANDLE dl_handle)
-{
- return is_module_sanitized(dl_handle);
-}
-#endif // TIZEN_ASAN_ENVIRONMENT
-
/*++
Function:
PAL_RegisterModule
+++ /dev/null
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2019-2022 Samsung Electronics Co., Ltd.
- *
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include <string.h>
-#include "pal.h"
-#include "llvm/ELF.h"
-#include "tizenasanenvmodule.h"
-
-#if __LP64__
-using Addr = Elf64_Addr;
-using Dyn = Elf64_Dyn;
-using Sym = Elf64_Sym;
-using Rel = Elf64_Rel;
-using Rela = Elf64_Rela;
-#else
-using Addr = Elf32_Addr;
-using Dyn = Elf32_Dyn;
-using Sym = Elf32_Sym;
-using Rel = Elf32_Rel;
-using Rela = Elf32_Rela;
-#endif
-
-/*
- * Request arguments for dlinfo().
- */
-#define RTLD_DI_LINKMAP 2 /* Obtain link map. */
-
-struct link_map {
- Addr l_addr; /* Base Address of library */
- const char *l_name; /* Absolute Path to Library */
- Dyn *l_ld; /* Pointer to .dynamic in memory */
- struct link_map *l_next, *l_prev; /* linked list of of mapped libs */
-};
-
-extern "C" int dlinfo(void *handle, int request, void *info);
-
-struct plt_sym_resolver {
- Sym *dynsym; // .dynsym section
- char *dynstr; // .dynstr section
- long reltype; // relocation type
- size_t pltrel_size; // size of .rel(a).plt section
- void *jmprel; // .rel(a).plt section. Exact relocation
- // type is resolved at runtime
-
- plt_sym_resolver()
- : dynsym(nullptr), dynstr(nullptr), reltype(-1), pltrel_size(0),
- jmprel(nullptr)
- {}
-
- bool init(void *handle)
- {
- struct link_map *lmap;
-
- if (handle == nullptr || dlinfo(handle, RTLD_DI_LINKMAP, &lmap) < 0)
- return false;
-
- if (lmap == nullptr || lmap->l_ld == nullptr)
- return false;
-
- return init_relocation_info(lmap->l_ld);
- }
-
- bool is_symbol_available(const char *sym) const
- {
- switch (reltype) {
- case DT_REL:
- return is_symbol_available_in_rtable(reinterpret_cast<Rel *>(jmprel), sym);
- case DT_RELA:
- return is_symbol_available_in_rtable(reinterpret_cast<Rela *>(jmprel), sym);
- default: // no relocations
- break;
- }
- return false;
- }
-
-private:
- bool init_relocation_info(Dyn *dynamic)
- {
- for (Dyn *dyn = dynamic; dyn->d_tag != DT_NULL; ++dyn) {
- switch (dyn->d_tag) {
- case DT_SYMTAB:
- dynsym = reinterpret_cast<Sym *>(dyn->d_un.d_ptr);
- break;
- case DT_STRTAB:
- dynstr = reinterpret_cast<char *>(dyn->d_un.d_ptr);
- break;
- case DT_PLTREL:
- reltype = dyn->d_un.d_val;
- break;
- case DT_PLTRELSZ:
- pltrel_size = dyn->d_un.d_val;
- break;
- case DT_JMPREL:
- jmprel = reinterpret_cast<void *>(dyn->d_un.d_ptr);
- break;
- default:
- break;
- }
- }
-
- if (dynsym == nullptr ||
- dynstr == nullptr ||
- jmprel == nullptr ||
- pltrel_size == 0 ||
- (reltype != DT_REL && reltype != DT_RELA))
- return false;
-
- return true;
- }
-
- template<typename Rel>
- bool is_symbol_available_in_rtable(const Rel *rel_table, const char *sym) const
- {
- if (rel_table == nullptr || pltrel_size == 0)
- return false;
-
- const size_t rel_cnt = pltrel_size / sizeof(Rel);
- const Rel *rel_end = rel_table + rel_cnt;
- for (const Rel *rel = rel_table; rel < rel_end; ++rel) {
- if (strcmp(sym, rel_to_symname(rel)) == 0)
- return true;
- }
-
- return false;
- }
-
- template<typename Rel>
- inline char *rel_to_symname(const Rel *rel) const
- {
- return dynstr + dynsym[rel->getSymbol()].st_name;
- }
-};
-
-BOOL is_module_sanitized(void *handle)
-{
- plt_sym_resolver psr;
- if (!psr.init(handle))
- return FALSE;
- return psr.is_symbol_available("__asan_init") ? TRUE : FALSE;
-}
+++ /dev/null
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2019-2022 Samsung Electronics Co., Ltd.
- *
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#ifndef TIZENASANENVMODULE_H_
-#define TIZENASANENVMODULE_H_
-
-#include <pal_mstypes.h>
-
-BOOL is_module_sanitized(void *handle);
-
-#endif // TIZENASANENVMODULE_H_
#include "common.h"
-#ifdef TIZEN_ASAN_ENVIRONMENT
-extern "C" {
-extern void __sanitizer_disable_interceptors() __attribute__ ((weak));
-extern void __sanitizer_enable_interceptors() __attribute__ ((weak));
-extern bool __sanitizer_interceptors_are_enabled() __attribute__ ((weak));
-}
-#endif
-
STDAPI_(LPVOID) CoTaskMemAlloc(SIZE_T cb)
{
- LPVOID lpRetVal = NULL;
-#ifdef TIZEN_ASAN_ENVIRONMENT
- if (__sanitizer_interceptors_are_enabled != NULL)
- {
- bool san_enabled;
- san_enabled = __sanitizer_interceptors_are_enabled();
- if (!san_enabled) {
- __sanitizer_enable_interceptors();
- }
- lpRetVal = malloc(cb);
- if (!san_enabled) {
- __sanitizer_disable_interceptors();
- }
- }
- else
-#endif
- {
- lpRetVal = malloc(cb);
- }
- return lpRetVal;
+ return malloc(cb);
}
STDAPI_(void) CoTaskMemFree(LPVOID pv)
{
-#ifdef TIZEN_ASAN_ENVIRONMENT
- if (__sanitizer_interceptors_are_enabled != NULL)
- {
- bool san_enabled;
- san_enabled = __sanitizer_interceptors_are_enabled();
- if (!san_enabled) {
- __sanitizer_enable_interceptors();
- }
- free(pv);
- if (!san_enabled) {
- __sanitizer_disable_interceptors();
- }
- }
- else
-#endif
- {
- free(pv);
- }
+ free(pv);
}
endif()
else(CLR_CMAKE_TARGET_WIN32)
- if (TIZEN_ASAN_ENVIRONMENT)
- list(APPEND VM_SOURCES_WKS
- tizenasanenv.cpp
- )
- list(APPEND VM_HEADERS_WKS
- tizenasanenv.h
- )
- endif()
if(CLR_CMAKE_TARGET_ARCH_AMD64)
set(VM_SOURCES_WKS_ARCH_ASM
${ARCH_SOURCES_DIR}/umthunkstub.S
${ARCH_SOURCES_DIR}/virtualcallstubamd64.S
)
- if (TIZEN_ASAN_ENVIRONMENT)
- list(APPEND VM_SOURCES_WKS_ARCH_ASM
- ${ARCH_SOURCES_DIR}/tizenasanenv.S
- )
- endif()
elseif(CLR_CMAKE_TARGET_ARCH_I386)
set(VM_SOURCES_WKS_ARCH_ASM
${ARCH_SOURCES_DIR}/ehhelpers.S
${ARCH_SOURCES_DIR}/patchedcode.S
${ARCH_SOURCES_DIR}/pinvokestubs.S
)
- if (TIZEN_ASAN_ENVIRONMENT)
- list(APPEND VM_SOURCES_WKS_ARCH_ASM
- ${ARCH_SOURCES_DIR}/tizenasanenv.S
- )
- endif()
elseif(CLR_CMAKE_TARGET_ARCH_ARM64)
set(VM_SOURCES_WKS_ARCH_ASM
${ARCH_SOURCES_DIR}/asmhelpers.S
#include "clrtocomcall.h"
#endif // FEATURE_COMINTEROP
-#ifdef TIZEN_ASAN_ENVIRONMENT
-#include <tizenasanenv.h>
-#endif // TIZEN_ASAN_ENVIRONMENT
-
void UpdateRegDisplayFromCalleeSavedRegisters(REGDISPLAY * pRD, CalleeSavedRegisters * pRegs)
{
LIMITED_METHOD_CONTRACT;
}
CONTRACTL_END;
-#ifdef TIZEN_ASAN_ENVIRONMENT
- pTargetCode = (BYTE *)TizenASanEnv::CreateWrapperILCode((LPVOID)pTargetCode);
-#endif // TIZEN_ASAN_ENVIRONMENT
-
// padding // CC CC CC CC
// mov r10, pUMEntryThunk // 49 ba xx xx xx xx xx xx xx xx // METHODDESC_REGISTER
// mov rax, pJmpDest // 48 b8 xx xx xx xx xx xx xx xx // need to ensure this imm64 is qword aligned
+++ /dev/null
-//
-// The MIT License (MIT)
-//
-// Copyright (c) 2019-2022 Samsung Electronics Co., Ltd.
-//
-// All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-
-// Scheme of saving registers to the stack
-// +--------+----------------------+
-// | | value |
-// | offset | size | register name |
-// +--------+------+---------------+
-// | 0x00 | 8 | --- | (returnt addr)
-// | -0x08 | 8 | rax |
-// | -0x10 | 8 | r11 |
-// | -0x18 | 8 | r10 |
-// | -0x20 | 8 | r9 |
-// | -0x28 | 8 | r8 |
-// | -0x30 | 8 | rcx |
-// | -0x38 | 8 | rdx |
-// | -0x40 | 8 | rsi |
-// | -0x48 | 8 | rdi |
-// | -0x50 | 16 | xmm7 |
-// | -0x60 | 16 | xmm6 |
-// | -0x70 | 16 | xmm5 |
-// | -0x80 | 16 | xmm4 |
-// | -0x90 | 16 | xmm3 |
-// | -0xa0 | 16 | xmm2 |
-// | -0xb0 | 16 | xmm1 |
-// | -0xc0 | 16 | xmm0 |
-
-
-#define GENERAL_SAVED_REGS_COUNT 9
-#define GENERAL_SAVED_REGS_SIZE (8 * GENERAL_SAVED_REGS_COUNT)
-.macro PUSH_GENERAL_REGS
- push %rdi // 1st argument
- push %rsi // 2nd argument
- push %rdx // 3rd argument, 2nd return register
- push %rcx // 4th argument
- push %r8 // 5th argument
- push %r9 // 6th argument
- push %r10 // 1st return register
- push %r11 // temporary register
- push %rax // temporary register
-.endm
-
-.macro POP_GENERAL_REGS
- pop %rax
- pop %r11
- pop %r10
- pop %r9
- pop %r8
- pop %rcx
- pop %rdx
- pop %rsi
- pop %rdi
-.endm
-
-#define XMM_SAVED_REGS_COUNT 8
-#define XMM_SAVED_REGS_SIZE (16 * XMM_SAVED_REGS_COUNT)
-.macro PUSH_XMM_REGS
- sub $XMM_SAVED_REGS_SIZE, %rsp
- movaps %xmm0, 0x00(%rsp)
- movaps %xmm1, 0x10(%rsp)
- movaps %xmm2, 0x20(%rsp)
- movaps %xmm3, 0x30(%rsp)
- movaps %xmm4, 0x40(%rsp)
- movaps %xmm5, 0x50(%rsp)
- movaps %xmm6, 0x60(%rsp)
- movaps %xmm7, 0x70(%rsp)
-.endm
-
-.macro POP_XMM_REGS
- movaps 0x70(%rsp), %xmm7
- movaps 0x60(%rsp), %xmm6
- movaps 0x50(%rsp), %xmm5
- movaps 0x40(%rsp), %xmm4
- movaps 0x30(%rsp), %xmm3
- movaps 0x20(%rsp), %xmm2
- movaps 0x10(%rsp), %xmm1
- movaps 0x00(%rsp), %xmm0
- add $XMM_SAVED_REGS_SIZE, %rsp
-.endm
-
-#define RETADDR_OFFSET (GENERAL_SAVED_REGS_SIZE + XMM_SAVED_REGS_SIZE)
-.macro PUSH_REGS
- PUSH_GENERAL_REGS
- PUSH_XMM_REGS
-.endm
-
-.macro POP_REGS
- POP_XMM_REGS
- POP_GENERAL_REGS
-.endm
-
-
-// Export symbols
-.global tizenASanWrapper
-.global tizenASanWrapperSize
-.global tizenASanWrapperEntryOffset
-
-.text
-.code64
-
-tizenASanWrapper:
-// !!! ATTENTION !!!
-// Don't move this labels (target, pushAddr, popAddr)
-// because they mapped to AuxiliaryCalls struct from src/coreclr/vm/tizenasanenv.cpp
-target: .quad 0xdeadbeef0badc0de
-pushAddr: .quad 0xdeadbeef0badc0de // void pushAddr(LPVOID addr)
-popAddr: .quad 0xdeadbeef0badc0de // LPVOID popAddr()
-
-
-entryPointer:
- // Save context
- PUSH_REGS
-
- // Save the return address and call 'pre handler'
- mov RETADDR_OFFSET(%rsp), %rdi // rdi: get return address
- call *pushAddr(%rip) // save the return address
-
- // Change the return address
- call next
-next:
- pop %rax // rax: get current rip
- add $(postLabel - next), %rax // rax: add offset to 'postLabel'
- mov %rax, RETADDR_OFFSET(%rsp) // change the return address
-
- // Restore context
- POP_REGS
-
- // Call original function
- jmp *target(%rip)
-postLabel:
- sub $8, %rsp // add space for the return addr
-
- // Save context
- PUSH_REGS
-
- // Get the return address and call 'post handler'
- call *popAddr(%rip) // rax: get the return address
- mov %rax, (RETADDR_OFFSET)(%rsp) // restore the return address
-
- // Restore context
- POP_REGS
-
- // Return
- ret
-
-tizenASanWrapperSize: .long . - tizenASanWrapper
-tizenASanWrapperEntryOffset: .long entryPointer - tizenASanWrapper
#include "ecall.h"
#include "threadsuspend.h"
-#if defined(TIZEN_ASAN_ENVIRONMENT) && !defined(CROSS_COMPILE) && !defined(DACCESS_COMPILE)
-#include <tizenasanenv.h>
-#endif
-
// target write barriers
EXTERN_C void JIT_WriteBarrier(Object **dst, Object *ref);
EXTERN_C void JIT_WriteBarrier_End();
void UMEntryThunkCode::Encode(UMEntryThunkCode *pEntryThunkCodeRX, BYTE* pTargetCode, void* pvSecretParam)
{
-#if defined(TIZEN_ASAN_ENVIRONMENT) && !defined(CROSS_COMPILE) && !defined(DACCESS_COMPILE)
- pTargetCode = (BYTE *)TizenASanEnv::CreateWrapperILCode((LPVOID)pTargetCode);
-#endif
-
// ldr r12, [pc + 8]
m_code[0] = 0xf8df;
m_code[1] = 0xc008;
+++ /dev/null
-//
-// The MIT License (MIT)
-//
-// Copyright (c) 2019-2022 Samsung Electronics Co., Ltd.
-//
-// All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-
-.macro PUSH_REGS
- push {r0-r12}
- vpush.64 {d0-d7}
-.endm
-
-.macro POP_REGS
- vpop.64 {d0-d7}
- pop {r0-r12}
-.endm
-
-
-// Export symbols
-.global tizenASanWrapper
-.global tizenASanWrapperSize
-.global tizenASanWrapperEntryOffset
-
-.text
-.arm
-
-tizenASanWrapper:
-// !!! ATTENTION !!!
-// Don't move this labels (target, pushAddr, popAddr)
-// because they mapped to AuxiliaryCalls struct from src/coreclr/vm/tizenasanenv.cpp
-target: .word 0xdeadc0de
-pushAddr: .word 0xdeadc0de @ void pushAddr(LPVOID addr)
-popAddr: .word 0xdeadc0de @ LPVOID popAddr()
-
-entryPointer:
- // Save context
- PUSH_REGS
-
- // Save the return address and call 'pre handler'
- mov r0, lr
- ldr r1, pushAddr
- blx r1
-
- // Restore context
- POP_REGS
-
- // Change the return address
- adr lr, postLabel
-
- // Call original function
- ldr pc, target
-postLabel:
- // Save context
- PUSH_REGS
-
- // Get the return address and call 'post handler'
- ldr r0, popAddr
- blx r0
-
- // Restore the return address
- mov lr, r0
-
- // Restore context
- POP_REGS
- bx lr
-
-tizenASanWrapperSize: .word . - tizenASanWrapper
-tizenASanWrapperEntryOffset: .word entryPointer - tizenASanWrapper
#include "compile.h"
#endif // FEATURE_PREJIT
-#ifdef TIZEN_ASAN_ENVIRONMENT
-#include <tizenasanenv.h>
-#endif // TIZEN_ASAN_ENVIRONMENT
-
#include "eventtrace.h"
namespace
LPVOID pvTarget = NDirectGetEntryPoint(pMD, hmod);
if (pvTarget)
{
-#ifdef TIZEN_ASAN_ENVIRONMENT
- if (PAL_IsSanitizedLibraryDirect(hmod))
- {
- pvTarget = TizenASanEnv::CreateWrapperSanitizedEntryPoint(pvTarget);
- }
-#endif // TIZEN_ASAN_ENVIRONMENT
-
pMD->SetNDirectTarget(pvTarget);
fSuccess = TRUE;
}
{
// We can't pin an array if we have a marshaler for the var type
// or if we can't get a method-table representing the array (how we determine the offset to pin).
-#ifndef TIZEN_ASAN_ENVIRONMENT
return IsCLRToNative(m_dwMarshalFlags) && !IsByref(m_dwMarshalFlags) && (NULL != m_pargs->na.m_pArrayMT) && (NULL == OleVariant::GetMarshalerForVarType(m_pargs->na.m_vt, TRUE));
-#else
- return false;
-#endif
}
void ILNativeArrayMarshaler::EmitMarshalViaPinning(ILCodeStream* pslILEmit)
+++ /dev/null
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2019-2022 Samsung Electronics Co., Ltd.
- *
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include <string.h>
-#include "common.h"
-#include "tizenasanenv.h"
-
-
-template <typename Type, int STACK_SIZE>
-class StaticStack {
- // We don't create constructor because
- // this class is used in a zeroed memory area
-public:
- void push(Type addr)
- {
- _ASSERTE(m_pos < STACK_SIZE);
-
- m_data[m_pos++] = addr;
- }
-
- void pop()
- {
- _ASSERTE(m_pos > 0);
- --m_pos;
- }
-
- Type top()
- {
- _ASSERTE(m_pos > 0);
-
- return m_data[m_pos - 1];
- }
-
- bool empty()
- {
- return m_pos == 0;
- }
-
-private:
- int m_pos;
- Type m_data[STACK_SIZE];
-};
-
-#include <pshpack1.h>
-struct AuxiliaryCalls {
- LPVOID target;
- void (*pushAddr)(LPVOID addr);
- LPVOID (*popAddr)();
-};
-
-struct ReturnInfo {
- LPVOID addr;
- bool isSanitized;
-};
-
-extern "C" void __sanitizer_disable_interceptors();
-extern "C" void __sanitizer_enable_interceptors();
-extern "C" bool __sanitizer_interceptors_are_enabled();
-
-extern LPVOID tizenASanWrapper;
-extern UINT32 tizenASanWrapperSize;
-extern UINT32 tizenASanWrapperEntryOffset;
-
-// The maximum nesting of transitions between managed and unmanaged code that we support.
-// This number is estimated from the common sense. We think this is enough to check any
-// sane code (if it is not recursive) and it won't bloat TLS. We do not use dynamic
-// allocation because it complicates the process of memory management in TLS variables.
-// It is used only for firmware with ASan and will not affect the release version.
-#define MAX_STACK_DEPTH 128
-static __thread StaticStack<ReturnInfo, MAX_STACK_DEPTH> s_retInfoStack;
-
-
-static void DoEnable()
-{
- _ASSERTE(__sanitizer_interceptors_are_enabled() == false);
- __sanitizer_enable_interceptors();
-}
-
-static void DoDisable()
-{
- _ASSERTE(__sanitizer_interceptors_are_enabled() == true);
- __sanitizer_disable_interceptors();
-}
-
-static void PushAndEnableASan(LPVOID addr)
-{
- _ASSERTE(__sanitizer_interceptors_are_enabled() == false);
-
- ReturnInfo retInfo = {
- .addr = addr,
- .isSanitized = false,
- };
-
- s_retInfoStack.push(retInfo);
- DoEnable();
-}
-
-static LPVOID PopAndDisableASan()
-{
- _ASSERTE(__sanitizer_interceptors_are_enabled() == true);
-
- ReturnInfo retInfo = s_retInfoStack.top();
- s_retInfoStack.pop();
-
- _ASSERTE(retInfo.isSanitized == false);
- DoDisable();
-
- return retInfo.addr;
-}
-
-static void PushAndMayBeDisableASan(LPVOID addr)
-{
- ReturnInfo retInfo = {
- .addr = addr,
- .isSanitized = __sanitizer_interceptors_are_enabled(),
- };
-
- if (retInfo.isSanitized)
- DoDisable();
-
- s_retInfoStack.push(retInfo);
-}
-
-static LPVOID PopAndMayBeEnableASan()
-{
- _ASSERTE(__sanitizer_interceptors_are_enabled() == false);
-
- ReturnInfo retInfo = s_retInfoStack.top();
- s_retInfoStack.pop();
-
- if (retInfo.isSanitized)
- DoEnable();
-
- return retInfo.addr;
-}
-
-static LPVOID CreateWrapper(LPVOID target, void (*pushAddr)(LPVOID addr), LPVOID (*popAddr)())
-{
- _ASSERTE(tizenASanWrapperEntryOffset == sizeof(AuxiliaryCalls));
-
- LPVOID wrapperSpace = (LPVOID)SystemDomain::GetGlobalLoaderAllocator()->GetExecutableHeap()->AllocMem(S_SIZE_T(tizenASanWrapperSize));
-
- AuxiliaryCalls calls = {
- .target = target,
- .pushAddr = pushAddr,
- .popAddr = popAddr,
- };
-
- // copy auxiliary calls
- memcpy(wrapperSpace, &calls, sizeof(calls));
-
- LPVOID entryPointer = (LPVOID)((UINT_PTR)wrapperSpace + tizenASanWrapperEntryOffset);
- LPVOID wrapperEntryPointer = (LPVOID)((UINT_PTR)&tizenASanWrapper + tizenASanWrapperEntryOffset);
- UINT32 wrapperCodeSize = tizenASanWrapperSize - tizenASanWrapperEntryOffset;
-
- // copy executable code wrapper
- memcpy(entryPointer, wrapperEntryPointer, wrapperCodeSize);
-
- FlushInstructionCache(GetCurrentProcess(), wrapperSpace, tizenASanWrapperSize);
-
- return entryPointer;
-}
-
-
-namespace TizenASanEnv {
-
-LPVOID CreateWrapperSanitizedEntryPoint(LPVOID target)
-{
- return CreateWrapper(target, PushAndEnableASan, PopAndDisableASan);
-}
-
-LPVOID CreateWrapperILCode(LPVOID target)
-{
- return CreateWrapper(target, PushAndMayBeDisableASan, PopAndMayBeEnableASan);
-}
-
-} // namespace TizenASanEnv
+++ /dev/null
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2019-2022 Samsung Electronics Co., Ltd.
- *
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#ifndef TIZENASANENV_H_
-#define TIZENASANENV_H_
-
-namespace TizenASanEnv {
-
-LPVOID CreateWrapperSanitizedEntryPoint(LPVOID target);
-LPVOID CreateWrapperILCode(LPVOID target);
-
-} // namespace TizenASanEnv
-
-#endif // TIZENASANENV_H_