3 #include "assert_opt.h"
11 #include "mem_layout.h"
12 #include "sigma0_task.h"
14 #include "thread_object.h"
16 #include "ram_quota.h"
18 enum Default_base_caps
33 Kernel_thread::init_workload()
35 auto g = lock_guard(cpu_lock);
38 !Koptions::o()->opt(Koptions::F_nojdb) &&
39 Koptions::o()->opt(Koptions::F_jdb_cmd))
41 // extract the control sequence from the command line
43 char const *s = Koptions::o()->jdb_cmd;
46 for (d=ctrl; d < ctrl+sizeof(ctrl)-1 && *s && *s != ' '; *d++ = *s++)
50 kdb_ke_sequence(ctrl);
53 // kernel debugger rendezvous
54 if (Koptions::o()->opt(Koptions::F_wait))
61 Task *sigma0 = Task::create<Sigma0_task>(Ram_quota::root,
62 L4_fpage::mem(Mem_layout::Utcb_addr, Config::PAGE_SHIFT));
65 // prevent deletion of this thing
68 init_mapdb_mem(sigma0);
69 init_mapdb_io(sigma0);
71 check (map(sigma0, sigma0, sigma0, C_task, 0));
72 check (map(Factory::root(), sigma0, sigma0, C_factory, 0));
74 for (unsigned c = Initial_kobjects::First_cap; c < Initial_kobjects::End_cap; ++c)
76 Kobject_iface *o = initial_kobjects.obj(c);
78 check(map(o, sigma0, sigma0, c, 0));
81 Thread_object *sigma0_thread = new (Ram_quota::root) Thread_object();
83 assert_kdb(sigma0_thread);
85 // prevent deletion of this thing
86 sigma0_thread->inc_ref();
87 check (map(sigma0_thread, sigma0, sigma0, C_thread, 0));
89 Address sp = init_workload_s0_stack();
90 check (sigma0_thread->control(Thread_ptr(false), Thread_ptr(false)) == 0);
91 check (sigma0_thread->bind(sigma0, User<Utcb>::Ptr((Utcb*)Mem_layout::Utcb_addr)));
92 check (sigma0_thread->ex_regs(Kip::k()->sigma0_ip, sp));
95 // create the boot task
98 Task *boot_task = Task::create<Task>(Ram_quota::root,
99 L4_fpage::mem(Mem_layout::Utcb_addr, Config::PAGE_SHIFT+2));
101 assert_opt (boot_task);
103 // prevent deletion of this thing
104 boot_task->inc_ref();
106 Thread_object *boot_thread = new (Ram_quota::root) Thread_object();
108 assert_kdb (boot_thread);
110 // prevent deletion of this thing
111 boot_thread->inc_ref();
113 check (map(boot_task, boot_task, boot_task, C_task, 0));
114 check (map(boot_thread, boot_task, boot_task, C_thread, 0));
116 check (boot_thread->control(Thread_ptr(C_pager), Thread_ptr(~0UL)) == 0);
117 check (boot_thread->bind(boot_task, User<Utcb>::Ptr((Utcb*)Mem_layout::Utcb_addr)));
118 check (boot_thread->ex_regs(Kip::k()->root_ip, Kip::k()->root_sp));
120 Ipc_gate *s0_b_gate = Ipc_gate::create(Ram_quota::root, sigma0_thread, 4 << 4);
123 check (map(s0_b_gate, boot_task, boot_task, C_pager, 0));
125 set_cpu_of(sigma0_thread, 0);
126 set_cpu_of(boot_thread, 0);
128 sigma0_thread->activate();
129 check (obj_map(sigma0, C_factory, 1, boot_task, C_factory, 0).error() == 0);
130 for (unsigned c = Initial_kobjects::First_cap; c < Initial_kobjects::End_cap; ++c)
132 Kobject_iface *o = initial_kobjects.obj(c);
134 check(obj_map(sigma0, c, 1, boot_task, c, 0).error() == 0);
137 boot_thread->activate();
140 IMPLEMENTATION [ia32,amd64]:
144 Kernel_thread::init_workload_s0_stack()
146 // push address of kernel info page to sigma0's stack
147 Address sp = Kip::k()->sigma0_sp - sizeof(Mword);
148 // assume we run in kdir 1:1 mapping
149 *reinterpret_cast<Address*>(sp) = Kmem::virt_to_phys(Kip::k());
153 IMPLEMENTATION [ux,arm,ppc32,sparc]:
157 Kernel_thread::init_workload_s0_stack()
158 { return Kip::k()->sigma0_sp; }