1 /* 2 * msvcrt C++ exception handling 3 * 4 * Copyright 2011 Alexandre Julliard 5 * Copyright 2013 André Hentschel 6 * Copyright 2017 Martin Storsjo 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with this library; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 21 */ 22 23 #include "config.h" 24 #include "wine/port.h" 25 26 #ifdef __aarch64__ 27 28 #include <stdarg.h> 29 30 #include "ntstatus.h" 31 #define WIN32_NO_STATUS 32 #include "windef.h" 33 #include "winbase.h" 34 #include "winternl.h" 35 #include "msvcrt.h" 36 #include "wine/exception.h" 37 #include "excpt.h" 38 #include "wine/debug.h" 39 40 #include "cppexcept.h" 41 42 WINE_DEFAULT_DEBUG_CHANNEL(seh); 43 44 45 /********************************************************************* 46 * __CxxExceptionFilter (MSVCRT.@) 47 */ 48 int CDECL __CxxExceptionFilter( PEXCEPTION_POINTERS ptrs, 49 const type_info *ti, int flags, void **copy ) 50 { 51 FIXME( "%p %p %x %p: not implemented\n", ptrs, ti, flags, copy ); 52 return EXCEPTION_CONTINUE_SEARCH; 53 } 54 55 /********************************************************************* 56 * __CxxFrameHandler (MSVCRT.@) 57 */ 58 EXCEPTION_DISPOSITION CDECL __CxxFrameHandler(EXCEPTION_RECORD *rec, DWORD frame, CONTEXT *context, 59 DISPATCHER_CONTEXT *dispatch) 60 { 61 FIXME("%p %x %p %p: not implemented\n", rec, frame, context, dispatch); 62 return ExceptionContinueSearch; 63 } 64 65 66 /********************************************************************* 67 * __CppXcptFilter (MSVCRT.@) 68 */ 69 int CDECL __CppXcptFilter(NTSTATUS ex, PEXCEPTION_POINTERS ptr) 70 { 71 /* only filter c++ exceptions */ 72 if (ex != CXX_EXCEPTION) return EXCEPTION_CONTINUE_SEARCH; 73 return _XcptFilter(ex, ptr); 74 } 75 76 77 /********************************************************************* 78 * __CxxDetectRethrow (MSVCRT.@) 79 */ 80 BOOL CDECL __CxxDetectRethrow(PEXCEPTION_POINTERS ptrs) 81 { 82 PEXCEPTION_RECORD rec; 83 84 if (!ptrs) 85 return FALSE; 86 87 rec = ptrs->ExceptionRecord; 88 89 if (rec->ExceptionCode == CXX_EXCEPTION && 90 rec->NumberParameters == 3 && 91 rec->ExceptionInformation[0] == CXX_FRAME_MAGIC_VC6 && 92 rec->ExceptionInformation[2]) 93 { 94 ptrs->ExceptionRecord = msvcrt_get_thread_data()->exc_record; 95 return TRUE; 96 } 97 return (msvcrt_get_thread_data()->exc_record == rec); 98 } 99 100 101 /********************************************************************* 102 * __CxxQueryExceptionSize (MSVCRT.@) 103 */ 104 unsigned int CDECL __CxxQueryExceptionSize(void) 105 { 106 return sizeof(cxx_exception_type); 107 } 108 109 110 /******************************************************************* 111 * _setjmp (MSVCRT.@) 112 */ 113 __ASM_GLOBAL_FUNC(MSVCRT__setjmp, 114 "mov x1, #0\n\t" /* frame */ 115 "b " __ASM_NAME("__wine_setjmpex")); 116 117 /******************************************************************* 118 * longjmp (MSVCRT.@) 119 */ 120 void __cdecl MSVCRT_longjmp(struct MSVCRT___JUMP_BUFFER *jmp, int retval) 121 { 122 EXCEPTION_RECORD rec; 123 124 if (!retval) retval = 1; 125 if (jmp->Frame) 126 { 127 rec.ExceptionCode = STATUS_LONGJUMP; 128 rec.ExceptionFlags = 0; 129 rec.ExceptionRecord = NULL; 130 rec.ExceptionAddress = NULL; 131 rec.NumberParameters = 1; 132 rec.ExceptionInformation[0] = (DWORD_PTR)jmp; 133 RtlUnwind((void *)jmp->Frame, (void *)jmp->Lr, &rec, IntToPtr(retval)); 134 } 135 __wine_longjmp( (__wine_jmp_buf *)jmp, retval ); 136 } 137 138 /********************************************************************* 139 * _fpieee_flt (MSVCRT.@) 140 */ 141 int __cdecl _fpieee_flt(ULONG exception_code, EXCEPTION_POINTERS *ep, 142 int (__cdecl *handler)(_FPIEEE_RECORD*)) 143 { 144 FIXME("(%x %p %p)\n", exception_code, ep, handler); 145 return EXCEPTION_CONTINUE_SEARCH; 146 } 147 148 #endif /* __aarch64__ */ 149