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 #ifdef __aarch64__ 24 25 #include <setjmp.h> 26 #include <stdarg.h> 27 #include <fpieee.h> 28 29 #include "ntstatus.h" 30 #define WIN32_NO_STATUS 31 #include "windef.h" 32 #include "winbase.h" 33 #include "winternl.h" 34 #include "msvcrt.h" 35 #include "wine/exception.h" 36 #include "excpt.h" 37 #include "wine/debug.h" 38 39 #include "cppexcept.h" 40 41 WINE_DEFAULT_DEBUG_CHANNEL(seh); 42 43 44 /********************************************************************* 45 * __CxxExceptionFilter (MSVCRT.@) 46 */ 47 int CDECL __CxxExceptionFilter( PEXCEPTION_POINTERS ptrs, 48 const type_info *ti, int flags, void **copy ) 49 { 50 FIXME( "%p %p %x %p: not implemented\n", ptrs, ti, flags, copy ); 51 return EXCEPTION_CONTINUE_SEARCH; 52 } 53 54 /********************************************************************* 55 * __CxxFrameHandler (MSVCRT.@) 56 */ 57 EXCEPTION_DISPOSITION CDECL __CxxFrameHandler(EXCEPTION_RECORD *rec, DWORD frame, CONTEXT *context, 58 DISPATCHER_CONTEXT *dispatch) 59 { 60 FIXME("%p %x %p %p: not implemented\n", rec, frame, context, dispatch); 61 return ExceptionContinueSearch; 62 } 63 64 65 /********************************************************************* 66 * __CppXcptFilter (MSVCRT.@) 67 */ 68 int CDECL __CppXcptFilter(NTSTATUS ex, PEXCEPTION_POINTERS ptr) 69 { 70 /* only filter c++ exceptions */ 71 if (ex != CXX_EXCEPTION) return EXCEPTION_CONTINUE_SEARCH; 72 return _XcptFilter(ex, ptr); 73 } 74 75 76 /********************************************************************* 77 * __CxxDetectRethrow (MSVCRT.@) 78 */ 79 BOOL CDECL __CxxDetectRethrow(PEXCEPTION_POINTERS ptrs) 80 { 81 PEXCEPTION_RECORD rec; 82 83 if (!ptrs) 84 return FALSE; 85 86 rec = ptrs->ExceptionRecord; 87 88 if (rec->ExceptionCode == CXX_EXCEPTION && 89 rec->NumberParameters == 3 && 90 rec->ExceptionInformation[0] == CXX_FRAME_MAGIC_VC6 && 91 rec->ExceptionInformation[2]) 92 { 93 ptrs->ExceptionRecord = msvcrt_get_thread_data()->exc_record; 94 return TRUE; 95 } 96 return (msvcrt_get_thread_data()->exc_record == rec); 97 } 98 99 100 /********************************************************************* 101 * __CxxQueryExceptionSize (MSVCRT.@) 102 */ 103 unsigned int CDECL __CxxQueryExceptionSize(void) 104 { 105 return sizeof(cxx_exception_type); 106 } 107 108 109 /******************************************************************* 110 * _setjmp (MSVCRT.@) 111 */ 112 __ASM_GLOBAL_FUNC(MSVCRT__setjmp, 113 "b " __ASM_NAME("__wine_setjmpex")); 114 115 /******************************************************************* 116 * longjmp (MSVCRT.@) 117 */ 118 void __cdecl MSVCRT_longjmp(_JUMP_BUFFER *jmp, int retval) 119 { 120 EXCEPTION_RECORD rec; 121 122 if (!retval) retval = 1; 123 if (jmp->Frame) 124 { 125 rec.ExceptionCode = STATUS_LONGJUMP; 126 rec.ExceptionFlags = 0; 127 rec.ExceptionRecord = NULL; 128 rec.ExceptionAddress = NULL; 129 rec.NumberParameters = 1; 130 rec.ExceptionInformation[0] = (DWORD_PTR)jmp; 131 RtlUnwind((void *)jmp->Frame, (void *)jmp->Lr, &rec, IntToPtr(retval)); 132 } 133 __wine_longjmp( (__wine_jmp_buf *)jmp, retval ); 134 } 135 136 /********************************************************************* 137 * _fpieee_flt (MSVCRT.@) 138 */ 139 int __cdecl _fpieee_flt(__msvcrt_ulong exception_code, EXCEPTION_POINTERS *ep, 140 int (__cdecl *handler)(_FPIEEE_RECORD*)) 141 { 142 FIXME("(%lx %p %p)\n", exception_code, ep, handler); 143 return EXCEPTION_CONTINUE_SEARCH; 144 } 145 146 #endif /* __aarch64__ */ 147