Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/arch/riscv/interrupts.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ void interrupts_arch_ipi_send(cpuid_t target_cpu)
if (USE_ACLINT_IPI()) {
aclint_send_ipi(target_cpu);
} else {
sbi_send_ipi(1UL << target_cpu, 0);
irqc_send_ipi(target_cpu);
}
}

Expand Down Expand Up @@ -85,6 +85,11 @@ void interrupts_arch_handle(void)
stopi = stopi >> TOPI_IID_SHIFT;
switch (stopi) {
case IRQ_S_SOFT:
/**
* This case is executed only by APLIC configuration,
* IPIs sent through IMSIC are handled as external
* interrupts.
*/
interrupts_handle(interrupts_ipi_id);
csrs_sip_clear(SIP_SSIP);
break;
Expand Down
4 changes: 2 additions & 2 deletions src/arch/riscv/irqc/aia/imsic.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ void imsic_inject_pend(size_t guest_file, irqid_t intp_id)
csrs_vsireg_clear(1UL << imsic_eie_bit(intp_id));
}

void imsic_send_msi(cpuid_t target_cpu, irqid_t ipi_id)
void imsic_send_msi(cpuid_t target_cpu)
{
imsic[target_cpu]->s_file.seteipnum_le = ipi_id;
imsic[target_cpu]->s_file.seteipnum_le = interrupts_ipi_id;
}

void imsic_handle(void)
Expand Down
6 changes: 1 addition & 5 deletions src/arch/riscv/irqc/aia/inc/imsic.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,8 @@ void imsic_set_enbl(irqid_t intp_id);
* Only little endian is supported.
*
* @param target_cpu The ID of the target CPU
* @param imsic_file the target interrupt file.
* 0 is the hypervisor interrupt file;
* N is for guest N;
* @param ipi_id The ID of the IPI to send.
*/
void imsic_send_msi(cpuid_t target_cpu, irqid_t ipi_id);
void imsic_send_msi(cpuid_t target_cpu);

/**
* @brief Inject an interrupt into a guest.
Expand Down
5 changes: 2 additions & 3 deletions src/arch/riscv/irqc/aia/inc/irqc.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,12 @@ static inline irqid_t irqc_reserve(irqid_t pintp_id)
#endif
}

static inline void irqc_send_ipi(cpuid_t target_cpu, irqid_t ipi_id)
static inline void irqc_send_ipi(cpuid_t target_cpu)
{
#if (IRQC == APLIC)
UNUSED_ARG(ipi_id);
sbi_send_ipi(1UL << target_cpu, 0);
#elif (IRQC == AIA)
imsic_send_msi(target_cpu, ipi_id);
imsic_send_msi(target_cpu);
#endif
}

Expand Down
3 changes: 1 addition & 2 deletions src/arch/riscv/irqc/plic/inc/irqc.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,8 @@ static inline irqid_t irqc_reserve(irqid_t pintp_id)
return pintp_id;
}

static inline void irqc_send_ipi(cpuid_t target_cpu, irqid_t ipi_id)
static inline void irqc_send_ipi(cpuid_t target_cpu)
{
UNUSED_ARG(ipi_id);
sbi_send_ipi(1UL << target_cpu, 0);
}

Expand Down