kernel/int: Allow arch_int_assign_to_cpu to make its own decisions.

For now this is used on RISCV64 to indicate that interrupts will always
be on CPU 0. However, in the future, some architectures may want
or require interrupts to be "steered" in various ways, and this
also paves the way for that.

Change-Id: Iec79870cf5c4898d102d0e624de19602271ae772
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4721
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
Reviewed-by: Alex von Gluck IV <kallisti5@unixzen.com>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
This commit is contained in:
Augustin Cavalier 2021-12-01 17:16:57 -05:00 committed by waddlesplash
parent 3316cfc9af
commit 3c2597393c
9 changed files with 25 additions and 16 deletions

View File

@ -34,7 +34,7 @@ void arch_int_enable_io_interrupt(int irq);
void arch_int_disable_io_interrupt(int irq);
void arch_int_configure_io_interrupt(int irq, uint32 config);
bool arch_int_are_interrupts_enabled(void);
void arch_int_assign_to_cpu(int32 irq, int32 cpu);
int32 arch_int_assign_to_cpu(int32 irq, int32 cpu);
#ifdef __cplusplus
}

View File

@ -84,12 +84,14 @@ arch_int_disable_io_interrupt(int irq)
/* arch_int_*_interrupts() and friends are in arch_asm.S */
void
int32
arch_int_assign_to_cpu(int32 irq, int32 cpu)
{
// intentionally left blank; no SMP support (yet)
// Not yet supported.
return 0;
}
static void
print_iframe(const char *event, struct iframe *frame)
{

View File

@ -39,10 +39,11 @@ arch_int_disable_io_interrupt(int irq)
}
void
int32
arch_int_assign_to_cpu(int32 irq, int32 cpu)
{
// intentionally left blank; no SMP support (yet)
// Not yet supported.
return 0;
}

View File

@ -95,10 +95,11 @@ arch_int_disable_io_interrupt(int irq)
/* arch_int_*_interrupts() and friends are in arch_asm.S */
void
int32
arch_int_assign_to_cpu(int32 irq, int32 cpu)
{
// intentionally left blank; no SMP support (yet)
// Not yet supported.
return 0;
}

View File

@ -571,7 +571,9 @@ ppc_set_current_cpu_exception_context(struct ppc_cpu_exception_context *context)
}
void
int32
arch_int_assign_to_cpu(int32 irq, int32 cpu)
{
// Not yet supported.
return 0;
}

View File

@ -549,8 +549,9 @@ arch_int_disable_io_interrupt(int irq)
}
void
int32
arch_int_assign_to_cpu(int32 irq, int32 cpu)
{
// SMP not yet supported
// Not yet supported.
return 0;
}

View File

@ -50,7 +50,9 @@ arch_int_disable_io_interrupt(int irq)
}
void
int32
arch_int_assign_to_cpu(int32 irq, int32 cpu)
{
// Not yet supported.
return 0;
}

View File

@ -424,7 +424,7 @@ arch_int_are_interrupts_enabled(void)
}
void
int32
arch_int_assign_to_cpu(int32 irq, int32 cpu)
{
switch (sVectorSources[irq]) {
@ -440,6 +440,7 @@ arch_int_assign_to_cpu(int32 irq, int32 cpu)
default:
break;
}
return cpu;
}

View File

@ -468,7 +468,7 @@ install_io_interrupt_handler(long vector, interrupt_handler handler, void *data,
&& sVectors[vector].assigned_cpu->cpu == -1) {
int32 cpuID = assign_cpu();
arch_int_assign_to_cpu(vector, cpuID);
cpuID = arch_int_assign_to_cpu(vector, cpuID);
sVectors[vector].assigned_cpu->cpu = cpuID;
cpu_ent* cpu = &gCPU[cpuID];
@ -743,10 +743,9 @@ void assign_io_interrupt_to_cpu(long vector, int32 newCPU)
list_remove_item(&cpu->irqs, sVectors[vector].assigned_cpu);
locker.Unlock();
newCPU = arch_int_assign_to_cpu(vector, newCPU);
sVectors[vector].assigned_cpu->cpu = newCPU;
cpu = &gCPU[newCPU];
locker.SetTo(cpu->irqs_lock, false);
sVectors[vector].assigned_cpu->cpu = newCPU;
arch_int_assign_to_cpu(vector, newCPU);
list_add_item(&cpu->irqs, sVectors[vector].assigned_cpu);
}