In contrast to other synchronous exceptions and interrupts, on ECALL you do not want to return to xepc but to xepc + 4. Otherwise you are returning to the ECALL itself and you are in an infinite loop.
I would propose adding epc to the argument registers written upon a synchronous exception.
It then does not have to be saved to the stack on entry.