feat(interrupts): enable secure interrupt by default
As soon as interrupts are declared in the partition manifest, SPMC
enables the secure interrupts for S-EL0 partitions at the virtual
interrupt controller interface.
Change-Id: I2336e4249ded4ff36485d97222c23672927e5de0
Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
diff --git a/src/arch/aarch64/plat/ffa/absent.c b/src/arch/aarch64/plat/ffa/absent.c
index 5f62591..a07313c 100644
--- a/src/arch/aarch64/plat/ffa/absent.c
+++ b/src/arch/aarch64/plat/ffa/absent.c
@@ -510,10 +510,11 @@
return false;
}
-void plat_ffa_enable_virtual_maintenance_interrupts(
- struct vcpu_locked current_locked)
+void plat_ffa_enable_virtual_interrupts(struct vcpu_locked current_locked,
+ struct vm_locked vm_locked)
{
(void)current_locked;
+ (void)vm_locked;
}
struct ffa_value plat_ffa_other_world_mem_send(
diff --git a/src/arch/aarch64/plat/ffa/hypervisor.c b/src/arch/aarch64/plat/ffa/hypervisor.c
index 4c3fd10..13767f7 100644
--- a/src/arch/aarch64/plat/ffa/hypervisor.c
+++ b/src/arch/aarch64/plat/ffa/hypervisor.c
@@ -1040,10 +1040,22 @@
return false;
}
-void plat_ffa_enable_virtual_maintenance_interrupts(
- struct vcpu_locked current_locked)
+/**
+ * Enable relevant virtual interrupts for VMs.
+ */
+void plat_ffa_enable_virtual_interrupts(struct vcpu_locked current_locked,
+ struct vm_locked vm_locked)
{
- (void)current_locked;
+ struct vcpu *current;
+ struct interrupts *interrupts;
+
+ current = current_locked.vcpu;
+ interrupts = ¤t->interrupts;
+
+ if (vm_locked.vm->notifications.enabled) {
+ vcpu_virt_interrupt_set_enabled(interrupts,
+ HF_NOTIFICATION_PENDING_INTID);
+ }
}
/** Forwards a memory send message on to the other world. */
diff --git a/src/arch/aarch64/plat/ffa/spmc.c b/src/arch/aarch64/plat/ffa/spmc.c
index 010a85d..375f0a1 100644
--- a/src/arch/aarch64/plat/ffa/spmc.c
+++ b/src/arch/aarch64/plat/ffa/spmc.c
@@ -2462,7 +2462,7 @@
sl_unlock(¤t->lock);
}
-void plat_ffa_enable_virtual_maintenance_interrupts(
+static void plat_ffa_enable_virtual_maintenance_interrupts(
struct vcpu_locked current_locked)
{
struct vcpu *current;
@@ -2534,3 +2534,41 @@
dlog_verbose("Invalid handle %#x for FFA_MEM_RECLAIM.\n", handle);
return ffa_error(FFA_INVALID_PARAMETERS);
}
+
+/**
+ * Enable relevant virtual interrupts for Secure Partitions.
+ * For all SPs, any applicable virtual maintenance interrupts are enabled.
+ * Additionally, for S-EL0 partitions, all the interrupts declared in the
+ * partition manifest are enabled at the virtual interrupt controller
+ * interface early during the boot stage as an S-EL0 SP need not call
+ * HF_INTERRUPT_ENABLE hypervisor ABI explicitly.
+ */
+void plat_ffa_enable_virtual_interrupts(struct vcpu_locked current_locked,
+ struct vm_locked vm_locked)
+{
+ struct vcpu *current;
+ struct interrupts *interrupts;
+ struct vm *vm;
+
+ current = current_locked.vcpu;
+ interrupts = ¤t->interrupts;
+ vm = current->vm;
+ assert(vm == vm_locked.vm);
+
+ if (vm->el0_partition) {
+ for (uint32_t k = 0; k < VM_MANIFEST_MAX_INTERRUPTS; k++) {
+ struct interrupt_descriptor int_desc;
+
+ int_desc = vm_locked.vm->interrupt_desc[k];
+
+ /* Interrupt descriptors are populated contiguously. */
+ if (!interrupt_desc_get_valid(int_desc)) {
+ break;
+ }
+ vcpu_virt_interrupt_set_enabled(interrupts,
+ int_desc.interrupt_id);
+ }
+ }
+
+ plat_ffa_enable_virtual_maintenance_interrupts(current_locked);
+}
diff --git a/src/arch/fake/hypervisor/ffa.c b/src/arch/fake/hypervisor/ffa.c
index f197f2f..fcb4bf7 100644
--- a/src/arch/fake/hypervisor/ffa.c
+++ b/src/arch/fake/hypervisor/ffa.c
@@ -483,10 +483,11 @@
return false;
}
-void plat_ffa_enable_virtual_maintenance_interrupts(
- struct vcpu_locked current_locked)
+void plat_ffa_enable_virtual_interrupts(struct vcpu_locked current_locked,
+ struct vm_locked vm_locked)
{
(void)current_locked;
+ (void)vm_locked;
}
struct ffa_value plat_ffa_other_world_mem_send(
diff --git a/src/load.c b/src/load.c
index 0e277e6..764e4b9 100644
--- a/src/load.c
+++ b/src/load.c
@@ -806,8 +806,8 @@
vcpu_locked = vcpu_lock(vcpu);
- /* Enable virtual maintenance interrupts for Secure Partitions. */
- plat_ffa_enable_virtual_maintenance_interrupts(vcpu_locked);
+ /* Enable relevant virtual interrupts for Secure Partitions. */
+ plat_ffa_enable_virtual_interrupts(vcpu_locked, vm_locked);
if (has_fdt) {
vcpu_secondary_reset_and_start(vcpu_locked, secondary_entry,