mirror of
git://projects.qi-hardware.com/iris.git
synced 2025-04-21 12:27:27 +03:00
usb-booting alarm clock, with split gui
This commit is contained in:
@@ -58,6 +58,9 @@ void *operator new[] (unsigned size):
|
||||
void *operator new (unsigned size):
|
||||
return new char[size]
|
||||
|
||||
static unsigned *bss_mapping
|
||||
static Iris::Page bss_page
|
||||
|
||||
// Get the initial block device and filesystem.
|
||||
static Iris::Directory receive_devices ():
|
||||
Iris::String data
|
||||
@@ -65,7 +68,7 @@ static Iris::Directory receive_devices ():
|
||||
bool have_data = false, have_fs = false
|
||||
for unsigned i = 0; i < 2; ++i:
|
||||
Iris::wait ()
|
||||
if Iris::recv.data[0].l != Iris::Parent::PROVIDE_DEVICE:
|
||||
if Iris::recv.data[0].l != Iris::Parent::PROVIDE_CAPABILITY:
|
||||
Iris::panic (Iris::recv.data[0].l, "Invalid bootstrap request.")
|
||||
switch Iris::recv.data[1].l:
|
||||
case Iris::String::ID:
|
||||
@@ -206,13 +209,14 @@ static void run (Iris::String data, Iris::Memory parent_memory, Iris::Cap parent
|
||||
Iris::Page page = mem.mapping ((void *)p)
|
||||
if Iris::recv.data[0].l == Iris::NO_ERROR:
|
||||
// No error means there is a mapping.
|
||||
page.share (bss_page, 0)
|
||||
Iris::free_cap (page)
|
||||
for unsigned a = p; a < ((p + PAGE_SIZE) & PAGE_MASK); a += 4:
|
||||
if a >= shdr->sh_addr + shdr->sh_size:
|
||||
break
|
||||
if a < shdr->sh_addr:
|
||||
continue
|
||||
((unsigned *)&mapping[p - shdr->sh_addr])[(a & ~PAGE_MASK) >> 2] = 0
|
||||
bss_mapping[(a & ~PAGE_MASK) >> 2] = 0
|
||||
else:
|
||||
Iris::free_cap (page)
|
||||
page = mem.create_page ()
|
||||
@@ -256,6 +260,10 @@ Iris::Num start ():
|
||||
Iris::schedule ()
|
||||
kdebug ("Starting bootinit\n")
|
||||
init_alloc ()
|
||||
bss_mapping = (unsigned *)alloc_space (1)
|
||||
bss_page = Iris::my_memory.create_page ()
|
||||
Iris::my_memory.map (bss_page, (unsigned)bss_mapping)
|
||||
|
||||
Iris::Memory top_memory = Iris::get_top_memory ()
|
||||
Iris::Directory root = receive_devices ()
|
||||
root.lock_ro ()
|
||||
@@ -263,7 +271,7 @@ Iris::Num start ():
|
||||
Iris::Cap parent_cap = Iris::my_receiver.create_capability (0)
|
||||
run (run_string, top_memory, parent_cap)
|
||||
Iris::wait ()
|
||||
if Iris::recv.data[0].l != Iris::Parent::PROVIDE_DEVICE || Iris::recv.data[1].l != Iris::Elfrun::ID:
|
||||
if Iris::recv.data[0].l != Iris::Parent::PROVIDE_CAPABILITY || Iris::recv.data[1].l != Iris::Elfrun::ID:
|
||||
Iris::panic (0, "elfrun doesn't provide correct capability")
|
||||
Iris::Cap reply = Iris::get_reply ()
|
||||
Iris::Elfrun elfrun = Iris::get_arg ()
|
||||
@@ -287,7 +295,7 @@ Iris::Num start ():
|
||||
while true:
|
||||
Iris::wait ()
|
||||
switch Iris::recv.data[0].l:
|
||||
case Iris::Parent::GET_DEVICE:
|
||||
case Iris::Parent::GET_CAPABILITY:
|
||||
switch Iris::recv.data[1].l:
|
||||
case Iris::Directory::ID:
|
||||
if have_root:
|
||||
|
||||
@@ -573,8 +573,8 @@ Iris::Num start ():
|
||||
Iris::register_interrupt (IRQ_UDC)
|
||||
Iris::Filesystem fs = Iris::my_receiver.create_capability (FS)
|
||||
Iris::String data = Iris::my_receiver.create_capability (DATA)
|
||||
Iris::my_parent.provide_device <Iris::Filesystem> (fs.copy ())
|
||||
Iris::my_parent.provide_device <Iris::String> (data.copy ())
|
||||
Iris::my_parent.provide_capability <Iris::Filesystem> (fs.copy ())
|
||||
Iris::my_parent.provide_capability <Iris::String> (data.copy ())
|
||||
Iris::free_cap (fs)
|
||||
Iris::free_cap (data)
|
||||
unsigned state = 0
|
||||
|
||||
Reference in New Issue
Block a user