1
0
mirror of git://projects.qi-hardware.com/iris.git synced 2025-04-21 12:27:27 +03:00

more working

This commit is contained in:
Bas Wijnen
2010-01-18 06:45:52 +01:00
parent f1c608288f
commit 8e6efaeb36
13 changed files with 131 additions and 29 deletions

View File

@@ -53,6 +53,9 @@ void *operator new[] (unsigned size):
//kdebug ("\n")
return ret
void *operator new (unsigned size):
return new char[size]
struct file:
unsigned size
// Only the first 16 characters of the name are used, because that's much easier.
@@ -328,9 +331,80 @@ static void kdebug_name (char const *t, file *f):
kdebug_char (f->name[j])
kdebug ("...")
struct Dev:
static Dev *devs
Dev *next
unsigned code, idx
Device dev
static Dev *find (unsigned c, unsigned i):
for Dev *d = devs; d; d = d->next:
if d->code == c && d->idx == i:
return d
return NULL
static void add (unsigned c, unsigned i, Kernel::Cap cap):
while find (c, i):
++i
Dev *d = new Dev ()
d->next = devs
d->code = c
d->idx = i
d->dev = cap
devs = d
static void kdebug_list ():
for Dev *d = devs; d; d = d->next:
kdebug (">")
kdebug_num (d->code)
kdebug (":")
kdebug_num (d->idx)
Dev *Dev::devs
void handle_init ():
while true:
Kernel::wait ()
switch Kernel::recv.data[0].l:
case Parent::PROVIDE_DEVICE:
Dev::add (Kernel::recv.data[1].l, Kernel::recv.data[0].h, Kernel::get_arg ())
kdebug ("added dev ")
kdebug_num (Kernel::recv.data[1].l)
kdebug (":")
kdebug_num (Kernel::recv.data[0].h)
kdebug ("\n")
Kernel::recv.reply.invoke ()
break
case Parent::GET_DEVICE:
Dev *d = Dev::find (Kernel::recv.data[1].l, Kernel::recv.data[0].h)
if d:
kdebug ("given dev ")
kdebug_num (Kernel::recv.data[1].l)
kdebug (":")
kdebug_num (Kernel::recv.data[0].h)
kdebug ("\n")
Kernel::Cap cap = d->dev.create_user (Kernel::my_memory)
d->dev.use (cap)
Kernel::recv.reply.invoke (0, 0, cap.copy ())
Kernel::free_cap (cap)
else:
kdebug ("device not found: ")
kdebug_num (Kernel::recv.data[1].l)
kdebug (":")
kdebug_num (Kernel::recv.data[0].h)
Dev::kdebug_list ()
kdebug ("\n")
Kernel::recv.reply.invoke (~0, ~0)
Kernel::panic (0)
break
case Parent::INIT_DONE:
kdebug ("init done\n")
return
default:
kdebug ("unknown init request\n")
Kernel::panic (0)
Kernel::Num start ():
// Wait for the debugging device to be active, in case there is one.
Kernel::schedule ()
//Dev::devs = NULL
init_alloc ()
top_memory = Kernel::get_top_memory ()
Directory root = receive_devices ()
@@ -344,10 +418,11 @@ Kernel::Num start ():
kdebug_name ("loading ", &files[index[i]])
run (&files[index[i]], files[index[i]].name[0] == '#')
kdebug ("running\n")
Kernel::schedule ()
handle_init ()
root.unlock_ro ()
Kernel::free_slot (slot)
Kernel::my_memory.destroy (caps)
while true:
Kernel::wait ()
kdebug ("request!\n")
handle_init ()
//Kernel::wait ()
//kdebug ("request!\n")