mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			1236 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1236 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright 2010-2016 Intel Corporation.
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or modify it
 | |
|  * under the terms of the GNU Lesser General Public License as published
 | |
|  * by the Free Software Foundation, version 2.1.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with this library; if not, write to the Free Software
 | |
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
|  * 02110-1301 USA.
 | |
|  *
 | |
|  * Disclaimer: The codes contained in these modules may be specific
 | |
|  * to the Intel Software Development Platform codenamed Knights Ferry,
 | |
|  * and the Intel product codenamed Knights Corner, and are not backward
 | |
|  * compatible with other Intel products. Additionally, Intel will NOT
 | |
|  * support the codes or instruction set in future products.
 | |
|  *
 | |
|  * Intel offers no warranty of any kind regarding the code. This code is
 | |
|  * licensed on an "AS IS" basis and Intel is not obligated to provide
 | |
|  * any support, assistance, installation, training, or other services
 | |
|  * of any kind. Intel is also not obligated to provide any updates,
 | |
|  * enhancements or extensions. Intel specifically disclaims any warranty
 | |
|  * of merchantability, non-infringement, fitness for any particular
 | |
|  * purpose, and any other warranty.
 | |
|  *
 | |
|  * Further, Intel disclaims all liability of any kind, including but
 | |
|  * not limited to liability for infringement of any proprietary rights,
 | |
|  * relating to the use of the code, even if Intel is notified of the
 | |
|  * possibility of such liability. Except as expressly stated in an Intel
 | |
|  * license agreement provided with this code and agreed upon with Intel,
 | |
|  * no license, express or implied, by estoppel or otherwise, to any
 | |
|  * intellectual property rights is granted herein.
 | |
|  */
 | |
| 
 | |
| #ifndef _COIPROCESS_SOURCE_H
 | |
| #define _COIPROCESS_SOURCE_H
 | |
| 
 | |
| /** @ingroup COIProcess
 | |
|  *  @addtogroup COIProcessSource
 | |
| @{
 | |
| * @file source/COIProcess_source.h
 | |
| */
 | |
| #ifndef DOXYGEN_SHOULD_SKIP_THIS
 | |
| 
 | |
| #include "../common/COITypes_common.h"
 | |
| #include "../common/COIResult_common.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| #endif // DOXYGEN_SHOULD_SKIP_THIS
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| /// This is a special COIPROCESS handle that can be used to indicate that
 | |
| /// the source process should be used for an operation.
 | |
| ///
 | |
| #define COI_PROCESS_SOURCE ((COIPROCESS)-1)
 | |
| 
 | |
| #define COI_MAX_FILE_NAME_LENGTH 256
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| /// This is a flag for COIProcessCreateFromMemory that indicates the passed in
 | |
| /// memory pointer is a fat binary file and should not have regular validation.
 | |
| ///
 | |
| #define COI_FAT_BINARY ((uint64_t)-1)
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Create a remote process on the Sink and start executing its main()
 | |
| /// function.
 | |
| ///
 | |
| /// For more details about creating a process see COIProcessCreateFromMemory.
 | |
| ///
 | |
| /// @param  in_Engine
 | |
| ///         [in] A handle retrieved via a call to COIEngineGetHandle() that
 | |
| ///         indicates which device to create the process on. This is
 | |
| ///         necessary because there can be more than one device
 | |
| ///         within the system.
 | |
| ///
 | |
| /// @param  in_pBinaryName
 | |
| ///         [in] Pointer to a null-terminated string that contains the
 | |
| ///         path to the program binary to be instantiated as a process on
 | |
| ///         the sink device. The file name will be accessed via
 | |
| ///         fopen and fread, as such, the passed in binary name must
 | |
| ///         be locatable via these commands. Also, the file name (without
 | |
| ///         directory information) will be used automatically by the system
 | |
| ///         to create the argv[0] of the new process.
 | |
| ///
 | |
| /// @param  in_Argc
 | |
| ///         [in] The number of arguments being passed in to the process in the
 | |
| ///         in_ppArgv parameter.
 | |
| ///
 | |
| /// @param  in_ppArgv
 | |
| ///         [in] An array of strings that represent the arguments being passed
 | |
| ///         in. The system will auto-generate argv[0] using in_pBinaryName and
 | |
| ///         thus that parameter cannot be passed in using in_ppArgv. Instead,
 | |
| ///         in_ppArgv contains the rest of the parameters being passed in.
 | |
| ///
 | |
| /// @param  in_DupEnv
 | |
| ///         [in] A boolean that indicates whether the process that is being
 | |
| ///         created should inherit the environment of the caller.
 | |
| ///
 | |
| /// @param  in_ppAdditionalEnv
 | |
| ///         [in] An array of strings that represent additional environment
 | |
| ///         variables. This parameter must terminate the array with a NULL
 | |
| ///         string. For convenience it is also allowed to be NULL if there are
 | |
| ///         no additional environment variables that need adding. Note that
 | |
| ///         any environment variables specified here will be in addition to
 | |
| ///         but override those that were inherited via in_DupEnv.
 | |
| ///
 | |
| /// @param  in_ProxyActive
 | |
| ///         [in] A boolean that specifies whether the process that is to be
 | |
| ///         created wants I/O proxy support. If this flag is enabled, then
 | |
| ///         stdout and stderr are forwarded back to the calling process's
 | |
| ///         output and error streams.
 | |
| ///
 | |
| /// @param  in_Reserved
 | |
| ///         Reserved for future use, best set at NULL.
 | |
| ///
 | |
| /// @param  in_InitialBufferSpace
 | |
| ///         [in] The initial memory (in bytes) that will be pre-allocated at
 | |
| ///         process creation for use by buffers associated with this remote
 | |
| ///         process. In addition to allocating, Intel(R) Coprocessor Offload
 | |
| ///         Infrastructure (Intel(R) COI) will also fault in the
 | |
| ///         memory during process creation. If the total size of the buffers
 | |
| ///         in use by this process exceed this initial size, memory on the
 | |
| ///         sink may continue to be allocated on demand, as needed, subject
 | |
| ///         to the system constraints on the sink.
 | |
| ///
 | |
| ///@param   in_LibrarySearchPath
 | |
| ///         [in] a path to locate dynamic libraries dependencies for the sink
 | |
| ///         application. If not NULL, this path will override the environment
 | |
| ///         variable SINK_LD_LIBRARY_PATH. If NULL it will use
 | |
| ///         SINK_LD_LIBRARY_PATH to locate dependencies.
 | |
| ///
 | |
| /// @param  out_pProcess
 | |
| ///         [out] Handle returned to uniquely identify the process that was
 | |
| ///         created for use in later API calls.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the remote process was successfully created.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if in_pBinaryName was NULL.
 | |
| ///
 | |
| /// @return COI_INVALID_FILE if in_pBinaryName is not a "regular file" as
 | |
| ///         determined by stat or if its size is 0.
 | |
| ///
 | |
| /// @return COI_DOES_NOT_EXIST if in_pBinaryName cannot be found.
 | |
| ///
 | |
| /// @return See COIProcessCreateFromMemory for additional errors.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT
 | |
| COIProcessCreateFromFile(
 | |
|     COIENGINE           in_Engine,
 | |
|     const   char               *in_pBinaryName,
 | |
|     int                 in_Argc,
 | |
|     const   char              **in_ppArgv,
 | |
|     uint8_t             in_DupEnv,
 | |
|     const   char              **in_ppAdditionalEnv,
 | |
|     uint8_t             in_ProxyActive,
 | |
|     const   char               *in_Reserved,
 | |
|     uint64_t            in_InitialBufferSpace,
 | |
|     const   char               *in_LibrarySearchPath,
 | |
|     COIPROCESS         *out_pProcess);
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Create a remote process on the Sink and start executing its main()
 | |
| /// function. This will also automatically load any dependent shared objects
 | |
| /// on to the device. Once the process is created, remote calls can be
 | |
| /// initiated by using the RunFunction mechanism found in the COIPipeline APIs.
 | |
| ///
 | |
| /// If instead of creating a process you only wish to check for dynamic
 | |
| /// library dependencies set the environment variable
 | |
| /// SINK_LD_TRACE_LOADED_OBJECTS to be non empty before making this call.
 | |
| ///
 | |
| /// If there are dynamic link libraries on the source file system that need to
 | |
| /// be preloaded when the process is created on the device, callers of this
 | |
| /// API can set the environment variable SINK_LD_PRELOAD to a colon separated
 | |
| /// list of libraries that need to be copied to the sink and preloaded as part
 | |
| /// of process creation.
 | |
| ///
 | |
| /// For more information on how dependencies are loaded, see
 | |
| /// COIProcessLoadLibraryFromMemory.
 | |
| ///
 | |
| /// @param  in_Engine
 | |
| ///         [in] A handle retrieved via a call to COIEngineGetHandle() that
 | |
| ///         indicates which device to create the process on. This is
 | |
| ///         necessary because there can be more than one device
 | |
| ///         within the system.
 | |
| ///
 | |
| /// @param  in_pBinaryName
 | |
| ///         [in] Pointer to a null-terminated string that contains the name to
 | |
| ///         give the process that will be created. Note that the final name
 | |
| ///         will strip out any directory information from in_pBinaryName and
 | |
| ///         use the file information to generate an argv[0] for the new
 | |
| ///         process.
 | |
| ///
 | |
| /// @param  in_pBinaryBuffer
 | |
| ///         [in] Pointer to a buffer whose contents represent the sink-side
 | |
| ///         process that we want to create.
 | |
| ///
 | |
| /// @param  in_BinaryBufferLength
 | |
| ///         [in] Number of bytes in in_pBinaryBuffer.
 | |
| ///
 | |
| /// @param  in_Argc
 | |
| ///         [in] The number of arguments being passed in to the process in the
 | |
| ///         in_ppArgv parameter.
 | |
| ///
 | |
| /// @param  in_ppArgv
 | |
| ///         [in] An array of strings that represent the arguments being passed
 | |
| ///         in. The system will auto-generate argv[0] using in_pBinaryName and
 | |
| ///         thus that parameter cannot be passed in using in_ppArgv. Instead,
 | |
| ///         in_ppArgv contains the rest of the parameters being passed in.
 | |
| ///
 | |
| /// @param  in_DupEnv
 | |
| ///         [in] A boolean that indicates whether the process that is being
 | |
| ///         created should inherit the environment of the caller.
 | |
| ///
 | |
| /// @param  in_ppAdditionalEnv
 | |
| ///         [in] An array of strings that represent additional environment
 | |
| ///         variables. This parameter must terminate the array with a NULL
 | |
| ///         string. For convenience it is also allowed to be NULL if there are
 | |
| ///         no additional environment variables that need adding. Note that
 | |
| ///         any environment variables specified here will be in addition to
 | |
| ///         but override those that were inherited via in_DupEnv.
 | |
| ///
 | |
| /// @param  in_ProxyActive
 | |
| ///         [in] A boolean that specifies whether the process that is to be
 | |
| ///         created wants I/O proxy support.
 | |
| ///
 | |
| /// @param  in_Reserved
 | |
| ///         Reserved for future use, best set to NULL.
 | |
| ///
 | |
| /// @param  in_InitialBufferSpace
 | |
| ///         [in] The initial memory (in bytes) that will be pre-allocated at
 | |
| ///         process creation for use by buffers associated with this remote
 | |
| ///         process. In addition to allocating, Intel(R) Coprocessor
 | |
| ///         Offload Infrastructure (Intel(R) COI) will also fault in the
 | |
| ///         memory during process creation. If the total size of the buffers
 | |
| ///         in use by this process exceed this initial size, memory on the
 | |
| ///         sink may continue to be allocated on demand, as needed, subject
 | |
| ///         to the system constraints on the sink.
 | |
| ///
 | |
| /// @param  in_LibrarySearchPath
 | |
| ///         [in] A path to locate dynamic libraries dependencies for the sink
 | |
| ///         application. If not NULL, this path will override the environment
 | |
| ///         variable SINK_LD_LIBRARY_PATH. If NULL it will use
 | |
| ///         SINK_LD_LIBRARY_PATH to locate dependencies.
 | |
| ///
 | |
| /// @param  in_FileOfOrigin
 | |
| ///         [in] If not NULL, this parameter indicates the file from which the
 | |
| ///         in_pBinaryBuffer was obtained. This parameter is optional.
 | |
| ///
 | |
| /// @param  in_FileOfOriginOffset
 | |
| ///         [in] If in_FileOfOrigin is not NULL, this parameter indicates the
 | |
| ///         offset within that file where in_pBinaryBuffer begins.
 | |
| ///
 | |
| /// @param  out_pProcess
 | |
| ///         [out] Handle returned to uniquely identify the process that was
 | |
| ///         created for use in later API calls.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the remote process was successfully created.
 | |
| ///
 | |
| /// @return COI_INVALID_HANDLE if the in_Engine handle passed in was invalid.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if out_pProcess was NULL.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if in_pBinaryName or in_pBinaryBuffer was NULL.
 | |
| ///
 | |
| /// @return COI_MISSING_DEPENDENCY if a dependent library is missing from
 | |
| ///         either SINK_LD_LIBRARY_PATH or the in_LibrarySearchPath parameter.
 | |
| ///
 | |
| /// @return COI_BINARY_AND_HARDWARE_MISMATCH if in_pBinaryName or any of its
 | |
| ///         recursive dependencies were built for a target machine that does
 | |
| ///         not match the engine specified.
 | |
| ///
 | |
| /// @return COI_RESOURCE_EXHAUSTED if no more COIProcesses can be created,
 | |
| ///         possibly, but not necessarily because in_InitialBufferSpace is too
 | |
| ///         large.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if in_Argc is 0 and in_ppArgv is not NULL.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if in_Argc is greater than 0 and in_ppArgv is
 | |
| ///         NULL.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if in_Argc is less than 0.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if the length of in_pBinaryName is greater than or
 | |
| ///         equal to COI_MAX_FILE_NAME_LENGTH.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if in_BinaryBufferLength is 0.
 | |
| ///
 | |
| /// @return COI_TIME_OUT_REACHED if establishing the communication channel with
 | |
| ///         the remote process timed out.
 | |
| ///
 | |
| /// @return COI_DOES_NOT_EXIST if in_FileOfOrigin is not NULL and does not
 | |
| ///         exist.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if in_FileOfOrigin is NULL and
 | |
| ///         in_FileOfOriginOffset is not 0.
 | |
| ///
 | |
| /// @return COI_INVALID_FILE if in_FileOfOrigin is not a "regular file" as
 | |
| ///         determined by stat or if its size is 0.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if in_FileOfOrigin exists but its size is
 | |
| ///         less than in_FileOfOriginOffset + in_BinaryBufferLength.
 | |
| ///
 | |
| /// @return COI_NOT_INITIALIZED if the environment variable
 | |
| ///         SINK_LD_TRACE_LOADED_OBJECTS is set to a non empty string and there
 | |
| ///         are no errors locating the shared library dependencies.
 | |
| ///
 | |
| /// @return COI_PROCESS_DIED if at some point during the loading of the remote
 | |
| ///         process the remote process terminated abnormally.
 | |
| ///
 | |
| /// @return COI_VERSION_MISMATCH if the version of Intel(R) Coprocessor
 | |
| ///         Offload Infrastructure (Intel(R) COI) on the host is not
 | |
| ///         compatible with the version on the device.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT
 | |
| COIProcessCreateFromMemory(
 | |
|     COIENGINE           in_Engine,
 | |
|     const   char               *in_pBinaryName,
 | |
|     const   void               *in_pBinaryBuffer,
 | |
|     uint64_t            in_BinaryBufferLength,
 | |
|     int                 in_Argc,
 | |
|     const   char              **in_ppArgv,
 | |
|     uint8_t             in_DupEnv,
 | |
|     const   char              **in_ppAdditionalEnv,
 | |
|     uint8_t             in_ProxyActive,
 | |
|     const   char               *in_Reserved,
 | |
|     uint64_t            in_InitialBufferSpace,
 | |
|     const   char               *in_LibrarySearchPath,
 | |
|     const   char               *in_FileOfOrigin,
 | |
|     uint64_t            in_FileOfOriginOffset,
 | |
|     COIPROCESS         *out_pProcess);
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Destroys the indicated process, releasing its resources. Note, this
 | |
| /// will destroy any outstanding pipelines created in this process as well.
 | |
| ///
 | |
| /// @param  in_Process
 | |
| ///         [in] Process to destroy.
 | |
| ///
 | |
| /// @param  in_WaitForMainTimeout
 | |
| ///         [in] The number of milliseconds to wait for the main() function
 | |
| ///         to return in the sink process before timing out. -1 means to wait
 | |
| ///         indefinitely.
 | |
| ///
 | |
| /// @param  in_ForceDestroy
 | |
| ///         [in] If this flag is set to true, then the sink process will be
 | |
| ///         forcibly terminated after the timeout has been reached. A timeout
 | |
| ///         value of 0 will kill the process immediately, while a timeout of
 | |
| ///         -1 is invalid. If the flag is set to false then a message will
 | |
| ///         be sent to the sink process requesting a clean shutdown. A value
 | |
| ///         of false along with a timeout of 0 does not send a shutdown
 | |
| ///         message, instead simply polls the process to see if it is alive.
 | |
| ///         In most cases this flag should be set to false. If a sink process
 | |
| ///         is not responding then it may be necessary to set this flag to
 | |
| ///         true.
 | |
| ///
 | |
| /// @param  out_pProcessReturn
 | |
| ///         [out] The value returned from the main() function executing in
 | |
| ///         the sink process. This is an optional parameter. If the caller
 | |
| ///         is not interested in the return value from the remote process
 | |
| ///         they may pass in NULL for this parameter. The output value of
 | |
| ///         this pointer is only meaningful if COI_SUCCESS is returned.
 | |
| ///
 | |
| /// @param  out_pTerminationCode
 | |
| ///         [out] This parameter specifies the termination code. This will
 | |
| ///         be 0 if the remote process exited cleanly. If the remote process
 | |
| ///         exited abnormally this will contain the termination code given
 | |
| ///         by the operating system of the remote process. This is an optional
 | |
| ///         parameter and the caller may pass in NULL if they are not
 | |
| ///         interested in the termination code. The output value of this
 | |
| ///         pointer is only meaningful if COI_SUCCESS is returned.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the process was destroyed.
 | |
| ///
 | |
| /// @return COI_INVALID_HANDLE if the process handle passed in was invalid.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE for any negative in_WaitForMainTimeout value
 | |
| ///         except -1.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if in_WaitForMainTimeout is -1 and
 | |
| ///         in_ForceDestroy is true.
 | |
| ///
 | |
| /// @return COI_TIME_OUT_REACHED if the sink process is still running after
 | |
| ///         waiting in_WaitForMainTimeout milliseconds and in_ForceDestroy
 | |
| ///         is false. This is true even if in_WaitForMainTimeout was 0.
 | |
| ///         In this case, out_pProcessReturn and out_pTerminationCode
 | |
| ///         are undefined.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT
 | |
| COIProcessDestroy(
 | |
|     COIPROCESS              in_Process,
 | |
|     int32_t                 in_WaitForMainTimeout,
 | |
|     uint8_t                 in_ForceDestroy,
 | |
|     int8_t                 *out_pProcessReturn,
 | |
|     uint32_t               *out_pTerminationCode);
 | |
| 
 | |
| 
 | |
| #define COI_MAX_FUNCTION_NAME_LENGTH 256
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Given a loaded native process, gets an array of function handles that can
 | |
| /// be used to schedule run functions on a pipeline associated with that
 | |
| /// process. See the documentation for COIPipelineRunFunction() for
 | |
| /// additional information. All functions that are to be retrieved in this
 | |
| /// fashion must have the define COINATIVEPROCESSEXPORT preceding their type
 | |
| /// specification. For functions that are written in C++, either the entries
 | |
| /// in in_pFunctionNameArray in must be pre-mangled, or the functions must be
 | |
| /// declared as extern "C". It is also necessary to link the binary containing
 | |
| /// the exported functions with the -rdynamic linker flag.
 | |
| /// It is possible for this call to successfully find function handles for
 | |
| /// some of the names passed in but not all of them. If this occurs
 | |
| /// COI_DOES_NOT_EXIST will return and any handles not found will be returned
 | |
| /// as NULL.
 | |
| ///
 | |
| /// @param  in_Process
 | |
| ///         [in] Process handle previously returned via COIProcessCreate().
 | |
| ///
 | |
| /// @param  in_NumFunctions
 | |
| ///         [in] Number of function names passed in to the in_pFunctionNames
 | |
| ///         array.
 | |
| ///
 | |
| /// @param  in_ppFunctionNameArray
 | |
| ///         [in] Pointer to an array of null-terminated strings that match
 | |
| ///         the name of functions present in the code of the binary
 | |
| ///         previously loaded via COIProcessCreate(). Note that if a C++
 | |
| ///         function is used, then the string passed in must already be
 | |
| ///         properly name-mangled, or extern "C" must be used for where
 | |
| ///         the function is declared.
 | |
| ///
 | |
| /// @param  out_pFunctionHandleArray
 | |
| ///         [in out] Pointer to a location created by the caller large
 | |
| ///         enough to hold an array of COIFUNCTION sized elements that has
 | |
| ///         in_numFunctions entries in the array.
 | |
| ///
 | |
| /// @return COI_SUCCESS if all function names indicated were found.
 | |
| ///
 | |
| /// @return COI_INVALID_HANDLE if the in_Process handle passed in was invalid.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if in_NumFunctions is zero.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if the in_ppFunctionNameArray or
 | |
| ///         out_pFunctionHandleArray pointers was NULL.
 | |
| ///
 | |
| /// @return COI_DOES_NOT_EXIST if one or more function names were not
 | |
| ///         found. To determine the function names that were not found,
 | |
| ///         check which elements in the out_pFunctionHandleArray
 | |
| ///         are set to NULL.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if any of the null-terminated strings passed in
 | |
| ///         via in_ppFunctionNameArray were more than
 | |
| ///         COI_MAX_FUNCTION_NAME_LENGTH characters in length including
 | |
| ///         the null.
 | |
| ///
 | |
| /// @warning This operation can take several milliseconds so it is recommended
 | |
| ///          that it only be done at load time.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT
 | |
| COIProcessGetFunctionHandles(
 | |
|     COIPROCESS          in_Process,
 | |
|     uint32_t            in_NumFunctions,
 | |
|     const   char              **in_ppFunctionNameArray,
 | |
|     COIFUNCTION        *out_pFunctionHandleArray);
 | |
| 
 | |
| #if COI_LIBRARY_VERSION >= 2
 | |
| /// @name COIProcessLoadLibrary* flags, named after the corresponding
 | |
| /// RTLD flags that are passed into dlopen().
 | |
| /// Please consult a Linux manual for more information about these flags.
 | |
| //@{
 | |
| #define COI_LOADLIBRARY_LOCAL      0x00000
 | |
| #define COI_LOADLIBRARY_GLOBAL     0x00100
 | |
| 
 | |
| #define COI_LOADLIBRARY_LAZY       0x00001
 | |
| #define COI_LOADLIBRARY_NOW        0x00002
 | |
| #define COI_LOADLIBRARY_NOLOAD     0x00004
 | |
| #define COI_LOADLIBRARY_DEEPBIND   0x00008
 | |
| #define COI_LOADLIBRARY_NODELETE   0x01000
 | |
| 
 | |
| /// Flags to replicate the behaviour of the original version of
 | |
| /// COIProcessLoadLibrary* APIs.
 | |
| #define COI_LOADLIBRARY_V1_FLAGS   (COI_LOADLIBRARY_GLOBAL|COI_LOADLIBRARY_NOW)
 | |
| 
 | |
| //@}
 | |
| 
 | |
| #endif
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Loads a shared library into the specified remote process, akin to using
 | |
| /// dlopen() on a local process in Linux or LoadLibrary() in Windows.
 | |
| /// Dependencies for this library that are not listed with absolute paths
 | |
| /// are searched for first in current working directory, then in the
 | |
| /// colon-delimited paths in the environment variable SINK_LD_LIBRARY_PATH,
 | |
| /// and finally on the sink in the standard search paths as defined by the
 | |
| /// sink's operating system / dynamic loader.
 | |
| ///
 | |
| /// @param  in_Process
 | |
| ///         [in] Process to load the library into.
 | |
| ///
 | |
| /// @param  in_pLibraryBuffer
 | |
| ///         [in] The memory buffer containing the shared library to load.
 | |
| ///
 | |
| /// @param  in_LibraryBufferLength
 | |
| ///         [in] The number of bytes in the memory buffer in_pLibraryBuffer.
 | |
| ///
 | |
| /// @param  in_pLibraryName
 | |
| ///         [in] Name for the shared library. This optional parameter can
 | |
| ///         be specified in case the dynamic library doesn't have an
 | |
| ///         SO_NAME field. If specified, it will take precedence over
 | |
| ///         the SO_NAME if it exists. If it is not specified then
 | |
| ///         the library must have a valid SO_NAME field.
 | |
| ///
 | |
| ///@param   in_LibrarySearchPath
 | |
| ///         [in] A path to locate dynamic libraries dependencies for the
 | |
| ///         library being loaded. If not NULL, this path will override the
 | |
| ///         environment variable SINK_LD_LIBRARY_PATH. If NULL it will use
 | |
| ///         SINK_LD_LIBRARY_PATH to locate dependencies.
 | |
| ///
 | |
| ///@param   in_LibrarySearchPath
 | |
| ///         [in] A path to locate dynamic libraries dependencies for the sink
 | |
| ///         application. If not NULL, this path will override the environment
 | |
| ///         variable SINK_LD_LIBRARY_PATH. If NULL it will use
 | |
| ///         SINK_LD_LIBRARY_PATH to locate dependencies.
 | |
| ///
 | |
| /// @param  in_FileOfOrigin
 | |
| ///         [in] If not NULL, this parameter indicates the file from which the
 | |
| ///         in_pBinaryBuffer was obtained. This parameter is optional.
 | |
| ///
 | |
| /// @param  in_FileOfOriginOffset
 | |
| ///         [in] If in_FileOfOrigin is not NULL, this parameter indicates the
 | |
| ///         offset within that file where in_pBinaryBuffer begins.
 | |
| ///
 | |
| #if COI_LIBRARY_VERSION >= 2
 | |
| /// @param  in_Flags
 | |
| ///         [in] Bitmask of the flags that will be passed in as the dlopen()
 | |
| ///         "flag" parameter on the sink.
 | |
| ///
 | |
| #endif
 | |
| ///
 | |
| /// @param  out_pLibrary
 | |
| ///         [out] If COI_SUCCESS or COI_ALREADY_EXISTS is returned, the handle
 | |
| ///         that uniquely identifies the loaded library.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the library was successfully loaded.
 | |
| ///
 | |
| /// @return COI_INVALID_HANDLE if the process handle passed in was invalid.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if in_LibraryBufferLength is 0.
 | |
| ///
 | |
| /// @return COI_INVALID_FILE if in_pLibraryBuffer does not represent a valid
 | |
| ///         shared library file.
 | |
| ///
 | |
| /// @return COI_MISSING_DEPENDENCY if a dependent library is missing from
 | |
| ///         either SINK_LD_LIBRARY_PATH or the in_LibrarySearchPath parameter.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if the shared library is missing an SONAME
 | |
| ///         and in_pLibraryName is NULL.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if in_pLibraryName is the same as that of
 | |
| ///         any of the dependencies (recursive) of the library being loaded.
 | |
| ///
 | |
| /// @return COI_ALREADY_EXISTS if there is an existing COILIBRARY handle
 | |
| ///         that identifies this library, and this COILIBRARY hasn't been
 | |
| ///         unloaded yet.
 | |
| ///
 | |
| /// @return COI_BINARY_AND_HARDWARE_MISMATCH if the target machine of the
 | |
| ///         binary or any of its recursive dependencies does not match the
 | |
| ///         engine associated with in_Process.
 | |
| ///
 | |
| /// @return COI_UNDEFINED_SYMBOL if we are unable to load the library due to
 | |
| ///         an undefined symbol.
 | |
| ///
 | |
| /// @return COI_PROCESS_DIED if loading the library on the device caused
 | |
| ///         the remote process to terminate.
 | |
| ///
 | |
| /// @return COI_DOES_NOT_EXIST if in_FileOfOrigin is not NULL and does not
 | |
| ///         exist.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if in_FileOfOrigin is NULL and
 | |
| ///         in_FileOfOriginOffset is not 0.
 | |
| ///
 | |
| /// @return COI_INVALID_FILE if in_FileOfOrigin is not a "regular file" as
 | |
| ///         determined by stat or if its size is 0.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if in_FileOfOrigin exists but its size is
 | |
| ///         less than in_FileOfOriginOffset + in_BinaryBufferLength.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if out_pLibrary or in_pLibraryBuffer are NULL.
 | |
| ///
 | |
| #if COI_LIBRARY_VERSION >= 2
 | |
| COIACCESSAPI
 | |
| COIRESULT
 | |
| COIProcessLoadLibraryFromMemory(
 | |
|     COIPROCESS          in_Process,
 | |
|     const   void               *in_pLibraryBuffer,
 | |
|     uint64_t            in_LibraryBufferLength,
 | |
|     const   char               *in_pLibraryName,
 | |
|     const   char               *in_LibrarySearchPath,
 | |
|     const   char               *in_FileOfOrigin,
 | |
|     uint64_t            in_FileOfOriginOffset,
 | |
|     uint32_t            in_Flags,
 | |
|     COILIBRARY         *out_pLibrary);
 | |
| __asm__(".symver COIProcessLoadLibraryFromMemory,"
 | |
|         "COIProcessLoadLibraryFromMemory@COI_2.0");
 | |
| #else
 | |
| 
 | |
| COIRESULT
 | |
| COIProcessLoadLibraryFromMemory(
 | |
|     COIPROCESS          in_Process,
 | |
|     const   void               *in_pLibraryBuffer,
 | |
|     uint64_t            in_LibraryBufferLength,
 | |
|     const   char               *in_pLibraryName,
 | |
|     const   char               *in_LibrarySearchPath,
 | |
|     const   char               *in_FileOfOrigin,
 | |
|     uint64_t            in_FileOfOriginOffset,
 | |
|     COILIBRARY         *out_pLibrary);
 | |
| __asm__(".symver COIProcessLoadLibraryFromMemory,"
 | |
|         "COIProcessLoadLibraryFromMemory@COI_1.0");
 | |
| #endif
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Loads a shared library into the specified remote process, akin to using
 | |
| /// dlopen() on a local process in Linux or LoadLibrary() in Windows.
 | |
| ///
 | |
| /// For more details, see COIProcessLoadLibraryFromMemory.
 | |
| ///
 | |
| /// @param  in_Process
 | |
| ///         [in] Process to load the library into.
 | |
| ///
 | |
| /// @param  in_pFileName
 | |
| ///         [in] The name of the shared library file on the source's file
 | |
| ///         system that is being loaded. If the file name is not an absolute
 | |
| ///         path, the file is searched for in the same manner as dependencies.
 | |
| ///
 | |
| /// @param  in_pLibraryName
 | |
| ///         [in] Name for the shared library. This optional parameter can
 | |
| ///         be specified in case the dynamic library doesn't have an
 | |
| ///         SO_NAME field. If specified, it will take precedence over
 | |
| ///         the SO_NAME if it exists. If it is not specified then
 | |
| ///         the library must have a valid SO_NAME field.
 | |
| ///
 | |
| ///@param   in_LibrarySearchPath
 | |
| ///         [in] a path to locate dynamic libraries dependencies for the
 | |
| ///         library being loaded. If not NULL, this path will override the
 | |
| ///         environment variable SINK_LD_LIBRARY_PATH. If NULL it will use
 | |
| ///         SINK_LD_LIBRARY_PATH to locate dependencies.
 | |
| ///
 | |
| #if COI_LIBRARY_VERSION >= 2
 | |
| /// @param  in_Flags
 | |
| ///         [in] Bitmask of the flags that will be passed in as the dlopen()
 | |
| ///         "flag" parameter on the sink.
 | |
| ///
 | |
| #endif
 | |
| ///
 | |
| /// @param  out_pLibrary
 | |
| ///         [out] If COI_SUCCESS or COI_ALREADY_EXISTS is returned, the handle
 | |
| ///         that uniquely identifies the loaded library.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the library was successfully loaded.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if in_pFileName is NULL.
 | |
| ///
 | |
| /// @return COI_DOES_NOT_EXIST if in_pFileName cannot be found.
 | |
| ///
 | |
| /// @return COI_INVALID_FILE if the file is not a valid shared library.
 | |
| ///
 | |
| /// @return See COIProcessLoadLibraryFromMemory for additional errors.
 | |
| ///
 | |
| #if COI_LIBRARY_VERSION >= 2
 | |
| 
 | |
| COIACCESSAPI
 | |
| COIRESULT
 | |
| COIProcessLoadLibraryFromFile(
 | |
|     COIPROCESS          in_Process,
 | |
|     const   char               *in_pFileName,
 | |
|     const   char               *in_pLibraryName,
 | |
|     const   char               *in_LibrarySearchPath,
 | |
|     uint32_t            in_Flags,
 | |
|     COILIBRARY         *out_pLibrary);
 | |
| __asm__(".symver COIProcessLoadLibraryFromFile,"
 | |
|         "COIProcessLoadLibraryFromFile@COI_2.0");
 | |
| #else
 | |
| 
 | |
| COIRESULT
 | |
| COIProcessLoadLibraryFromFile(
 | |
|     COIPROCESS          in_Process,
 | |
|     const   char               *in_pFileName,
 | |
|     const   char               *in_pLibraryName,
 | |
|     const   char               *in_LibrarySearchPath,
 | |
|     COILIBRARY         *out_pLibrary);
 | |
| __asm__(".symver COIProcessLoadLibraryFromFile,"
 | |
|         "COIProcessLoadLibraryFromFile@COI_1.0");
 | |
| #endif
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Unloads a a previously loaded shared library from the specified
 | |
| /// remote process.
 | |
| ///
 | |
| /// @param  in_Process
 | |
| ///         [in] Process that we are unloading a library from.
 | |
| ///
 | |
| /// @param  in_Library
 | |
| ///         [in] Library that we want to unload.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the library was successfully loaded.
 | |
| ///
 | |
| /// @return COI_INVALID_HANDLE if the process or library handle were invalid.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT
 | |
| COIProcessUnloadLibrary(
 | |
|     COIPROCESS          in_Process,
 | |
|     COILIBRARY          in_Library);
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Registers shared libraries that are already in the host process's memory
 | |
| /// to be used during the shared library dependency resolution steps that take
 | |
| /// place during subsequent calls to COIProcessCreate* and
 | |
| /// COIProcessLoadLibrary*. If listed as a dependency, the registered library
 | |
| /// will be used to satisfy the dependency, even if there is another library
 | |
| /// on disk that also satisfies that dependency.
 | |
| ///
 | |
| /// Addresses registered must remain valid during subsequent calls to
 | |
| /// COIProcessCreate* and COIProcessLoadLibrary*.
 | |
| ///
 | |
| /// If the Sink is Linux, the shared libraries must have a library name
 | |
| /// (DT_SONAME field). On most compilers this means built with -soname.
 | |
| ///
 | |
| /// If successful, this API registers all the libraries. Otherwise none
 | |
| /// are registered.
 | |
| ///
 | |
| /// @param  in_NumLibraries
 | |
| ///         [in] The number of libraries that are being registered.
 | |
| ///
 | |
| /// @param  in_ppLibraryArray
 | |
| ///         [in] An array of pointers that point to the starting addresses
 | |
| ///         of the libraries.
 | |
| ///
 | |
| /// @param  in_pLibrarySizeArray
 | |
| ///         [in] An array of pointers that point to the number of bytes in
 | |
| ///         each of the libraries.
 | |
| ///
 | |
| /// @param  in_ppFileOfOriginArray
 | |
| ///         [in] An array of strings indicating the file from which the
 | |
| ///         library was obtained. This parameter is optional. Elements
 | |
| ///         in the array may be set to NULL.
 | |
| ///
 | |
| /// @param  in_pFileOfOriginOffSetArray
 | |
| ///         [in] If the corresponding entry in in_ppFileOfOriginArray is not
 | |
| ///         NULL, this parameter indicates the offsets within those files
 | |
| ///         where the corresponding libraries begin.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the libraries were registered successfully.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if in_NumLibraries is 0.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if in_ppLibraryArray or in_pLibrarySizeArray
 | |
| ///         are NULL.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if any of the pointers in in_ppLibraryArray
 | |
| ///         are NULL.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if any of the values in in_pLibrarySizeArray is 0.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if either one of in_ppFileOfOriginArray
 | |
| ///         and in_pFileOfOriginOffSetArray is NULL and the other is not.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if one of the addresses being registered does not
 | |
| ///         represent a valid library.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT
 | |
| COIProcessRegisterLibraries(
 | |
|     uint32_t            in_NumLibraries,
 | |
|     const   void              **in_ppLibraryArray,
 | |
|     const   uint64_t           *in_pLibrarySizeArray,
 | |
|     const   char              **in_ppFileOfOriginArray,
 | |
|     const   uint64_t           *in_pFileOfOriginOffSetArray);
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| /// The user can choose to have notifications for these internal events
 | |
| /// so that they can build their own profiling and performance layer on
 | |
| /// top of Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI).
 | |
| ///
 | |
| typedef enum COI_NOTIFICATIONS
 | |
| {
 | |
|     /// This event occurs when all explicit and implicit dependencies are
 | |
|     /// satisfied and Intel(R) Coprocessor Offload Infrastructure
 | |
|     /// (Intel(R) COI) schedules the run function to begin execution.
 | |
|     RUN_FUNCTION_READY = 0,
 | |
| 
 | |
|     /// This event occurs just before the run function actually starts
 | |
|     /// executing. There may be some latency between the ready and start
 | |
|     /// events if other run functions are already queued and ready to run.
 | |
|     RUN_FUNCTION_START,
 | |
| 
 | |
|     /// This event occurs when the run function finishes. This is when the
 | |
|     /// completion event for that run function would be signaled.
 | |
|     RUN_FUNCTION_COMPLETE,
 | |
| 
 | |
|     /// This event occurs when all explicit and implicit dependencies are
 | |
|     /// met for the pending buffer operation. Assuming buffer needs to be
 | |
|     /// moved, copied, read, etc... Will not be invoked if no actual memory
 | |
|     /// is moved, copied, read, etc. This means that COIBufferUnmap will
 | |
|     /// never result in a callback as it simply updates the status of the
 | |
|     /// buffer but doesn't initiate any data movement. COIBufferMap,
 | |
|     /// COIBufferSetState, COIBufferWrite, COIBufferRead and COIBufferCopy
 | |
|     /// do initiate data movement and therefore will invoke the callback.
 | |
|     BUFFER_OPERATION_READY,
 | |
| 
 | |
|     /// This event occurs when the buffer operation is completed.
 | |
|     BUFFER_OPERATION_COMPLETE,
 | |
| 
 | |
|     /// This event occurs when a user event is signaled from the remotely
 | |
|     /// a sink process. Local (source triggered) events do not trigger this.
 | |
|     USER_EVENT_SIGNALED
 | |
| } COI_NOTIFICATIONS;
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// A callback that will be invoked to notify the user of an internal
 | |
| /// Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI)
 | |
| /// event. Note that the callback is registered per process so any of the
 | |
| /// above notifications that happen on the registered process will receive
 | |
| /// the callback.
 | |
| /// As with any callback mechanism it is up to the user to make sure that
 | |
| /// there are no possible deadlocks due to reentrancy (i.e. the callback being
 | |
| /// invoked in the same context that triggered the notification) and also
 | |
| /// that the callback does not slow down overall processing. If the user
 | |
| /// performs too much work within the callback it could delay further
 | |
| /// processing. The callback will be invoked prior to the signaling of
 | |
| /// the corresponding COIEvent. For example, if a user is waiting
 | |
| /// for a COIEvent associated with a run function completing they will
 | |
| /// receive the callback before the COIEvent is marked as signaled.
 | |
| ///
 | |
| ///
 | |
| /// @param  in_Type
 | |
| ///         [in] The type of internal event that has occurred.
 | |
| ///
 | |
| /// @param  in_Process
 | |
| ///         [in] The process associated with the operation.
 | |
| ///
 | |
| /// @param  in_Event
 | |
| ///         [in] The completion event that is associated with the
 | |
| ///         operation that is being notified.
 | |
| ///
 | |
| /// @param  in_UserData
 | |
| ///         [in] Opaque data that was provided when the callback was
 | |
| ///         registered. Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI)
 | |
| ///         simply passes this back to the user so that
 | |
| ///         they can interpret it as they choose.
 | |
| ///
 | |
| typedef void (*COI_NOTIFICATION_CALLBACK)(
 | |
|     COI_NOTIFICATIONS   in_Type,
 | |
|     COIPROCESS          in_Process,
 | |
|     COIEVENT            in_Event,
 | |
|     const   void               *in_UserData);
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Register a callback to be invoked to notify that an internal
 | |
| /// Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI) event
 | |
| /// has occured on the process that is associated with the callback.
 | |
| /// Note that it is legal to have more than one callback registered with
 | |
| /// a given process but those must all be unique callback pointers.
 | |
| /// Note that setting a UserData value with COINotificationCallbackSetContext
 | |
| /// will override a value set when registering the callback.
 | |
| ///
 | |
| /// @param  in_Process
 | |
| ///         [in] Process that the callback is associated with. The callback
 | |
| ///         will only be invoked to notify an event for this specific process.
 | |
| ///
 | |
| /// @param  in_Callback
 | |
| ///         [in] Pointer to a user function used to signal a notification.
 | |
| ///
 | |
| /// @param  in_UserData
 | |
| ///         [in] Opaque data to pass to the callback when it is invoked.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the callback was registered successfully.
 | |
| ///
 | |
| /// @return COI_INVALID_HANDLE if the in_Process parameter does not identify
 | |
| ///         a valid process.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if the in_Callback parameter is NULL.
 | |
| ///
 | |
| /// @return COI_ALREADY_EXISTS if the user attempts to reregister the same
 | |
| ///         callback for a process.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT COIRegisterNotificationCallback(
 | |
|     COIPROCESS                  in_Process,
 | |
|     COI_NOTIFICATION_CALLBACK   in_Callback,
 | |
|     const   void               *in_UserData);
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Unregisters a callback, notifications will no longer be signaled.
 | |
| ///
 | |
| /// @param  in_Process
 | |
| ///         [in] Process that we are unregistering.
 | |
| ///
 | |
| /// @param  in_Callback
 | |
| ///         [in] The specific callback to unregister.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the callback was unregistered.
 | |
| ///
 | |
| /// @return COI_INVALID_HANDLE if the in_Process parameter does not identify
 | |
| ///         a valid process.
 | |
| ///
 | |
| /// @return COI_INVALID_POINTER if the in_Callback parameter is NULL.
 | |
| ///
 | |
| /// @return COI_DOES_NOT_EXIST if in_Callback was not previously registered
 | |
| ///         for in_Process.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT COIUnregisterNotificationCallback(
 | |
|     COIPROCESS                  in_Process,
 | |
|     COI_NOTIFICATION_CALLBACK   in_Callback);
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Set the user data that will be returned in the notification callback.
 | |
| /// This data is sticky and per thread so must be set prior to the
 | |
| /// Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI)
 | |
| /// operation being invoked. If you wish to set the context to be returned
 | |
| /// for a specific instance of a user event notification then the context
 | |
| /// must be set using this API prior to registering that user event with
 | |
| /// COIEventRegisterUserEvent.
 | |
| /// The value may be set prior to each Intel(R) Coprocessor Offload
 | |
| /// Infrastructure (Intel(R) COI) operation being called to
 | |
| /// effectively have a unique UserData per callback.
 | |
| /// Setting this value overrides any value that was set when the
 | |
| /// callback was registered and will also override any future registrations
 | |
| /// that occur.
 | |
| ///
 | |
| /// @param  in_UserData
 | |
| ///         [in] Opaque data to pass to the callback when it is invoked.
 | |
| ///         Note that this data is set per thread.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| void COINotificationCallbackSetContext(
 | |
|     const   void                       *in_UserData);
 | |
| 
 | |
| 
 | |
| /// @name COIProcessSetCacheSize flags.
 | |
| /// Flags are divided into two categories: _MODE_ and _ACTION_
 | |
| /// only one of each is valid with each call.
 | |
| /// _ACTIONS_ and _MODES_ should be bitwised OR'ed together, i.e. |
 | |
| //@{
 | |
| 
 | |
| /// Current set of DEFINED bits for _MODE_, can be used
 | |
| /// to clear or check fields, not useful to pass into APIs. Used internally.
 | |
| #define COI_CACHE_MODE_MASK                 0x00000007
 | |
| 
 | |
| /// Flag to indicate to keep the previous mode of operation. By default
 | |
| /// this would be COI_CACHE_MODE_ONDEMAND_SYNC. As of this release
 | |
| /// This is the only mode available. This mode is valid with _ACTION_
 | |
| /// flags.
 | |
| #define COI_CACHE_MODE_NOCHANGE             0x00000001
 | |
| 
 | |
| /// Mode of operation that indicates that COI will allocate physical
 | |
| /// cache memory exactly when it is is needed. COIPipeline execution in
 | |
| /// the given process will momentarily block until the allocation request
 | |
| /// is completed. This is and has been the default mode.
 | |
| #define COI_CACHE_MODE_ONDEMAND_SYNC        0x00000002
 | |
| 
 | |
| /// Not yet implemented. Future mode that will not stall a COIPipeline
 | |
| /// but prefer eviction/paging if possible as to immediately execute pipeline.
 | |
| /// At the same time, enqueue background requests to allocate extra cache
 | |
| /// so as to provide optimze behavior on subsequent runs.
 | |
| #define COI_CACHE_MODE_ONDEMAND_ASYNC       0x00000004
 | |
| 
 | |
| 
 | |
| /// Current set of DEFINED bits for _ACTION_ can be used
 | |
| /// to clear fields, but not useful to pass into API's. Used internally.
 | |
| #define COI_CACHE_ACTION_MASK               0x00070000
 | |
| 
 | |
| /// No action requested. With this flag specified
 | |
| /// it is recommended to NOT provide a out_pCompletion event,
 | |
| /// as with this flag, modes and values are immediately set.
 | |
| /// This is valid with _MODE_ flags.
 | |
| #define COI_CACHE_ACTION_NONE               0x00010000
 | |
| 
 | |
| /// This _ACTION_ flag will immediately attempt to increase the cache
 | |
| /// physical memory size to the current set pool size(s). Used to
 | |
| /// pre-allocate memory on remote processes, so that runfunction will
 | |
| /// enqueue faster. Also may prevent unused buffer eviction from process
 | |
| /// reducing overhead in trade for memory allocation cost.
 | |
| #define COI_CACHE_ACTION_GROW_NOW           0x00020000
 | |
| 
 | |
| /// Not yet implemented. Future _ACTION_ that will attempt to find unused
 | |
| /// allocated cache and free it, with the express goal of reducing the
 | |
| /// footprint on the remote process down to the value of the currently set
 | |
| /// pool size(s).
 | |
| #define COI_CACHE_ACTION_FREE_UNUSED        0x00040000
 | |
| 
 | |
| //@}
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Set the minimum preferred COIProcess cache size. By default these values
 | |
| /// are set to 1GB. With the default size of 1GB, Intel(R) COI will only
 | |
| /// grow the cache with each new buffer up until the set limit is consumed,
 | |
| /// after which, only required to accommodate additional buffers.
 | |
| /// This means that after the cache preference is met, a process will act
 | |
| /// as conservative as possible for memory consumption.
 | |
| /// This API will allow users to adjust memory consumption aggressiveness.
 | |
| ///
 | |
| /// Additional performance may be gained if the user sets a value higher than
 | |
| /// default. With high memory consumption user can choose to trade performance
 | |
| /// between memory allocation cost and transfer speeds to and from the
 | |
| /// remote process. A last consideration is that if buffers are used only
 | |
| /// once, it may be best to keep a small cache size, or ensure buffers are
 | |
| /// fully destroyed after their use.
 | |
| ///
 | |
| /// Adjusting this value to high may result in out of resource conditions.
 | |
| ///
 | |
| /// @param  in_pProcess
 | |
| ///         [in] Handle to uniquely identify the process for which the cache
 | |
| ///         is to be adjusted.
 | |
| ///
 | |
| /// @param  in_HugePagePoolSize
 | |
| ///         [in] The suggested size of the remote huge page cache in bytes.
 | |
| ///         This value defaults to 1GB. A process will only allocate cache
 | |
| ///         memory if the current cache is smaller than this limit, or it is
 | |
| ///         absolutely necessary to fulfill a request, but preferring to
 | |
| ///         re-use existing memory and paging unused buffers back to the host
 | |
| ///         Increasing this value will cause a process to
 | |
| ///         aggressively allocate memory on demand up to this value, before
 | |
| ///         evicting/paging memory from the remote process back to the host
 | |
| ///         process.
 | |
| ///
 | |
| ///         The net result is that memory consumption is increased, but the
 | |
| ///         user can 'cache' more buffers on the remote process. More time
 | |
| ///         may be spent during first use of run functions as more memory
 | |
| ///         may be allocated, but subsequent run functions will likely
 | |
| ///         see an increase in queueing performance as the data is already
 | |
| ///         valid in the remote process.
 | |
| ///
 | |
| ///         Users should tune this value for optimum performance balanced
 | |
| ///         against memory consumption. This value does not affect 4K page
 | |
| ///         cache. Please use in_SmallPagePoolSize for 4K pages.
 | |
| ///
 | |
| /// @param  in_HugeFlags
 | |
| ///         [in] Flags to select mode or action for huge page cache. One _MODE_
 | |
| ///         and one _ACTION_ flag are specified together. Default _MODE_ is
 | |
| ///         COI_CACHE_MODE_ONDEMAND_SYNC. See all COI_CACHE_MODE_* and
 | |
| ///         COI_CACHE_ACTION_* for other modes and actions. Default _ACTION_
 | |
| ///         is COI_CACHE_ACTION_NONE.
 | |
| ///
 | |
| /// @param  in_SmallPagePoolSize
 | |
| ///         [in] The suggested size of the remote 4K cache in bytes. Same
 | |
| ///         function as in_HugePagePoolSize but affecting only 4K page cache.
 | |
| ///         Defaults to 1GB.
 | |
| ///
 | |
| /// @param  in_SmallFlags
 | |
| ///         [in] Flags to select mode or action for 4K page cache. One _MODE_
 | |
| ///         and one _ACTION_ flag are be specified together. Default _MODE_ is
 | |
| ///         COI_CACHE_MODE_ONDEMAND_SYNC. See all COI_CACHE_MODE_* and
 | |
| ///         COI_CACHE_ACTION_* for other modes and actions.
 | |
| ///
 | |
| /// @param  in_NumDependencies
 | |
| ///         [in] The number of dependencies specified in the in_pDependencies
 | |
| ///         array. This may be 0 if the caller does not want the call to
 | |
| ///         wait for any events to be signaled.
 | |
| ///
 | |
| /// @param  in_pDependencies
 | |
| ///         [in] An optional array of handles to previously created COIEVENT
 | |
| ///         objects that this operation will wait for before starting.
 | |
| ///         This allows the user to create dependencies between asynchronous
 | |
| ///         calls and other operations such as run functions. The user may
 | |
| ///         pass in NULL if they do not wish to wait for any dependencies.
 | |
| ///         Only useful with _ACTION_ flags, otherwise there is no action
 | |
| ///         to wait on. All _MODE_ changes happen immediately.
 | |
| ///
 | |
| /// @param  out_pCompletion
 | |
| ///         [out] An optional pointer to a COIEVENT object that will be
 | |
| ///         signaled when the operation is complete. The user may pass in
 | |
| ///         NULL if the user wants the operation to block until completed.
 | |
| ///         Note: This flag is not useful unless paired with a
 | |
| ///               valid _ACTION_ flag.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the cache was successfully adjusted. In case of
 | |
| ///         valid flags including _ACTION_, if out_pCompletion was specified,
 | |
| ///         this does not indicate the operation succeeded, but rather only
 | |
| ///         it was successfully queued. For further information see
 | |
| ///         that COIEventWait() for getting return values.
 | |
| ///
 | |
| /// @return COI_INVALID_HANDLE if the in_Process handle passed in was invalid.
 | |
| ///
 | |
| /// @return COI_RESOURCE_EXHAUSTED if no more cache can be created,
 | |
| ///         possibly, but not necessarily because a pool size was set to large
 | |
| ///         and COI_CACHE_ACTION_GROW_NOW was specified.
 | |
| ///
 | |
| /// @return COI_NOT_SUPPORTED if more than one _MODE_ or _ACTION_ was
 | |
| ///         specified.
 | |
| ///
 | |
| /// @return COI_NOT_SUPPORTED if an invalid _MODE_ or _ACTION_ was
 | |
| ///         specified.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if in_NumDependencies is non-zero while
 | |
| ///         in_pDependencies was passed in as NULL.
 | |
| ///
 | |
| /// @return COI_OUT_OF_RANGE if one of the pool sizes was invalid.
 | |
| ///
 | |
| /// @return COI_PROCESS_DIED if at some point during the mode or action the
 | |
| ///         remote process terminated abnormally. Possible due to an out of
 | |
| ///         memory condition.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT COIProcessSetCacheSize(
 | |
|     const   COIPROCESS          in_Process,
 | |
|     const   uint64_t            in_HugePagePoolSize,
 | |
|     const   uint32_t            in_HugeFlags,
 | |
|     const   uint64_t            in_SmallPagePoolSize,
 | |
|     const   uint32_t            in_SmallFlags,
 | |
|     uint32_t            in_NumDependencies,
 | |
|     const   COIEVENT           *in_pDependencies,
 | |
|     COIEVENT           *out_pCompletion);
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| /// These are the different modes of operation that can be selected for
 | |
| /// the COI_DMA_MODE by the API COIProcessConfigureDMA. They allow the user
 | |
| /// to customize the DMA layer behaviour.
 | |
| ///
 | |
| typedef enum COI_DMA_MODE
 | |
| {
 | |
|     /// This mode will use one common logical channel for all DMA operations.
 | |
|     /// Using this mode requires a channel count of one.
 | |
|     COI_DMA_MODE_SINGLE = 0,
 | |
| 
 | |
|     /// This mode will dedicate on logical channel for write operations
 | |
|     /// and one logical channel for read operations. Requires a minimum of
 | |
|     /// two logical channels, if more than two are used they are ignored
 | |
|     /// in the current implementation.
 | |
|     COI_DMA_MODE_READ_WRITE,
 | |
| 
 | |
|     /// This mode is not yet implemented and is a placeholder for future
 | |
|     /// releases. Check here for updates when it is implemented.
 | |
|     /// Will require a minimum of two logical channels and a maximum
 | |
|     /// of four channels.
 | |
|     COI_DMA_MODE_ROUND_ROBIN,
 | |
| 
 | |
|     /// Reserved for internal use.
 | |
|     COI_DMA_RESERVED
 | |
| } COI_DMA_MODE;
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| ///
 | |
| /// Set the number and mode of the physical DMA channels that each COIProcess
 | |
| /// will establish during COIProcess creation.
 | |
| ///
 | |
| /// By default the runtime will operate in COI_DMA_MODE_SINGLE mode.
 | |
| /// This API is intended to be called before COIProcessCreateFromFile() or
 | |
| /// COIProcessCreateFromMemory(). The values are stored globally and will
 | |
| /// be used by the creation API's. It is possible to call this API once
 | |
| /// before each new COIPROCESS is created and thus have each COIPROCESS
 | |
| /// run in different modes. It is not possible to change the mode on an
 | |
| /// existing COIPROCESS.
 | |
| ///
 | |
| /// The larger number of logical connections requested will impose a
 | |
| /// performance penalty on the COIBUFFER creation API's, but unlock better
 | |
| /// parallelism for DMA transfers during runtime.
 | |
| ///
 | |
| /// A maximum value of four (4) channels is available today, but current
 | |
| /// implementation will only take advantage of two DMA channels. The option
 | |
| /// is left available for programmers to use in case future implementations
 | |
| /// provide performance advantages.
 | |
| ///
 | |
| /// It is important to note that for some operations that enabling this
 | |
| /// options may increase parallelism and require the user to enforce
 | |
| /// explicit dependencies for operations on the same buffers. See documentation
 | |
| /// for COIBufferRead/Write/Copy operations for more details.
 | |
| ///
 | |
| /// @param  in_Channels
 | |
| ///         [in] Number of logical connections to the remote COIProcess that
 | |
| ///         the runtime will establish and use for DMA transfer requests.
 | |
| ///         Will be ignored if in_Mode is set to COI_DMA_MODE_SINGLE.
 | |
| ///
 | |
| /// @param  in_Mode
 | |
| ///         [in] The mode of operation in which the runtime will use the
 | |
| ///         logical connections to the remote COIProcess.
 | |
| ///
 | |
| /// @return COI_SUCCESS if the mode and number of DMA channels requested
 | |
| ///         is valid. The actual create creation of channels and modes is
 | |
| ///         done during COIProcessCreateFromFile() and
 | |
| ///         COIProcessCreateFromMemory().
 | |
| ///
 | |
| /// @return COI_NOT_SUPPORTED if an invalid value for in_Channels or
 | |
| ///         in_Mode was requested.
 | |
| ///
 | |
| /// @return COI_ARGUMENT_MISMATCH if an invalid combination of in_Channels and
 | |
| ///          in_Mode was requested. Example could be 2 channels with
 | |
| ///          COI_DMA_MODE_SINGLE, or 1 channel with COI_DMA_MODE_READ_WRITE.
 | |
| ///
 | |
| COIACCESSAPI
 | |
| COIRESULT COIProcessConfigureDMA(
 | |
|     const   uint64_t            in_Channels,
 | |
|     const   COI_DMA_MODE        in_Mode);
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| } /* extern "C" */
 | |
| #endif
 | |
| 
 | |
| #endif /* _COIPROCESS_SOURCE_H */
 | |
| 
 | |
| /*! @} */
 |