/*
* \brief Support for process-local pseudo capabilities
* \author Norman Feske
* \date 2011-11-21
*
* Pseudo capabilities have a zero 'tid' and a non-zero 'local_name'. The local
* name is a pointer to the local object implementing the interface. Pseudo
* capabilties are valid only as arguments for local services that are prepared
* for it. I.e., the locally implemented RM service accepts pseudo dataspace
* capabilities that refer to managed dataspaces. Or the Linux-specific
* 'Rm_session_client' takes a pseudo capability to target RM-session
* invokations to the local implementation.
*
* Please note that this header file is not part of the official Genode API.
* It exists on no other platform than Linux and is meant for Genode-internal
* use only.
*/
/*
* Copyright (C) 2011-2012 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _INCLUDE__BASE__LOCAL_INTERFACE_H_
#define _INCLUDE__BASE__LOCAL_INTERFACE_H_
#include
#include
namespace Genode {
/**
* Common base class of local interface implementations
*/
struct Local_interface
{
virtual ~Local_interface() { }
/**
* Exception type
*/
class Non_local_capability { };
/**
* Convert pseudo capability to pointer to locally implemented session
*
* \param IF interface type
* \param cap pseudo capability
*
* \throw Non_local_capability if the argument does not refer to a
* locally implemented interface
*/
template
static IF *deref(Capability cap)
{
/* check if this is a pseudo capability */
if (cap.dst() != 0 || !cap.local_name())
throw Non_local_capability();
/*
* For a pseudo capability, the 'local_name' points to the local
* session object of the correct type.
*/
IF *interface = dynamic_cast((Local_interface *)cap.local_name());
if (!interface)
throw Non_local_capability();
return interface;
}
/**
* Construct pseudo capability to process-local interface implementation
*
* \param IF interface type
* \param interface pointer to local interface implementation
* \return pseudo capability
*
*/
template
static Capability capability(IF *interface)
{
return reinterpret_cap_cast(Native_capability(0, (long)interface));
};
};
}
#endif /* _INCLUDE__BASE__LOCAL_INTERFACE_H_ */