Changeset 7c23af9 in mainline for generic/src/ipc/sysipc.c


Ignore:
Timestamp:
2006-05-14T17:16:52Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
14b502e2
Parents:
68965ec5
Message:

Added support to IPC for simple page sharing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • generic/src/ipc/sysipc.c

    r68965ec5 r7c23af9  
    4141#include <syscall/copy.h>
    4242#include <security/cap.h>
     43#include <mm/as.h>
    4344
    4445#define GET_CHECK_PHONE(phone,phoneid,err) { \
     
    8384        if (IPC_GET_METHOD(call->data) == IPC_M_CONNECT_ME_TO)
    8485                return 1;
     86        if (IPC_GET_METHOD(call->data) == IPC_M_AS_SEND)
     87                return 1;
    8588        return 0;
    8689}
    8790
    8891/** Interpret process answer as control information */
    89 static inline void answer_preprocess(call_t *answer, ipc_data_t *olddata)
     92static inline int answer_preprocess(call_t *answer, ipc_data_t *olddata)
    9093{
    9194        int phoneid;
     
    106109
    107110        if (!olddata)
    108                 return;
     111                return 0;
    109112
    110113        if (IPC_GET_METHOD(*olddata) == IPC_M_CONNECT_TO_ME) {
     
    125128                                          &TASK->answerbox);
    126129                }
    127         }
     130        } else if (IPC_GET_METHOD(*olddata) == IPC_M_AS_SEND) {
     131                if (!IPC_GET_RETVAL(answer->data)) { /* Accepted, handle As_area receival */
     132                        return as_area_steal(answer->sender,
     133                                             IPC_GET_ARG2(*olddata),IPC_GET_ARG3(*olddata),
     134                                             IPC_GET_ARG1(answer->data));
     135                }
     136        }
     137        return 0;
    128138}
    129139
     
    135145{
    136146        int newphid;
     147        size_t size;
    137148
    138149        switch (IPC_GET_METHOD(call->data)) {
     
    146157                call->private = newphid;
    147158                break;
     159        case IPC_M_AS_SEND:
     160                size = as_get_size(IPC_GET_ARG2(call->data));
     161                if (!size) {
     162                        return EPERM;
     163                }
     164                IPC_SET_ARG3(call->data, size);
     165                break;
    148166        default:
    149167                break;
     
    377395        ipc_data_t saved_data;
    378396        int saveddata = 0;
     397        int rc;
    379398
    380399        call = get_call(callid);
     
    390409        IPC_SET_ARG1(call->data, arg1);
    391410        IPC_SET_ARG2(call->data, arg2);
    392         answer_preprocess(call, saveddata ? &saved_data : NULL);
     411        rc = answer_preprocess(call, saveddata ? &saved_data : NULL);
    393412
    394413        ipc_answer(&TASK->answerbox, call);
    395         return 0;
     414        return rc;
    396415}
    397416
     
    417436                return rc;
    418437
    419         answer_preprocess(call, saveddata ? &saved_data : NULL);
     438        rc = answer_preprocess(call, saveddata ? &saved_data : NULL);
    420439       
    421440        ipc_answer(&TASK->answerbox, call);
    422441
    423         return 0;
     442        return rc;
    424443}
    425444
Note: See TracChangeset for help on using the changeset viewer.