]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/syscalls.cpp
update
[l4.git] / kernel / fiasco / src / kern / syscalls.cpp
1 IMPLEMENTATION:
2
3 #include "thread_object.h"
4 #include "thread_state.h"
5
6 extern "C"
7 void
8 sys_ipc_wrapper()
9 {
10   assert_kdb (!(current()->state() & Thread_drq_ready));
11
12   Thread *curr = current_thread();
13   Syscall_frame *f = curr->regs();
14
15   Obj_cap obj = f->ref();
16   Utcb *utcb = curr->utcb().access(true);
17   unsigned char rights;
18   Kobject_iface *o = obj.deref(&rights);
19   L4_msg_tag e;
20   if (EXPECT_TRUE(o!=0))
21     o->invoke(obj, rights, f, utcb);
22   else
23     f->tag(curr->commit_error(utcb, L4_error::Not_existent));
24 }
25
26
27 //---------------------------------------------------------------------------
28 IMPLEMENTATION [debug]:
29
30 #include "space.h"
31 #include "task.h"
32
33 extern "C" void sys_invoke_debug(Kobject_iface *o, Syscall_frame *f) __attribute__((weak));
34
35 extern "C" void sys_invoke_debug_wrapper()
36 {
37   Thread *curr = current_thread();
38   Syscall_frame *f = curr->regs();
39   //printf("sys_invoke_debugger(f=%p, obj=%lx)\n", f, f->ref().raw());
40   Kobject_iface *o = curr->space()->obj_space()->lookup_local(f->ref().cap());
41   if (o && &::sys_invoke_debug)
42     ::sys_invoke_debug(o, f);
43   else
44     f->tag(curr->commit_error(curr->utcb().access(true), L4_error::Not_existent));
45 }
46
47 //---------------------------------------------------------------------------
48 IMPLEMENTATION [!debug]:
49
50 #include "thread.h"
51
52 extern "C" void sys_invoke_debug_wrapper() {}
53
54 //---------------------------------------------------------------------------
55 INTERFACE [ia32 || ux || amd64]:
56
57 extern void (*syscall_table[])();
58
59
60 //---------------------------------------------------------------------------
61 IMPLEMENTATION [ia32 || ux || amd64]:
62
63 void (*syscall_table[])() =
64 {
65   sys_ipc_wrapper,
66   0,
67   sys_invoke_debug_wrapper,
68 };
69