11 #include "mem_layout.h"
12 #include "mem_space_sigma0.h"
16 #include "ram_quota.h"
18 #include "irq_controller.h"
21 static Scheduler scheduler;
24 enum Default_base_caps
37 struct Sigma0_space_factory
39 static void create(Mem_space *v, Ram_quota *q)
40 { new (v) Mem_space_sigma0(q); }
43 template< typename S >
44 static void create(S *v)
52 Kernel_thread::init_workload()
54 Lock_guard<Cpu_lock> g(&cpu_lock);
61 (!strstr (Cmdline::cmdline(), " -nojdb")) &&
62 ((s = strstr (Cmdline::cmdline(), " -jdb_cmd="))))
64 // extract the control sequence from the command line
69 d < ctrl+sizeof(ctrl)-1 && *s && *s != ' '; *d++ = *s++)
72 printf("JDB: exec cmd '%s'\n", ctrl);
73 kdb_ke_sequence(ctrl);
76 // kernel debugger rendezvous
77 if (strstr (Cmdline::cmdline(), " -wait"))
82 Lock_guard<Cpu_lock> g(&cpu_lock);
88 Task *sigma0 = Task::create(Sigma0_space_factory(), Ram_quota::root,
89 L4_fpage::mem(Mem_layout::Utcb_addr, Config::PAGE_SHIFT));
93 check (sigma0->initialize());
94 check (map(sigma0, sigma0_task->obj_space(), sigma0_task, C_task, 0));
95 check (map(Factory::root(), sigma0_task->obj_space(), sigma0_task, C_factory, 0));
96 check (map(&scheduler, sigma0_task->obj_space(), sigma0_task, C_scheduler, 0));
97 check (map(&vlog, sigma0_task->obj_space(), sigma0_task, C_log, 0));
98 check (map(&icu, sigma0_task->obj_space(), sigma0_task, C_icu, 0));
100 sigma0_space = sigma0_task->mem_space();
102 Thread *sigma0_thread = new (Ram_quota::root) Thread();
103 // Config::sigma0_prio
105 assert_kdb(sigma0_thread);
106 check (map(sigma0_thread, sigma0_task->obj_space(), sigma0_task, C_thread, 0));
108 Address sp = init_workload_s0_stack();
109 check (sigma0_thread->control(Thread_ptr(false), Thread_ptr(false),
111 (void*)Mem_layout::Utcb_addr) == 0);
113 check (sigma0_thread->ex_regs(Kip::k()->sigma0_ip, sp));
115 //sigma0_thread->thread_lock()->clear();
118 // create the boot task
121 boot_task = Task::create(Space::Default_factory(), Ram_quota::root,
122 L4_fpage::mem(Mem_layout::Utcb_addr, Config::PAGE_SHIFT+2));
125 check (boot_task->initialize());
127 Thread *boot_thread = new (Ram_quota::root) Thread();
130 assert_kdb (boot_thread);
132 check (map(boot_task, boot_task->obj_space(), boot_task, C_task, 0));
133 check (map(boot_thread, boot_task->obj_space(), boot_task, C_thread, 0));
135 check (boot_thread->control(Thread_ptr(C_pager), Thread_ptr(~0UL),
137 (void*)Mem_layout::Utcb_addr) == 0);
138 check (boot_thread->ex_regs(Kip::k()->root_ip, Kip::k()->root_sp));
140 Ipc_gate *s0_b_gate = Ipc_gate::create(Ram_quota::root, sigma0_thread, 4 << 4);
143 check (map(s0_b_gate, boot_task->obj_space(), boot_task, C_pager, 0));
145 //Cpu::cpus.cpu(0).tz_switch_to_ns();
146 set_cpu_of(sigma0_thread, 0);
147 set_cpu_of(boot_thread, 0);
148 sigma0_thread->state_del_dirty(Thread_suspended);
149 boot_thread->state_del_dirty(Thread_suspended);
151 sigma0_thread->activate();
152 check (obj_map(sigma0_task, C_factory, 1, boot_task, C_factory, 0).error() == 0);
153 check (obj_map(sigma0_task, C_scheduler, 1, boot_task, C_scheduler, 0).error() == 0);
154 check (obj_map(sigma0_task, C_log, 1, boot_task, C_log, 0).error() == 0);
155 check (obj_map(sigma0_task, C_icu, 1, boot_task, C_icu, 0).error() == 0);
157 boot_thread->activate();
160 IMPLEMENTATION [ia32,amd64]:
164 Kernel_thread::init_workload_s0_stack()
166 // push address of kernel info page to sigma0's stack
167 Address sp = Kip::k()->sigma0_sp - sizeof(Mword);
168 // assume we run in kdir 1:1 mapping
169 *reinterpret_cast<Address*>(sp) = Kmem::virt_to_phys(Kip::k());
173 IMPLEMENTATION [ux,arm,ppc32]:
177 Kernel_thread::init_workload_s0_stack()
178 { return Kip::k()->sigma0_sp; }
181 // ---------------------------------------------------------------------------
184 #include "io_space_sigma0.h"
189 Sigma0_space_factory::create(Io_space *v)
190 { new (v) Io_space_sigma0<Space>(); }