@@ -36,12 +36,22 @@ LONG CALLBACK ExceptionHandlerCallback(PEXCEPTION_POINTERS ex_info) {
3636 }
3737
3838 HostThreadContext thread_context;
39+
40+ #if XE_ARCH_AMD64
3941 thread_context.rip = ex_info->ContextRecord ->Rip ;
4042 thread_context.eflags = ex_info->ContextRecord ->EFlags ;
4143 std::memcpy (thread_context.int_registers , &ex_info->ContextRecord ->Rax ,
4244 sizeof (thread_context.int_registers ));
4345 std::memcpy (thread_context.xmm_registers , &ex_info->ContextRecord ->Xmm0 ,
4446 sizeof (thread_context.xmm_registers ));
47+ #elif XE_ARCH_ARM64
48+ thread_context.pc = ex_info->ContextRecord ->Pc ;
49+ thread_context.cpsr = ex_info->ContextRecord ->Cpsr ;
50+ std::memcpy (thread_context.x , &ex_info->ContextRecord ->X ,
51+ sizeof (thread_context.x ));
52+ std::memcpy (thread_context.v , &ex_info->ContextRecord ->V ,
53+ sizeof (thread_context.v ));
54+ #endif
4555
4656 // https://msdn.microsoft.com/en-us/library/ms679331(v=vs.85).aspx
4757 // https://msdn.microsoft.com/en-us/library/aa363082(v=vs.85).aspx
@@ -78,6 +88,7 @@ LONG CALLBACK ExceptionHandlerCallback(PEXCEPTION_POINTERS ex_info) {
7888 for (size_t i = 0 ; i < xe::countof (handlers_) && handlers_[i].first ; ++i) {
7989 if (handlers_[i].first (&ex, handlers_[i].second )) {
8090 // Exception handled.
91+ #if XE_ARCH_AMD64
8192 ex_info->ContextRecord ->Rip = thread_context.rip ;
8293 ex_info->ContextRecord ->EFlags = thread_context.eflags ;
8394 uint32_t modified_register_index;
@@ -98,6 +109,28 @@ LONG CALLBACK ExceptionHandlerCallback(PEXCEPTION_POINTERS ex_info) {
98109 &thread_context.xmm_registers [modified_register_index],
99110 sizeof (vec128_t ));
100111 }
112+ #elif XE_ARCH_ARM64
113+ ex_info->ContextRecord ->Pc = thread_context.pc ;
114+ ex_info->ContextRecord ->Cpsr = thread_context.cpsr ;
115+ uint32_t modified_register_index;
116+ uint16_t modified_int_registers_remaining = ex.modified_x_registers ();
117+ while (xe::bit_scan_forward (modified_int_registers_remaining,
118+ &modified_register_index)) {
119+ modified_int_registers_remaining &=
120+ ~(UINT16_C (1 ) << modified_register_index);
121+ ex_info->ContextRecord ->X [modified_register_index] =
122+ thread_context.x [modified_register_index];
123+ }
124+ uint16_t modified_xmm_registers_remaining = ex.modified_v_registers ();
125+ while (xe::bit_scan_forward (modified_xmm_registers_remaining,
126+ &modified_register_index)) {
127+ modified_xmm_registers_remaining &=
128+ ~(UINT16_C (1 ) << modified_register_index);
129+ std::memcpy (&ex_info->ContextRecord ->V + modified_register_index,
130+ &thread_context.v [modified_register_index],
131+ sizeof (vec128_t ));
132+ }
133+ #endif
101134 return EXCEPTION_CONTINUE_EXECUTION;
102135 }
103136 }
0 commit comments