10 #include "mem_layout.h"
11 #include "mem_space_sigma0.h"
13 #include "thread_object.h"
15 #include "ram_quota.h"
17 enum Default_base_caps
29 struct Sigma0_space_factory
31 static void create(Mem_space *v, Ram_quota *q)
32 { new (v) Mem_space_sigma0(q); }
35 template< typename S >
36 static void create(S *v)
44 Kernel_thread::init_workload()
46 Lock_guard<Cpu_lock> g(&cpu_lock);
49 !Koptions::o()->opt(Koptions::F_nojdb) &&
50 Koptions::o()->opt(Koptions::F_jdb_cmd))
52 // extract the control sequence from the command line
54 char const *s = Koptions::o()->jdb_cmd;
57 for (d=ctrl; d < ctrl+sizeof(ctrl)-1 && *s && *s != ' '; *d++ = *s++)
60 printf("JDB: exec cmd '%s'\n", ctrl);
61 kdb_ke_sequence(ctrl);
64 // kernel debugger rendezvous
65 if (Koptions::o()->opt(Koptions::F_wait))
72 Task *sigma0 = Task::create(Sigma0_space_factory(), Ram_quota::root,
73 L4_fpage::mem(Mem_layout::Utcb_addr, Config::PAGE_SHIFT));
77 // prevent deletion of this thing
80 check (sigma0->initialize());
81 check (map(sigma0, sigma0->obj_space(), sigma0, C_task, 0));
82 check (map(Factory::root(), sigma0->obj_space(), sigma0, C_factory, 0));
84 for (unsigned c = Initial_kobjects::First_cap; c < Initial_kobjects::End_cap; ++c)
86 Kobject_iface *o = initial_kobjects.obj(c);
88 check(map(o, sigma0->obj_space(), sigma0, c, 0));
91 sigma0_space = sigma0->mem_space();
93 Thread_object *sigma0_thread = new (Ram_quota::root) Thread_object();
95 assert_kdb(sigma0_thread);
97 // prevent deletion of this thing
98 sigma0_thread->inc_ref();
99 check (map(sigma0_thread, sigma0->obj_space(), sigma0, C_thread, 0));
101 Address sp = init_workload_s0_stack();
102 check (sigma0_thread->control(Thread_ptr(false), Thread_ptr(false)) == 0);
103 check (sigma0_thread->bind(sigma0, User<Utcb>::Ptr((Utcb*)Mem_layout::Utcb_addr)));
104 check (sigma0_thread->ex_regs(Kip::k()->sigma0_ip, sp));
107 // create the boot task
110 boot_task = Task::create(Space::Default_factory(), Ram_quota::root,
111 L4_fpage::mem(Mem_layout::Utcb_addr, Config::PAGE_SHIFT+2));
114 check (boot_task->initialize());
116 // prevent deletion of this thing
117 boot_task->inc_ref();
119 Thread_object *boot_thread = new (Ram_quota::root) Thread_object();
121 assert_kdb (boot_thread);
123 // prevent deletion of this thing
124 boot_thread->inc_ref();
126 check (map(boot_task, boot_task->obj_space(), boot_task, C_task, 0));
127 check (map(boot_thread, boot_task->obj_space(), boot_task, C_thread, 0));
129 check (boot_thread->control(Thread_ptr(C_pager), Thread_ptr(~0UL)) == 0);
130 check (boot_thread->bind(boot_task, User<Utcb>::Ptr((Utcb*)Mem_layout::Utcb_addr)));
131 check (boot_thread->ex_regs(Kip::k()->root_ip, Kip::k()->root_sp));
133 Ipc_gate *s0_b_gate = Ipc_gate::create(Ram_quota::root, sigma0_thread, 4 << 4);
136 check (map(s0_b_gate, boot_task->obj_space(), boot_task, C_pager, 0));
138 set_cpu_of(sigma0_thread, 0);
139 set_cpu_of(boot_thread, 0);
140 sigma0_thread->state_del_dirty(Thread_suspended);
141 boot_thread->state_del_dirty(Thread_suspended);
143 sigma0_thread->activate();
144 check (obj_map(sigma0, C_factory, 1, boot_task, C_factory, 0).error() == 0);
145 for (unsigned c = Initial_kobjects::First_cap; c < Initial_kobjects::End_cap; ++c)
147 Kobject_iface *o = initial_kobjects.obj(c);
149 check(obj_map(sigma0, c, 1, boot_task, c, 0).error() == 0);
152 boot_thread->activate();
155 IMPLEMENTATION [ia32,amd64]:
159 Kernel_thread::init_workload_s0_stack()
161 // push address of kernel info page to sigma0's stack
162 Address sp = Kip::k()->sigma0_sp - sizeof(Mword);
163 // assume we run in kdir 1:1 mapping
164 *reinterpret_cast<Address*>(sp) = Kmem::virt_to_phys(Kip::k());
168 IMPLEMENTATION [ux,arm,ppc32]:
172 Kernel_thread::init_workload_s0_stack()
173 { return Kip::k()->sigma0_sp; }
176 // ---------------------------------------------------------------------------
179 #include "io_space_sigma0.h"
184 Sigma0_space_factory::create(Io_space *v)
185 { new (v) Io_space_sigma0<Space>(); }