Changeset 6d9c49a in mainline for generic/src


Ignore:
Timestamp:
2006-03-13T19:39:30Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
45d6add
Parents:
78a95d6f
Message:

Added kernel IPC functionality.

Location:
generic/src
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • generic/src/main/kinit.c

    r78a95d6f r6d9c49a  
    139139        interrupts_enable();
    140140
     141        ipc_create_phonecompany();
     142
    141143        if (config.init_size > 0) {
    142144                /*
  • generic/src/main/main.c

    r78a95d6f r6d9c49a  
    5555#include <arch/faddr.h>
    5656#include <typedefs.h>
     57#include <ipc/ipc.h>
    5758
    5859#ifdef CONFIG_SMP
     
    191192        if (config.init_size > 0)
    192193                printf("config.init_addr=%P, config.init_size=%d\n", config.init_addr, config.init_size);
    193 
     194       
     195        ipc_init();
    194196        /*
    195197         * Create kernel task.
  • generic/src/proc/task.c

    r78a95d6f r6d9c49a  
    3636#include <panic.h>
    3737#include <adt/list.h>
     38#include <ipc/ipc.h>
     39#include <memstr.h>
    3840
    3941SPINLOCK_INITIALIZE(tasks_lock);
     
    7173        list_initialize(&ta->tasks_link);
    7274        ta->as = as;
     75
     76        ipc_answerbox_init(&ta->answerbox);
     77        memsetb((__address)&ta->phones, sizeof(ta->phones[0])*IPC_MAX_PHONES, 0);
     78        if (ipc_central_box)
     79                ipc_phone_init(&ta->phones[0], ipc_central_box);
    7380       
    7481        ipl = interrupts_disable();
  • generic/src/syscall/syscall.c

    r78a95d6f r6d9c49a  
    3131#include <print.h>
    3232#include <putchar.h>
     33#include <ipc/ipc.h>
     34#include <errno.h>
     35#include <proc/task.h>
     36#include <arch.h>
     37#include <debug.h>
    3338
    34 int sys_ctl(void) {
     39static __native sys_ctl(void) {
    3540        printf("Thread finished\n");
    3641        thread_exit();
     
    3944}
    4045
    41 int sys_io(int fd, const void * buf, size_t count) {
     46static __native sys_io(int fd, const void * buf, size_t count) {
    4247       
    4348        // TODO: buf sanity checks and a lot of other stuff ...
     
    5156}
    5257
     58/** Send a call over syscall
     59 *
     60 * @return Call identification, returns -1 on fatal error,
     61           -2 on 'Too many async request, handle answers first
     62 */
     63static __native sys_ipc_call(__native phoneid, __native arg1, __native arg2)
     64{
     65        call_t *call;
     66        phone_t *phone;
     67
     68        if (phoneid >= IPC_MAX_PHONES)
     69                return -ENOENT;
     70
     71        phone = &TASK->phones[phoneid];
     72        if (!phone->callee)
     73                return -ENOENT;
     74
     75
     76        /* TODO: Check that we did not exceed system imposed maximum
     77         * of asynchrnously sent messages
     78         * - the userspace should be able to handle it correctly
     79         */
     80        call = ipc_call_alloc();
     81        call->data[0] = arg1;
     82        call->data[1] = arg2;
     83        ipc_call(phone, call);
     84
     85        return (__native) call;
     86}
     87
     88/** Send IPC answer */
     89static __native sys_ipc_answer(__native callid, __native arg1, __native arg2)
     90{
     91        call_t *call;
     92
     93        /* Check that the user is not sending us answer callid */
     94        ASSERT(! (callid & 1));
     95        /* TODO: Check that the callid is in the dispatch table */
     96        call = (call_t *) callid;
     97
     98        call->data[0] = arg1;
     99        call->data[1] = arg2;
     100
     101        ipc_answer(&TASK->answerbox, call);
     102        return 0;
     103}
     104
     105/** Wait for incoming ipc call or answer
     106 *
     107 * @param result
     108 * @param flags
     109 * @return Callid, if callid & 1, then the call is answer
     110 */
     111static __native sys_ipc_wait_for_call(__native *calldata, __native flags)
     112{
     113        call_t *call;
     114       
     115        call = ipc_wait_for_call(&TASK->answerbox, flags);
     116        copy_to_uspace(calldata, &call->data, sizeof(__native) * IPC_CALL_LEN);
     117
     118        if (call->flags & IPC_CALL_ANSWERED)
     119                return ((__native)call) | 1;
     120        return (__native)call;
     121}
     122
     123
    53124syshandler_t syscall_table[SYSCALL_END] = {
    54125        sys_ctl,
    55         sys_io
     126        sys_io,
     127        sys_ipc_call,
     128        sys_ipc_answer,
     129        sys_ipc_wait_for_call
    56130};
Note: See TracChangeset for help on using the changeset viewer.