tracesys:
        ; save EFA in case tracer wants the PC of traced task
        ; using ERET won't work since next-PC has already committed
+       lr  r12, [efa]
        GET_CURR_TASK_FIELD_PTR   TASK_THREAD, r11
        st  r12, [r11, THREAD_FAULT_ADDR]       ; thread.fault_address
 
 ; Breakpoint TRAP
 ; ---------------------------------------------
 trap_with_param:
-       mov r0, r12     ; EFA in case ptracer/gdb wants stop_pc
+
+       ; stop_pc info by gdb needs this info
+       lr  r0, [efa]
        mov r1, sp
 
+       ; Now that we have read EFA, it is safe to do "fake" rtie
+       ;   and get out of CPU exception mode
+       FAKE_RET_FROM_EXCPN
+
        ; Save callee regs in case gdb wants to have a look
        ; SP will grow up by size of CALLEE Reg-File
        ; NOTE: clobbers r12
 
        EXCEPTION_PROLOGUE
 
-       lr  r12, [efa]
-
-       FAKE_RET_FROM_EXCPN
-
        ;============ TRAP 1   :breakpoints
        ; Check ECR for trap with arg (PROLOGUE ensures r9 has ECR)
        bmsk.f 0, r9, 7
 
        ;============ TRAP  (no param): syscall top level
 
+       ; First return from Exception to pure K mode (Exception/IRQs renabled)
+       FAKE_RET_FROM_EXCPN
+
        ; If syscall tracing ongoing, invoke pre-post-hooks
        GET_CURR_THR_INFO_FLAGS   r10
        btst r10, TIF_SYSCALL_TRACE