3 #include "kernel_thread.h"
5 class App_cpu_thread : public Kernel_thread
8 void bootstrap() 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(unsigned cpu, bool cpu_never_seen_before)
35 if (!cpu_never_seen_before)
36 return static_cast<Kernel_thread *>(kernel_context(cpu));
38 Kernel_thread *t = new (Ram_quota::root) App_cpu_thread;
42 check(t->bind(Kernel_task::kernel_task(), User<Utcb>::Ptr(0)));
47 // the kernel bootstrap routine
50 App_cpu_thread::bootstrap()
52 extern Spin_lock<Mword> _tramp_mp_spinlock;
54 state_change_dirty(0, Thread_ready); // Set myself ready
59 // initialize the current_mem_space function to point to the kernel space
60 Kernel_task::kernel_task()->make_current();
62 Mem_unit::tlb_flush();
64 Cpu::cpus.current().set_online(1);
66 _tramp_mp_spinlock.set(1);
68 kernel_context(cpu(true), this);
69 Sched_context::rq.current().set_idle(this->sched());
70 Rcu::leave_idle(cpu(true));
72 Timer_tick::setup(cpu(true));
73 Timer_tick::enable(cpu(true));
74 enable_tlb(cpu(true));
75 // Setup initial timeslice
76 Sched_context::rq.current().set_current_sched(sched());
78 Per_cpu_data::run_late_ctors(cpu(true));
80 Scheduler::scheduler.trigger_hotplug_event();
84 printf("CPU[%u]: goes to idle loop\n", cpu(true));