/* * 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 /** @} */