29#if defined(_M_IX86) && !defined(_MSC_VER)
30#define todo_pseh todo_if(1)
38extern void no_op(
void);
73#define DEFINE_TEST(NAME_) static int NAME_(void)
2426 *((
char*)(
intptr_t)0xc0000000) = 0;
2435#ifdef _USE_NATIVE_SEH
2438 return (
val == 4 ||
val == 3);
2449 *((
char*)(
intptr_t)0xc0000000) = 0;
2458 return (
val == 3) || (
val == 4) || (
val == 5);
2472 register int val1 = 0, val2 = 0;
2481 *((
char*)(
intptr_t)0xc0000000) = 0;
2501 if ((val1 == 10) && (val2 == 5))
2507 if ((val1 == 0) && (val2 == 5))
2511 if (((val1 == 8) && (val2 == 4)) ||
2512 ((val1 == 0) && (val2 == 4)))
2521 unsigned result = 0xdeadbeef;
2540 volatile int val = 0;
2553 *((
char*)(
intptr_t)0xdeadc0de) = 0;
2561 *((
char*)(
intptr_t)0xdeadc0de) = 0;
2570 return (
val == (128|4|2|1));
2575 volatile int val = 0;
2583 *((
char*)(
intptr_t)0xdeadc0de) = 0;
2589 *((
char*)(
intptr_t)0xdeadc0de) = 0;
2595 *((
char*)(
intptr_t)0xdeadc0de) = 0;
2604 return (
val == (1|2|8|128));
2636 trace(
"volatile context corrupted\n");
2658#if defined(_X86_) && !defined(_PSEH3_H_) && !defined(_MSC_VER)
2659 static _SEH2Registration_t * prev_frame;
2660 _SEH2Registration_t passthrough_frame;
2665#if defined(_X86_) && !defined(_PSEH3_H_) && !defined(_MSC_VER)
2667 passthrough_frame.SER_Prev = prev_frame;
2672#if defined(__GNUC__) && defined(__i386__)
2675 "mov %%esp, 0x00 + %c[before]\n"
2676 "mov %%ebp, 0x04 + %c[before]\n"
2677 "mov %%ebx, 0x08 + %c[before]\n"
2678 "mov %%esi, 0x0c + %c[before]\n"
2679 "mov %%edi, 0x10 + %c[before]\n"
2681 "mov %%esp, 0x00 + %c[after]\n"
2682 "mov %%ebp, 0x04 + %c[after]\n"
2683 "mov %%ebx, 0x08 + %c[after]\n"
2684 "mov %%esi, 0x0c + %c[after]\n"
2685 "mov %%edi, 0x10 + %c[after]\n"
2689 "call %c[sanity_check]\n"
2695 "ebx",
"ecx",
"edx",
"esi",
"edi",
"flags",
"memory"
2701#if defined(_X86_) && !defined(_PSEH3_H_) && !defined(_MSC_VER)
2702 if((_SEH2Registration_t *)
__readfsdword(0) != &passthrough_frame || passthrough_frame.SER_Prev != prev_frame)
2704 trace(
"exception registration list corrupted\n");
2717 volatile int count = 0;
2724 *(
volatile int*)0x12345678 = 0x12345678;
2734 return (
count == 1);
2741 volatile int arr[512];
2742 for (
i = 0;
i < 512;
i++)
2749 unsigned long status = 0;
2752 *(
volatile int*)0x12345678 = 0x12345678;
2764#define USE_TEST_NAME_(NAME_) # NAME_
2765#define USE_TEST_NAME(NAME_) USE_TEST_NAME_(NAME_)
2766#define USE_TEST(NAME_) { USE_TEST_NAME(NAME_), NAME_ }
2776typedef struct _SCOPETABLE_ENTRY
2778 unsigned long EnclosingLevel;
2781} SCOPETABLE_ENTRY, *PSCOPETABLE_ENTRY;
2783typedef struct _EH3_EXCEPTION_REGISTRATION
2785 struct _EH3_EXCEPTION_REGISTRATION *
Next;
2786 void* ExceptionHandler;
2788 unsigned long TryLevel;
2789} EH3_EXCEPTION_REGISTRATION, *PEH3_EXCEPTION_REGISTRATION;
2791#define okx(x) ok(x, #x "\n")
2794static void Test_structs_no_seh(
void)
2796 PEH3_EXCEPTION_REGISTRATION EH3Registration = (PEH3_EXCEPTION_REGISTRATION)
__readfsdword(0);
2799 okx(EH3Registration !=
NULL);
2801 okx(EH3Registration->ExceptionHandler !=
NULL);
2802 okx(EH3Registration->ScopeTable !=
NULL);
2803 okx(EH3Registration->TryLevel == 0);
2811 PEH3_EXCEPTION_REGISTRATION* frame,
2816static void Test_structs_seh_except(
void)
2818 PEH3_EXCEPTION_REGISTRATION EH3Registration;
2823 EH3Registration = (PEH3_EXCEPTION_REGISTRATION)
__readfsdword(0);
2824 okx(EH3Registration !=
NULL);
2825 okx(EH3Registration != (
PVOID)0xFFFFFFFF);
2826 okx(EH3Registration->Next != (
PVOID)0xFFFFFFFF);
2827 okx(EH3Registration->ExceptionHandler !=
NULL);
2829 okx(EH3Registration->ExceptionHandler == _except_handler3);
2831 okx(EH3Registration->ScopeTable !=
NULL);
2832 okx(EH3Registration->TryLevel == 0);
2834 okx(
ScopeTable->EnclosingLevel == 0xFFFFFFFF);
2845static void Test_structs_seh_finally(
void)
2847 PEH3_EXCEPTION_REGISTRATION EH3Registration;
2852 EH3Registration = (PEH3_EXCEPTION_REGISTRATION)
__readfsdword(0);
2853 okx(EH3Registration !=
NULL);
2854 okx(EH3Registration != (
PVOID)0xFFFFFFFF);
2855 okx(EH3Registration->Next != (
PVOID)0xFFFFFFFF);
2856 okx(EH3Registration->ExceptionHandler !=
NULL);
2858 okx(EH3Registration->ExceptionHandler == _except_handler3);
2860 okx(EH3Registration->ScopeTable !=
NULL);
2861 okx(EH3Registration->TryLevel == 0);
2863 okx(
ScopeTable->EnclosingLevel == 0xFFFFFFFF);
2874static void Test_structs_seh_nested(
void)
2876 PEH3_EXCEPTION_REGISTRATION EH3Registration1, EH3Registration2, NextHandler;
2881 EH3Registration1 = (PEH3_EXCEPTION_REGISTRATION)
__readfsdword(0);
2882 okx(EH3Registration1 !=
NULL);
2883 okx(EH3Registration1 != (
PVOID)0xFFFFFFFF);
2884 okx(EH3Registration1->Next != (
PVOID)0xFFFFFFFF);
2885 NextHandler = EH3Registration1->Next;
2886 okx(EH3Registration1->TryLevel == 0);
2889 EH3Registration2 = (PEH3_EXCEPTION_REGISTRATION)
__readfsdword(0);
2890 okx(EH3Registration2 == EH3Registration1);
2891 okx(EH3Registration2->ExceptionHandler !=
NULL);
2893 okx(EH3Registration2->ExceptionHandler == _except_handler3);
2895 okx(EH3Registration2->ScopeTable !=
NULL);
2896 okx(EH3Registration2->ScopeTable == EH3Registration1->ScopeTable);
2897 todo_pseh okx(EH3Registration2->TryLevel == 1);
2899 okx(
ScopeTable[0].EnclosingLevel == 0xFFFFFFFF);
2911 okx(EH3Registration1 == (PEH3_EXCEPTION_REGISTRATION)
__readfsdword(0));
2912 okx(EH3Registration1->Next == NextHandler);
2913 okx(EH3Registration1->TryLevel == 0);
2926 Test_structs_no_seh();
2927 Test_structs_seh_except();
2928 Test_structs_seh_finally();
2929 Test_structs_seh_nested();
2932 const struct subtest testsuite[] =
2944 USE_TEST(test_continue_execution_1),
2947 USE_TEST(test_continue_execution_2),
2950 USE_TEST(test_continue_execution_3),
2953 USE_TEST(test_continue_execution_4),
2956 USE_TEST(test_continue_execution_5),
2959 USE_TEST(test_continue_execution_6),
2962 USE_TEST(test_continue_execution_7),
2965 USE_TEST(test_continue_execution_8),
2968 USE_TEST(test_continue_execution_9),
2971 USE_TEST(test_continue_execution_10),
2974 USE_TEST(test_continue_execution_11),
2977 USE_TEST(test_continue_execution_12),
3059 for(
i = 0;
i <
sizeof(testsuite) /
sizeof(testsuite[0]); ++
i)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
@ ExceptionContinueSearch
VOID WINAPI RaiseException(_In_ DWORD dwExceptionCode, _In_ DWORD dwExceptionFlags, _In_ DWORD nNumberOfArguments, _In_opt_ const ULONG_PTR *lpArguments)
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI DECLSPEC_HOTPATCH SetUnhandledExceptionFilter(IN LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
GLuint GLuint GLsizei count
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define EXCEPTION_EXECUTE_HANDLER
#define EXCEPTION_CONTINUE_SEARCH
#define EXCEPTION_CONTINUE_EXECUTION
PPC_QUAL void __writefsdword(const unsigned long Offset, const unsigned long Data)
PPC_QUAL unsigned long __readfsdword(const unsigned long Offset)
#define DECLSPEC_NOINLINE
#define STATUS_ACCESS_VIOLATION
#define _SEH2_AbnormalTermination()
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
__asm__(".p2align 4, 0x90\n" ".seh_proc __seh2_global_filter_func\n" "__seh2_global_filter_func:\n" "\tsub %rbp, %rax\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tsub $32, %rsp\n" "\t.seh_stackalloc 32\n" "\t.seh_endprologue\n" "\tsub %rax, %rdx\n" "\tmov %rdx, %rbp\n" "\tjmp *%r8\n" "__seh2_global_filter_func_exit:\n" "\t.p2align 4\n" "\tadd $32, %rsp\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
#define _SEH2_GetExceptionInformation()
#define _SEH2_YIELD(__stmt)
int const SEH3$_SCOPE_TABLE * ScopeTable
int return_negative_2(void *)
static LONG WINAPI unhandled_exception(PEXCEPTION_POINTERS ExceptionInfo)
static void test_bug_4004_helper_2(void)
static int passthrough_handler(struct _EXCEPTION_RECORD *e, void *f, struct _CONTEXT *c, void *d)
int return_positive_4(void *, int)
static int test_yield_5_ret
#define DEFINE_TEST(NAME_)
static int test_finally_9_helper(void)
static int test_finally_9_ret
int return_minusone_4(void *, int)
static int test_finally_4_helper(void)
int return_minusone_3(int)
int return_positive_2(void *)
static int verify_xcode(int code, int xcode, int *ret, int filter)
static DECLSPEC_NOINLINE int call_test(int(*func)(void))
static int test_yield_1_helper(void)
static void test_finally_14_helper(void)
int return_negative(void)
static int test_yield_6_helper(void)
static int verify_xpointers(struct _EXCEPTION_POINTERS *ep, DWORD code, DWORD flags, DWORD argc, const ULONG_PTR *argv, int *ret, int filter)
static int test_yield_4_helper(void)
int return_negative_4(void *, int)
int return_zero_2(void *)
static void test_bug_4004_helper_1(void)
static int test_yield_2_helper(void)
int return_zero_4(void *, int)
int return_positive_3(int)
void use_lots_of_stack(void)
static int test_finally_4_ret
static int test_yield_3_helper(void)
static int test_finally_14_ret
int return_one_4(void *, int)
static int test_yield_5_helper(void)
static void test_finally_13_helper(void)
static int test_finally_13_ret
static DECLSPEC_NOINLINE int sanity_check(int ret, struct volatile_context *before, struct volatile_context *after)
int return_minusone(void)
static int test_yield_6_ret
int return_negative_3(int)
int return_minusone_2(void *)
int return_positive(void)
static unsigned __int64 next
STDMETHOD() Next(THIS_ ULONG celt, IAssociationElement *pElement, ULONG *pceltFetched) PURE
PEXCEPTION_RECORD ExceptionRecord
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
#define EXCEPTION_NONCONTINUABLE
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl ebx
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx testl eax jnz xchgl ecx incl TEMP esp ecx subl ebx pushl ecx ecx edx ecx shrl ecx mm0 mm4 mm0 mm4 mm1 mm5 mm1 mm5 mm2 mm6 mm2 mm6 mm3 mm7 mm3 mm7 paddd mm0 paddd mm4 paddd mm0 paddd mm4 paddd mm0 paddd mm4 movq mm1 movq mm5 psrlq mm1 psrlq mm5 paddd mm0 paddd mm4 psrad mm0 psrad mm4 packssdw mm0 packssdw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi esi edx edi decl ecx jnz popl ecx andl ecx jecxz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 psrlq mm1 paddd mm0 psrad mm0 packssdw mm0 movd eax movw edi esi edx edi
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx testl eax jnz xchgl ecx incl TEMP esi
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx testl eax jnz xchgl ecx incl TEMP esp ecx subl ebx pushl ecx ecx edx ecx shrl ecx mm0 mm4 mm0 mm4 mm1 mm5 mm1 mm5 mm2 mm6 mm2 mm6 mm3 mm7 mm3 mm7 paddd mm0 paddd mm4 paddd mm0 paddd mm4 paddd mm0 paddd mm4 movq mm1 movq mm5 psrlq mm1 psrlq mm5 paddd mm0 paddd mm4 psrad mm0 psrad mm4 packssdw mm0 packssdw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi esi edx edi decl ecx jnz popl ecx andl ecx jecxz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 psrlq mm1 paddd mm0 psrad mm0 packssdw mm0 movd eax movw edi esi edx esi movl ecx mm0 mm4 mm0 mm4 mm1 mm5 mm1 mm5 mm2 mm6 mm2 mm6 mm3 mm7 mm3 mm7 paddd mm0 paddd mm4 paddd mm0 paddd mm4 paddd mm0 paddd mm4 movq mm1 movq mm5 psrlq mm1 psrlq mm5 paddd mm1 paddd mm5 psrad mm1 psrad mm5 packssdw mm1 packssdw mm5 psubd mm0 psubd mm4 psubsw mm0 psubsw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi subl esi addl edx edi decl ecx jnz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 psrlq mm1 paddd mm1 psrad mm1 packssdw mm1 psubd mm0 psubsw mm0 movd eax movw edi emms popl ebx popl esi popl edi mov ebp
__inline int before(__u32 seq1, __u32 seq2)
__inline int after(__u32 seq1, __u32 seq2)
PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER