Changeset 6b10dab in mainline for kernel/generic


Ignore:
Timestamp:
2010-12-14T15:26:36Z (15 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
dd8d5a7
Parents:
96b02eb9
Message:

ABI split: pass 64-bit task ID as plain 64-bit argument to SYS_IPC_CONNECT_KBOX, SYS_CAP_GRANT, SYS_CAP_REVOKE

Location:
kernel/generic
Files:
1 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/ipc/sysipc.h

    r96b02eb9 r6b10dab  
    4040#include <typedefs.h>
    4141
    42 extern sysarg_t sys_ipc_call_sync_fast(sysarg_t phoneid, sysarg_t method,
    43     sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, ipc_data_t *data);
    44 extern sysarg_t sys_ipc_call_sync_slow(sysarg_t phoneid, ipc_data_t *question,
    45     ipc_data_t *reply);
    46 extern sysarg_t sys_ipc_call_async_fast(sysarg_t phoneid, sysarg_t method,
    47     sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4);
    48 extern sysarg_t sys_ipc_call_async_slow(sysarg_t phoneid, ipc_data_t *data);
    49 extern sysarg_t sys_ipc_answer_fast(sysarg_t callid, sysarg_t retval,
    50     sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4);
    51 extern sysarg_t sys_ipc_answer_slow(sysarg_t callid, ipc_data_t *data);
    52 extern sysarg_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec,
    53     unsigned int nonblocking);
     42extern sysarg_t sys_ipc_call_sync_fast(sysarg_t, sysarg_t, sysarg_t,
     43    sysarg_t, sysarg_t, ipc_data_t *);
     44extern sysarg_t sys_ipc_call_sync_slow(sysarg_t, ipc_data_t *, ipc_data_t *);
     45extern sysarg_t sys_ipc_call_async_fast(sysarg_t, sysarg_t, sysarg_t,
     46    sysarg_t, sysarg_t, sysarg_t);
     47extern sysarg_t sys_ipc_call_async_slow(sysarg_t, ipc_data_t *);
     48extern sysarg_t sys_ipc_answer_fast(sysarg_t, sysarg_t, sysarg_t, sysarg_t,
     49    sysarg_t, sysarg_t);
     50extern sysarg_t sys_ipc_answer_slow(sysarg_t, ipc_data_t *);
     51extern sysarg_t sys_ipc_wait_for_call(ipc_data_t *, uint32_t, unsigned int);
    5452extern sysarg_t sys_ipc_poke(void);
    55 extern sysarg_t sys_ipc_forward_fast(sysarg_t callid, sysarg_t phoneid,
    56     sysarg_t method, sysarg_t arg1, sysarg_t arg2, unsigned int mode);
    57 extern sysarg_t sys_ipc_forward_slow(sysarg_t callid, sysarg_t phoneid,
    58     ipc_data_t *data, unsigned int mode);
    59 extern sysarg_t sys_ipc_hangup(sysarg_t phoneid);
    60 extern sysarg_t sys_ipc_register_irq(inr_t inr, devno_t devno, sysarg_t method,
    61     irq_code_t *ucode);
    62 extern sysarg_t sys_ipc_unregister_irq(inr_t inr, devno_t devno);
    63 extern sysarg_t sys_ipc_connect_kbox(sysarg64_t *task_id);
     53extern sysarg_t sys_ipc_forward_fast(sysarg_t, sysarg_t, sysarg_t, sysarg_t,
     54    sysarg_t, unsigned int);
     55extern sysarg_t sys_ipc_forward_slow(sysarg_t, sysarg_t, ipc_data_t *,
     56    unsigned int);
     57extern sysarg_t sys_ipc_hangup(sysarg_t);
     58extern sysarg_t sys_ipc_register_irq(inr_t, devno_t, sysarg_t, irq_code_t *);
     59extern sysarg_t sys_ipc_unregister_irq(inr_t, devno_t);
     60
     61#ifdef __32_BITS__
     62
     63extern sysarg_t sys_ipc_connect_kbox(sysarg64_t *);
     64
     65#endif  /* __32_BITS__ */
     66
     67#ifdef __64_BITS__
     68
     69extern sysarg_t sys_ipc_connect_kbox(sysarg_t);
     70
     71#endif  /* __64_BITS__ */
    6472
    6573#endif
  • kernel/generic/include/security/cap.h

    r96b02eb9 r6b10dab  
    4848#define __CAP_H__
    4949
    50 #include <syscall/sysarg64.h>
    5150#include <typedefs.h>
    5251
     
    5554 * privilege to/from other tasks.
    5655 */
    57 #define CAP_CAP                 (1<<0)
     56#define CAP_CAP  (1 << 0)
    5857
    5958/**
     
    6160 * to other tasks.
    6261 */
    63 #define CAP_MEM_MANAGER         (1<<1)
     62#define CAP_MEM_MANAGER  (1 << 1)
    6463
    6564/**
     
    6766 * to other tasks.
    6867 */
    69 #define CAP_IO_MANAGER          (1<<2)
     68#define CAP_IO_MANAGER  (1 << 2)
    7069
    7170/**
    7271 * CAP_IRQ_REG entitles its holder to register IRQ handlers.
    7372 */
    74 #define CAP_IRQ_REG             (1<<3)
     73#define CAP_IRQ_REG  (1 << 3)
    7574
    7675typedef uint32_t cap_t;
    7776
    78 extern sysarg_t sys_cap_grant(sysarg64_t *uspace_taskid_arg, cap_t caps);
    79 extern sysarg_t sys_cap_revoke(sysarg64_t *uspace_taskid_arg, cap_t caps);
     77#ifdef __32_BITS__
     78
     79extern sysarg_t sys_cap_grant(sysarg64_t *, cap_t);
     80extern sysarg_t sys_cap_revoke(sysarg64_t *, cap_t);
     81
     82#endif  /* __32_BITS__ */
     83
     84#ifdef __64_BITS__
     85
     86extern sysarg_t sys_cap_grant(sysarg_t, cap_t);
     87extern sysarg_t sys_cap_revoke(sysarg_t, cap_t);
     88
     89#endif  /* __64_BITS__ */
    8090
    8191#endif
  • kernel/generic/include/syscall/syscall.h

    r96b02eb9 r6b10dab  
    3838typedef enum {
    3939        SYS_KLOG = 0,
    40         SYS_TLS_SET = 1, /* Hardcoded in AMD64, IA32 uspace - fibril.S */
     40        SYS_TLS_SET = 1,  /* Hardcoded for AMD64, IA-32 (fibril.S in uspace) */
    4141       
    4242        SYS_THREAD_CREATE,
     
    7171        SYS_IPC_REGISTER_IRQ,
    7272        SYS_IPC_UNREGISTER_IRQ,
     73        SYS_IPC_CONNECT_KBOX,
    7374       
    7475        SYS_EVENT_SUBSCRIBE,
     
    9091        SYS_DEBUG_DISABLE_CONSOLE,
    9192       
    92         SYS_IPC_CONNECT_KBOX,
    9393        SYSCALL_END
    9494} syscall_t;
  • kernel/generic/include/typedefs.h

    r96b02eb9 r6b10dab  
    7373typedef volatile uint32_t ioport32_t;
    7474
     75#ifdef __32_BITS__
     76
     77/** Explicit 64-bit arguments passed to syscalls. */
     78typedef uint64_t sysarg64_t;
     79
     80#endif /* __32_BITS__ */
     81
    7582#endif
    7683
  • kernel/generic/src/ipc/sysipc.c

    r96b02eb9 r6b10dab  
    4949#include <syscall/copy.h>
    5050#include <security/cap.h>
     51#include <console/console.h>
    5152#include <mm/as.h>
    5253#include <print.h>
     
    11281129}
    11291130
    1130 #include <console/console.h>
    1131 
    1132 /** Syscall connect to a task by id.
     1131#ifdef __32_BITS__
     1132
     1133/** Syscall connect to a task by ID (32 bits)
    11331134 *
    11341135 * @return Phone id on success, or negative error code.
    11351136 *
    11361137 */
    1137 sysarg_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid_arg)
     1138sysarg_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid)
    11381139{
    11391140#ifdef CONFIG_UDEBUG
    1140         sysarg64_t taskid_arg;
    1141         int rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t));
     1141        sysarg64_t taskid;
     1142        int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(sysarg64_t));
    11421143        if (rc != 0)
    11431144                return (sysarg_t) rc;
    11441145       
    1145         LOG("sys_ipc_connect_kbox(%" PRIu64 ")", taskid_arg.value);
    1146        
    1147         return ipc_connect_kbox(taskid_arg.value);
     1146        return ipc_connect_kbox((task_id_t) taskid);
    11481147#else
    11491148        return (sysarg_t) ENOTSUP;
     
    11511150}
    11521151
     1152#endif  /* __32_BITS__ */
     1153
     1154#ifdef __64_BITS__
     1155
     1156/** Syscall connect to a task by ID (64 bits)
     1157 *
     1158 * @return Phone id on success, or negative error code.
     1159 *
     1160 */
     1161sysarg_t sys_ipc_connect_kbox(sysarg_t taskid)
     1162{
     1163#ifdef CONFIG_UDEBUG
     1164        return ipc_connect_kbox((task_id_t) taskid);
     1165#else
     1166        return (sysarg_t) ENOTSUP;
     1167#endif
     1168}
     1169
     1170#endif  /* __64_BITS__ */
     1171
    11531172/** @}
    11541173 */
  • kernel/generic/src/security/cap.c

    r96b02eb9 r6b10dab  
    4141#include <proc/task.h>
    4242#include <synch/spinlock.h>
    43 #include <syscall/sysarg64.h>
    4443#include <syscall/copy.h>
    4544#include <arch.h>
     
    7978 * The calling task must have the CAP_CAP capability.
    8079 *
    81  * @param uspace_taskid_arg Userspace structure holding destination task ID.
    82  * @param caps Capabilities to grant.
    83  *
    84  * @return Zero on success or an error code from @ref errno.h.
    85  *
    86  */
    87 sysarg_t sys_cap_grant(sysarg64_t *uspace_taskid_arg, cap_t caps)
     80 * @param taskid Destination task ID.
     81 * @param caps   Capabilities to grant.
     82 *
     83 * @return Zero on success or an error code from @ref errno.h.
     84 *
     85 */
     86static sysarg_t cap_grant(task_id_t taskid, cap_t caps)
    8887{
    8988        if (!(cap_get(TASK) & CAP_CAP))
    9089                return (sysarg_t) EPERM;
    9190       
    92         sysarg64_t taskid_arg;
    93         int rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t));
    94         if (rc != 0)
    95                 return (sysarg_t) rc;
    96        
    9791        irq_spinlock_lock(&tasks_lock, true);
    98         task_t *task = task_find_by_id((task_id_t) taskid_arg.value);
     92        task_t *task = task_find_by_id(taskid);
    9993       
    10094        if ((!task) || (!context_check(CONTEXT, task->context))) {
     
    116110 * attempt to revoke capabilities from itself.
    117111 *
    118  * @param uspace_taskid_arg Userspace structure holding destination task ID.
    119  * @param caps Capabilities to revoke.
    120  *
    121  * @return Zero on success or an error code from @ref errno.h.
    122  *
    123  */
    124 sysarg_t sys_cap_revoke(sysarg64_t *uspace_taskid_arg, cap_t caps)
    125 {
    126         sysarg64_t taskid_arg;
    127         int rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t));
    128         if (rc != 0)
    129                 return (sysarg_t) rc;
    130        
     112 * @param taskid Destination task ID.
     113 * @param caps   Capabilities to revoke.
     114 *
     115 * @return Zero on success or an error code from @ref errno.h.
     116 *
     117 */
     118static sysarg_t cap_revoke(task_id_t taskid, cap_t caps)
     119{
    131120        irq_spinlock_lock(&tasks_lock, true);
    132121       
    133         task_t *task = task_find_by_id((task_id_t) taskid_arg.value);
     122        task_t *task = task_find_by_id(taskid);
    134123        if ((!task) || (!context_check(CONTEXT, task->context))) {
    135124                irq_spinlock_unlock(&tasks_lock, true);
     
    157146}
    158147
     148#ifdef __32_BITS__
     149
     150/** Grant capabilities to a task (32 bits)
     151 *
     152 * The calling task must have the CAP_CAP capability.
     153 *
     154 * @param uspace_taskid User-space pointer to destination task ID.
     155 * @param caps          Capabilities to grant.
     156 *
     157 * @return Zero on success or an error code from @ref errno.h.
     158 *
     159 */
     160sysarg_t sys_cap_grant(sysarg64_t *uspace_taskid, cap_t caps)
     161{
     162        sysarg64_t taskid;
     163        int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(sysarg64_t));
     164        if (rc != 0)
     165                return (sysarg_t) rc;
     166       
     167        return cap_grant((task_id_t) taskid, caps);
     168}
     169
     170/** Revoke capabilities from a task (32 bits)
     171 *
     172 * The calling task must have the CAP_CAP capability or the caller must
     173 * attempt to revoke capabilities from itself.
     174 *
     175 * @param uspace_taskid User-space pointer to destination task ID.
     176 * @param caps          Capabilities to revoke.
     177 *
     178 * @return Zero on success or an error code from @ref errno.h.
     179 *
     180 */
     181sysarg_t sys_cap_revoke(sysarg64_t *uspace_taskid, cap_t caps)
     182{
     183        sysarg64_t taskid;
     184        int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(sysarg64_t));
     185        if (rc != 0)
     186                return (sysarg_t) rc;
     187       
     188        return cap_revoke((task_id_t) taskid, caps);
     189}
     190
     191#endif  /* __32_BITS__ */
     192
     193#ifdef __64_BITS__
     194
     195/** Grant capabilities to a task (64 bits)
     196 *
     197 * The calling task must have the CAP_CAP capability.
     198 *
     199 * @param taskid Destination task ID.
     200 * @param caps   Capabilities to grant.
     201 *
     202 * @return Zero on success or an error code from @ref errno.h.
     203 *
     204 */
     205sysarg_t sys_cap_grant(sysarg_t taskid, cap_t caps)
     206{
     207        return cap_grant((task_id_t) taskid, caps);
     208}
     209
     210/** Revoke capabilities from a task (64 bits)
     211 *
     212 * The calling task must have the CAP_CAP capability or the caller must
     213 * attempt to revoke capabilities from itself.
     214 *
     215 * @param taskid Destination task ID.
     216 * @param caps   Capabilities to revoke.
     217 *
     218 * @return Zero on success or an error code from @ref errno.h.
     219 *
     220 */
     221sysarg_t sys_cap_revoke(sysarg_t taskid, cap_t caps)
     222{
     223        return cap_revoke((task_id_t) taskid, caps);
     224}
     225
     226#endif  /* __64_BITS__ */
     227
    159228/** @}
    160229 */
  • kernel/generic/src/syscall/syscall.c

    r96b02eb9 r6b10dab  
    147147        (syshandler_t) sys_ipc_register_irq,
    148148        (syshandler_t) sys_ipc_unregister_irq,
     149        (syshandler_t) sys_ipc_connect_kbox,
    149150       
    150151        /* Event notification syscalls. */
     
    169170        /* Debug calls */
    170171        (syshandler_t) sys_debug_enable_console,
    171         (syshandler_t) sys_debug_disable_console,
    172        
    173         (syshandler_t) sys_ipc_connect_kbox
     172        (syshandler_t) sys_debug_disable_console
    174173};
    175174
Note: See TracChangeset for help on using the changeset viewer.