diff options
author | Richard Braun <rbraun@sceen.net> | 2013-03-14 22:26:24 +0100 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2013-03-14 22:26:24 +0100 |
commit | ed09fa58fb5778d943b2636b13c873fa68d4daac (patch) | |
tree | 48f641ccf52688c23b4d8883bc13af17be7836ac /kern/kernel.c | |
parent | fd051e1e8b2cae9a302c08ff6df76b98ea6fe58e (diff) |
kern/{kernel,thread}: rework initialization
Make cpu_count() available on kernel entry so that modules (and in particular
the thread module) can allocate per-CPU resources from the BSP. This makes
the initial state stable and simplifies code (no need to check for a transient
early initialization state).
Diffstat (limited to 'kern/kernel.c')
-rw-r--r-- | kern/kernel.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/kern/kernel.c b/kern/kernel.c index 07a0f660..93c0c19c 100644 --- a/kern/kernel.c +++ b/kern/kernel.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012 Richard Braun. + * Copyright (c) 2011, 2012, 2013 Richard Braun. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,12 +27,17 @@ kernel_main(void) { assert(!cpu_intr_enabled()); + /* Enable interrupts to allow inter-processor pmap updates */ + cpu_intr_enable(); + + /* Initialize the kernel */ task_setup(); thread_setup(); - cpu_intr_enable(); - cpu_mp_setup(); + /* Rendezvous with APs */ + cpu_mp_sync(); + /* Run the scheduler */ thread_run(); /* Never reached */ @@ -43,9 +48,16 @@ kernel_ap_main(void) { assert(!cpu_intr_enabled()); + /* + * Enable interrupts to allow inter-processor pmap updates while the BSP + * is initializing the kernel. + */ cpu_intr_enable(); + + /* Wait for the BSP to complete kernel initialization */ cpu_ap_sync(); + /* Run the scheduler */ thread_run(); /* Never reached */ |