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