HelenOS sources

root/abi/include/abi/ipc/ipc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. ipc_set_retval
  2. ipc_set_imethod
  3. ipc_set_arg1
  4. ipc_set_arg2
  5. ipc_set_arg3
  6. ipc_set_arg4
  7. ipc_set_arg5
  8. ipc_get_imethod
  9. ipc_get_retval
  10. ipc_get_arg1
  11. ipc_get_arg2
  12. ipc_get_arg3
  13. ipc_get_arg4
  14. ipc_get_arg5

/*
 * Copyright (c) 2006 Ondrej Palkovsky
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - The name of the author may not be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/** @addtogroup abi_generic
 * @{
 */
/** @file
 */

#ifndef _ABI_IPC_IPC_H_
#define _ABI_IPC_IPC_H_

#include <stdint.h>
#include <abi/proc/task.h>
#include <abi/cap.h>
#include <_bits/errno.h>

/* Miscellaneous constants */
enum {
        /** Length of data being transferred with IPC call
         *
         * The uspace may not be able to utilize the full length
         *
         */
        IPC_CALL_LEN = 6,

        /** Maximum active async calls per phone */
        IPC_MAX_ASYNC_CALLS = 64,

        /**
         * Maximum buffer size allowed for IPC_M_DATA_WRITE and
         * IPC_M_DATA_READ requests.
         */
        DATA_XFER_LIMIT = 64 * 1024,
};

/* Flags for calls */
enum {
        /** This is answer to a call */
        IPC_CALL_ANSWERED       = 1 << 0,

        /** Answer will not be passed to userspace, will be discarded */
        IPC_CALL_DISCARD_ANSWER = 1 << 1,

        /** Call was forwarded */
        IPC_CALL_FORWARDED      = 1 << 2,

        /** Interrupt notification */
        IPC_CALL_NOTIF          = 1 << 3,

        /** The call was automatically answered by the kernel due to error */
        IPC_CALL_AUTO_REPLY     = 1 << 4,
};

/* Forwarding flags. */
enum {
        IPC_FF_NONE = 0,

        /**
         * The call will be routed as though it was initially sent via the phone
         * used to forward it. This feature is intended to support the situation
         * in which the forwarded call needs to be handled by the same
         * connection fibril as any other calls that were initially sent by
         * the forwarder to the same destination.
         * This flag has no imapct on routing replies.
         */
        IPC_FF_ROUTE_FROM_ME = 1 << 0,
};

/* Data transfer flags. */
enum {
        IPC_XF_NONE = 0,

        /** Restrict the transfer size if necessary. */
        IPC_XF_RESTRICT = 1 << 0,
};

/** User-defined IPC methods */
enum {
        IPC_FIRST_USER_METHOD = 1024,
};

typedef struct {
        sysarg_t args[IPC_CALL_LEN];
        /**
         * Task which made or forwarded the call with IPC_FF_ROUTE_FROM_ME,
         * or the task which answered the call.
         */
        task_id_t task_id;
        /** Flags */
        unsigned flags;
        /** User-defined label associated with requests */
        sysarg_t request_label;
        /** User-defined label associated with answers */
        sysarg_t answer_label;
        /** Capability handle */
        cap_call_handle_t cap_handle;
} ipc_data_t;

/* Functions for manipulating calling data */

static inline void ipc_set_retval(ipc_data_t *data, errno_t retval)
{
        data->args[0] = (sysarg_t) retval;
}

static inline void ipc_set_imethod(ipc_data_t *data, sysarg_t val)
{
        data->args[0] = val;
}

static inline void ipc_set_arg1(ipc_data_t *data, sysarg_t val)
{
        data->args[1] = val;
}

static inline void ipc_set_arg2(ipc_data_t *data, sysarg_t val)
{
        data->args[2] = val;
}

static inline void ipc_set_arg3(ipc_data_t *data, sysarg_t val)
{
        data->args[3] = val;
}

static inline void ipc_set_arg4(ipc_data_t *data, sysarg_t val)
{
        data->args[4] = val;
}

static inline void ipc_set_arg5(ipc_data_t *data, sysarg_t val)
{
        data->args[5] = val;
}

static inline sysarg_t ipc_get_imethod(ipc_data_t *data)
{
        return data->args[0];
}
static inline errno_t ipc_get_retval(ipc_data_t *data)
{
        return (errno_t) data->args[0];
}

static inline sysarg_t ipc_get_arg1(ipc_data_t *data)
{
        return data->args[1];
}

static inline sysarg_t ipc_get_arg2(ipc_data_t *data)
{
        return data->args[2];
}

static inline sysarg_t ipc_get_arg3(ipc_data_t *data)
{
        return data->args[3];
}

static inline sysarg_t ipc_get_arg4(ipc_data_t *data)
{
        return data->args[4];
}

static inline sysarg_t ipc_get_arg5(ipc_data_t *data)
{
        return data->args[5];
}

#endif

/** @}
 */

/* [<][>][^][v][top][bottom][index][help] */
HelenOS homepage, sources at GitHub