~galfy/helenos/bird-port-mainline

« back to all changes in this revision

Viewing changes to kernel/generic/src/syscall/syscall.c

  • Committer: Martin Decky
  • Date: 2009-08-04 11:19:19 UTC
  • Revision ID: martin@uranus.dsrg.hide.ms.mff.cuni.cz-20090804111919-evyclddlr3v5lhmp
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2005 Martin Decky
 
3
 * All rights reserved.
 
4
 *
 
5
 * Redistribution and use in source and binary forms, with or without
 
6
 * modification, are permitted provided that the following conditions
 
7
 * are met:
 
8
 *
 
9
 * - Redistributions of source code must retain the above copyright
 
10
 *   notice, this list of conditions and the following disclaimer.
 
11
 * - Redistributions in binary form must reproduce the above copyright
 
12
 *   notice, this list of conditions and the following disclaimer in the
 
13
 *   documentation and/or other materials provided with the distribution.
 
14
 * - The name of the author may not be used to endorse or promote products
 
15
 *   derived from this software without specific prior written permission.
 
16
 *
 
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
27
 */
 
28
 
 
29
/** @addtogroup generic
 
30
 * @{
 
31
 */
 
32
 
 
33
/**
 
34
 * @file
 
35
 * @brief Syscall table and syscall wrappers.
 
36
 */
 
37
 
 
38
#include <syscall/syscall.h>
 
39
#include <proc/thread.h>
 
40
#include <proc/task.h>
 
41
#include <proc/program.h>
 
42
#include <mm/as.h>
 
43
#include <print.h>
 
44
#include <arch.h>
 
45
#include <debug.h>
 
46
#include <ddi/device.h>
 
47
#include <ipc/sysipc.h>
 
48
#include <synch/futex.h>
 
49
#include <synch/smc.h>
 
50
#include <ddi/ddi.h>
 
51
#include <ipc/event.h>
 
52
#include <security/cap.h>
 
53
#include <sysinfo/sysinfo.h>
 
54
#include <console/console.h>
 
55
#include <udebug/udebug.h>
 
56
 
 
57
/** Dispatch system call */
 
58
unative_t syscall_handler(unative_t a1, unative_t a2, unative_t a3,
 
59
    unative_t a4, unative_t a5, unative_t a6, unative_t id)
 
60
{
 
61
        unative_t rc;
 
62
 
 
63
#ifdef CONFIG_UDEBUG
 
64
        bool debug;
 
65
 
 
66
        /*
 
67
         * Early check for undebugged tasks. We do not lock anything as this
 
68
         * test need not be precise in either way.
 
69
         */
 
70
        debug = THREAD->udebug.active;
 
71
        
 
72
        if (debug) {
 
73
                udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, 0, false);
 
74
        }
 
75
#endif
 
76
        
 
77
        if (id < SYSCALL_END) {
 
78
                rc = syscall_table[id](a1, a2, a3, a4, a5, a6);
 
79
        } else {
 
80
                printf("Task %" PRIu64": Unknown syscall %#" PRIxn, TASK->taskid, id);
 
81
                task_kill(TASK->taskid);
 
82
                thread_exit();
 
83
        }
 
84
        
 
85
        if (THREAD->interrupted)
 
86
                thread_exit();
 
87
        
 
88
#ifdef CONFIG_UDEBUG
 
89
        if (debug) {
 
90
                udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, rc, true);
 
91
        
 
92
                /*
 
93
                 * Stopping point needed for tasks that only invoke
 
94
                 * non-blocking system calls. Not needed if the task
 
95
                 * is not being debugged (it cannot block here).
 
96
                 */
 
97
                udebug_stoppable_begin();
 
98
                udebug_stoppable_end();
 
99
        }
 
100
#endif
 
101
        
 
102
        return rc;
 
103
}
 
104
 
 
105
syshandler_t syscall_table[SYSCALL_END] = {
 
106
        (syshandler_t) sys_klog,
 
107
        (syshandler_t) sys_tls_set,
 
108
        
 
109
        /* Thread and task related syscalls. */
 
110
        (syshandler_t) sys_thread_create,
 
111
        (syshandler_t) sys_thread_exit,
 
112
        (syshandler_t) sys_thread_get_id,
 
113
        
 
114
        (syshandler_t) sys_task_get_id,
 
115
        (syshandler_t) sys_task_set_name,
 
116
        (syshandler_t) sys_program_spawn_loader,
 
117
        
 
118
        /* Synchronization related syscalls. */
 
119
        (syshandler_t) sys_futex_sleep_timeout,
 
120
        (syshandler_t) sys_futex_wakeup,
 
121
        (syshandler_t) sys_smc_coherence,
 
122
        
 
123
        /* Address space related syscalls. */
 
124
        (syshandler_t) sys_as_area_create,
 
125
        (syshandler_t) sys_as_area_resize,
 
126
        (syshandler_t) sys_as_area_change_flags,
 
127
        (syshandler_t) sys_as_area_destroy,
 
128
        
 
129
        /* IPC related syscalls. */
 
130
        (syshandler_t) sys_ipc_call_sync_fast,
 
131
        (syshandler_t) sys_ipc_call_sync_slow,
 
132
        (syshandler_t) sys_ipc_call_async_fast,
 
133
        (syshandler_t) sys_ipc_call_async_slow,
 
134
        (syshandler_t) sys_ipc_answer_fast,
 
135
        (syshandler_t) sys_ipc_answer_slow,
 
136
        (syshandler_t) sys_ipc_forward_fast,
 
137
        (syshandler_t) sys_ipc_forward_slow,
 
138
        (syshandler_t) sys_ipc_wait_for_call,
 
139
        (syshandler_t) sys_ipc_hangup,
 
140
        (syshandler_t) sys_ipc_register_irq,
 
141
        (syshandler_t) sys_ipc_unregister_irq,
 
142
 
 
143
        /* Event notification syscalls. */
 
144
        (syshandler_t) sys_event_subscribe,
 
145
        
 
146
        /* Capabilities related syscalls. */
 
147
        (syshandler_t) sys_cap_grant,
 
148
        (syshandler_t) sys_cap_revoke,
 
149
        
 
150
        /* DDI related syscalls. */
 
151
        (syshandler_t) sys_device_assign_devno,
 
152
        (syshandler_t) sys_physmem_map,
 
153
        (syshandler_t) sys_iospace_enable,
 
154
        (syshandler_t) sys_preempt_control,
 
155
        
 
156
        /* Sysinfo syscalls */
 
157
        (syshandler_t) sys_sysinfo_valid,
 
158
        (syshandler_t) sys_sysinfo_value,
 
159
        
 
160
        /* Debug calls */
 
161
        (syshandler_t) sys_debug_enable_console,
 
162
        (syshandler_t) sys_debug_disable_console,
 
163
        
 
164
        (syshandler_t) sys_ipc_connect_kbox
 
165
};
 
166
 
 
167
/** @}
 
168
 */