aboutsummaryrefslogtreecommitdiff
path: root/src/cpu/x86/mp_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/x86/mp_init.c')
-rw-r--r--src/cpu/x86/mp_init.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c
index f7cf0b418d..ef576ec26d 100644
--- a/src/cpu/x86/mp_init.c
+++ b/src/cpu/x86/mp_init.c
@@ -41,7 +41,8 @@
#define MAX_APIC_IDS 256
struct mp_callback {
- void (*func)(void);
+ void (*func)(void *);
+ void *arg;
};
/*
@@ -191,7 +192,7 @@ static void ap_do_flight_plan(void)
}
}
-static void park_this_cpu(void)
+static void park_this_cpu(void *unused)
{
stop_this_cpu();
}
@@ -222,7 +223,7 @@ static void asmlinkage ap_init(unsigned int cpu)
ap_do_flight_plan();
/* Park the AP. */
- park_this_cpu();
+ park_this_cpu(NULL);
}
static void setup_default_sipi_vector_params(struct sipi_params *sp)
@@ -941,21 +942,22 @@ static void ap_wait_for_instruction(void)
memcpy(&lcb, cb, sizeof(lcb));
mfence();
store_callback(per_cpu_slot, NULL);
- lcb.func();
+ lcb.func(lcb.arg);
}
}
-int mp_run_on_aps(void (*func)(void), long expire_us)
+int mp_run_on_aps(void (*func)(void *), void *arg, long expire_us)
{
- struct mp_callback lcb = { .func = func };
+ struct mp_callback lcb = { .func = func, .arg = arg };
return run_ap_work(&lcb, expire_us);
}
-int mp_run_on_all_cpus(void (*func)(void), long expire_us)
+int mp_run_on_all_cpus(void (*func)(void *), void *arg, long expire_us)
{
/* Run on BSP first. */
- func();
- return mp_run_on_aps(func, expire_us);
+ func(arg);
+
+ return mp_run_on_aps(func, arg, expire_us);
}
int mp_park_aps(void)
@@ -966,7 +968,7 @@ int mp_park_aps(void)
stopwatch_init(&sw);
- ret = mp_run_on_aps(park_this_cpu, 250 * USECS_PER_MSEC);
+ ret = mp_run_on_aps(park_this_cpu, NULL, 250 * USECS_PER_MSEC);
duration_msecs = stopwatch_duration_msecs(&sw);