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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user