In the el0_sync code, for the case where it is not an svc request, the handle_invalid_entry macro is included. This results in the kernel_entry macro being included again, and the registers being saved again, with register corruption.
If, like me, you're implementing a debugger using a BRK instruction, you've got register corruption after proceeding from a breakpoint.