From 8a0002de43f71b68876a3cead4cd5a43dfa6a8b5 Mon Sep 17 00:00:00 2001 From: asvitkine <> Date: Thu, 8 Apr 2010 03:53:27 +0000 Subject: [PATCH] [Joel Mauras] GCC has become too smart - we need to slice the binary created to be sure the address of the trap is within the test addresses. This is why each trap occurs between two case labels and a new section of assembly code is set in between. --- BasiliskII/src/Unix/sigsegv.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/BasiliskII/src/Unix/sigsegv.cpp b/BasiliskII/src/Unix/sigsegv.cpp index dafbefc1..dd26ab0f 100644 --- a/BasiliskII/src/Unix/sigsegv.cpp +++ b/BasiliskII/src/Unix/sigsegv.cpp @@ -3182,6 +3182,7 @@ static sigsegv_return_t sigsegv_insn_handler(sigsegv_info_t *sip) const sigsegv_address_t instruction_address = sigsegv_get_fault_instruction_address(sip); #if DEBUG printf("sigsegv_insn_handler(%p, %p)\n", fault_address, instruction_address); + printf("expected instruction address range: %p-%p\n", b_region, e_region); #endif if (((sigsegv_uintptr_t)fault_address - (sigsegv_uintptr_t)page) < page_size) { #ifdef __GNUC__ @@ -3326,17 +3327,48 @@ int main(void) #ifdef __GNUC__ b_region = &&L_b_region2; e_region = &&L_e_region2; +#ifdef DEBUG + printf("switch footage : \n"); + printf(" 4 : %p\n", &&L_b_4_region2); + printf(" 5 : %p\n", &&L_b_5_region2); + printf(" 8 : %p\n", &&L_b_8_region2); + printf(" 6 : %p\n", &&L_b_6_region2); + printf(" 7 : %p\n", &&L_b_7_region2); + printf(" 9 : %p\n", &&L_b_9_region2); + printf(" 1 : %p\n", &&L_b_1_region2); +#endif #endif switch (label_hack) { case 3: L_b_region2: TEST_SKIP_INSTRUCTION(unsigned char); + BARRIER(); + case 4: + L_b_4_region2: TEST_SKIP_INSTRUCTION(unsigned short); + BARRIER(); + case 5: + L_b_5_region2: TEST_SKIP_INSTRUCTION(unsigned int); + BARRIER(); + case 8: + L_b_8_region2: TEST_SKIP_INSTRUCTION(unsigned long); + BARRIER(); + case 6: + L_b_6_region2: TEST_SKIP_INSTRUCTION(signed char); + BARRIER(); + case 7: + L_b_7_region2: TEST_SKIP_INSTRUCTION(signed short); + BARRIER(); + case 9: + L_b_9_region2: TEST_SKIP_INSTRUCTION(signed int); + BARRIER(); + case 1: + L_b_1_region2: TEST_SKIP_INSTRUCTION(signed long); BARRIER(); // fall-through