Skip to content
Snippets Groups Projects
Commit 6342bab2 authored by Claudio Fontana's avatar Claudio Fontana
Browse files

aarch64: smp: prepare GIC initialization per cpu


arch::init_on_cpu should initialize the gic cpu interface,
but not for the boot CPU, for which this has already been
done.

Signed-off-by: default avatarClaudio Fontana <claudio.fontana@huawei.com>
parent 8f0c38ff
No related branches found
No related tags found
No related merge requests found
......@@ -13,6 +13,7 @@
#include "processor.hh"
#include "osv/pagealloc.hh"
#include <osv/debug.h>
#include "exceptions.hh"
namespace sched {
......@@ -20,11 +21,8 @@ struct arch_cpu;
struct arch_thread;
struct arch_cpu {
arch_cpu();
unsigned int gic_id;
void init_on_cpu();
int smp_idx;
};
struct arch_thread {
......@@ -36,13 +34,13 @@ struct arch_fpu {
void restore() { processor::fpu_state_load(&s); }
};
inline arch_cpu::arch_cpu()
{
}
inline void arch_cpu::init_on_cpu()
{
processor::halt_no_interrupts();
if (this->smp_idx != 0) {
gic::gic->init_cpu(this->smp_idx);
}
idt.enable_irqs();
}
}
......
......@@ -8,6 +8,7 @@
#include <osv/debug.h>
#include <osv/sched.hh>
#include <osv/prio.hh>
#include <osv/printf.hh>
volatile unsigned smp_processors = 1;
......@@ -23,7 +24,26 @@ sched::cpu* smp_initial_find_current_cpu()
void __attribute__((constructor(init_prio::sched))) smp_init()
{
auto c = new sched::cpu(0);
c->arch.gic_id = 0;
c->arch.smp_idx = 0;
sched::cpus.push_back(c);
sched::current_cpu = sched::cpus[0];
}
void smp_launch()
{
auto boot_cpu = smp_initial_find_current_cpu();
for (auto c : sched::cpus) {
auto name = osv::sprintf("balancer%d", c->id);
if (c == boot_cpu) {
sched::thread::current()->_detached_state->_cpu = c;
// c->init_on_cpu() already done in main().
(new sched::thread([c] { c->load_balance(); },
sched::thread::attr().pin(c).name(name)))->start();
c->init_idle_thread();
c->idle_thread->start();
continue;
} else {
abort();
}
}
}
......@@ -11,5 +11,6 @@
#include <osv/sched.hh>
sched::cpu* smp_initial_find_current_cpu();
void smp_launch();
#endif /* ARCH_SMP_HH_ */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment