3 #include "kernel_thread.h"
5 class App_cpu_thread : public Kernel_thread
8 void bootstrap(Mword resume) asm ("call_ap_bootstrap") FIASCO_FASTCALL;
17 #include "delayloop.h"
20 #include "helping_lock.h"
21 #include "kernel_task.h"
22 #include "processor.h"
23 #include "scheduler.h"
26 #include "thread_state.h"
28 #include "timer_tick.h"
29 #include "spin_lock.h"
33 App_cpu_thread::may_be_create(Cpu_number cpu, bool cpu_never_seen_before)
35 if (!cpu_never_seen_before)
37 kernel_context(cpu)->reset_kernel_sp();
38 return static_cast<Kernel_thread *>(kernel_context(cpu));
41 Kernel_thread *t = new (Ram_quota::root) App_cpu_thread;
45 t->set_current_cpu(cpu);
46 check(t->bind(Kernel_task::kernel_task(), User<Utcb>::Ptr(0)));
51 // the kernel bootstrap routine
54 App_cpu_thread::bootstrap(Mword resume)
56 extern Spin_lock<Mword> _tramp_mp_spinlock;
58 state_change_dirty(0, Thread_ready); // Set myself ready
61 Fpu::init(current_cpu(), resume);
63 // initialize the current_mem_space function to point to the kernel space
64 Kernel_task::kernel_task()->make_current();
66 Mem_unit::tlb_flush();
68 Cpu::cpus.current().set_online(1);
70 _tramp_mp_spinlock.set(1);
74 kernel_context(current_cpu(), this);
75 Sched_context::rq.current().set_idle(this->sched());
77 Timer_tick::setup(current_cpu());
80 Rcu::leave_idle(current_cpu());
81 enable_tlb(current_cpu());
84 // Setup initial timeslice
85 Sched_context::rq.current().set_current_sched(sched());
88 Per_cpu_data::run_late_ctors(current_cpu());
90 Scheduler::scheduler.trigger_hotplug_event();
91 Timer_tick::enable(current_cpu());
95 printf("CPU[%u]: goes to idle loop\n", cxx::int_value<Cpu_number>(current_cpu()));