commit | 0d725f51be69a9f3c5739f54e4d8d550ea0b5530 | [log] [tgz] |
---|---|---|
author | Olivier Deprez <olivier.deprez@arm.com> | Wed Jul 06 14:20:27 2022 +0200 |
committer | Olivier Deprez <olivier.deprez@arm.com> | Tue Jul 12 15:37:47 2022 +0200 |
tree | b975fa6a7d6d163b6dfe50dee94f72345241f24f | |
parent | b655639e498fd759793dbc3db89ca5eea79c3b13 [diff] [blame] |
fix: VM/SP pre-emption by NS interrupt On SP vCPU pre-emption by an NS interrupt (without managed exit), the SPMC is expected to use the FFA_INTERRUPT reporting interface and pass the VM id/vCPU index of the pre-empted execution context. This permits the normal world driver to resume the vCPU once it has handled the NS interrupt, as mentioned by FF-A v1.1 EAC0 section 12.4.1 bullet 1. Change [1] broke this assumption because of different expectations for the Hafnium driver [2] and the upstream FF-A kernel driver [3]. Restore api_preempt to pass FFA_INTERRUPT with VM id/vCPU index. The Hafnium driver shouldn't be affected as in the case of VM pre-emption it gets the same VM/vCPU ids (as opposed to zeros) as return from last FFA_RUN and then proceeds with a fresh FFA_RUN invocation. [1] https://review.trustedfirmware.org/c/hafnium/hafnium/+/6547/4/src/api.c#b247 [2] https://review.trustedfirmware.org/c/hafnium/driver/linux/+/6545/2/main.c [3] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/firmware/arm_ffa/driver.c?h=v5.15.52#n338 Signed-off-by: Olivier Deprez <olivier.deprez@arm.com> Change-Id: I84ee7623230c186b80e8fa771d9f74236f73d629
diff --git a/src/api.c b/src/api.c index 303b5ab..79095f9 100644 --- a/src/api.c +++ b/src/api.c
@@ -241,6 +241,7 @@ { struct ffa_value ret = { .func = FFA_INTERRUPT_32, + .arg1 = ffa_vm_vcpu(current->vm->id, vcpu_index(current)), }; return api_switch_to_primary(current, ret, VCPU_STATE_PREEMPTED);