kernel/smp: add call_single_cpu()

to call a function on the target cpu. Early mechanism not available.

Change-Id: I9d049e618c319c59729d1ab53fb313b748f82315
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3212
Reviewed-by: Axel Dörfler <[email protected]>
This commit is contained in:
Jérôme Duval
2020-09-15 20:42:14 +00:00
parent b05b0c1c29
commit 026c8b9c04
2 changed files with 44 additions and 0 deletions
+5
View File
@@ -91,6 +91,11 @@ int32 smp_get_current_cpu(void);
int smp_intercpu_int_handler(int32 cpu);
void call_single_cpu(uint32 targetCPU, void (*func)(void*, int), void* cookie);
void call_single_cpu_sync(uint32 targetCPU, void (*func)(void*, int),
void* cookie);
#ifdef __cplusplus
}
#endif
+39
View File
@@ -1489,6 +1489,45 @@ smp_get_current_cpu(void)
}
static void
_call_single_cpu(uint32 targetCPU, void (*func)(void*, int), void* cookie, bool sync)
{
cpu_status state = disable_interrupts();
if (targetCPU == (uint32)smp_get_current_cpu()) {
func(cookie, smp_get_current_cpu());
restore_interrupts(state);
return;
}
if (!sICIEnabled) {
// Early mechanism not available
panic("call_single_cpu is not yet available");
restore_interrupts(state);
return;
}
smp_send_ici(targetCPU, SMP_MSG_CALL_FUNCTION, (addr_t)cookie,
0, 0, (void*)func, sync ? SMP_MSG_FLAG_SYNC : SMP_MSG_FLAG_ASYNC);
restore_interrupts(state);
}
void
call_single_cpu(uint32 targetCPU, void (*func)(void*, int), void* cookie)
{
return _call_single_cpu(targetCPU, func, cookie, false);
}
void
call_single_cpu_sync(uint32 targetCPU, void (*func)(void*, int), void* cookie)
{
return _call_single_cpu(targetCPU, func, cookie, true);
}
// #pragma mark - public exported functions