In the meantime I will review your patch.
In Firmware First Handling (FFH), all external aborts are trapped to EL3, they can be notified to OS/VM using SDEI or by reinjecting SEA. SDEI is imprecise exception and asynchronous.
GHES driver defines SEA as the only synchronous mechanism (
https://github.com/torvalds/linux/blob/master/drivers/acpi/apei/ghes.c#L118),
hence SEA reinjection is useful for SEA's where OS/VM takes appropriate action.
For example when an user space application running at EL0 consumes a poisoned memory by re-throwing SEA the kernel can terminate the individual application.
For SEA Reinjection we need to figure out the right EL to reinject the SEA to and then copy ESR_EL3, SPSR_EL3, ELR_EL3 and FAR_EL3 to target ELs respective registers and calculate new PSTATE for EL3.
To find target_el reference code is provided in SyncExternalAbortTarget (J1.3.2.7) in ARM DDI 0487L.a.