Example 3-1 illustrates how to retrieve a structure containing addresses of UNIX function calls which can later be used to make indirect system calls. This structure is stored as a property called PROP_CPU_FUNCTION_ARRAY which is attached to the CPU node of the device tree.
/* include files */
#include <cpu/unixProp.h>
#include <exec/chLoader.h>
.
.
/* declaration of pointer for address handling */
static UnixFct* unixFct;
.
.
DevProperty prop;
void** tmpPtr;
/* looking for the CPU node in the device tree */
cpuNode = dtreeNodeFind(dtreeNodeRoot(), NODE_CPU);
if (cpuNode == NULL) {
DKI_ERR(("No NODE_CPU in the device tree\n"));
return;
}
/* Retrieve PROP_CPU_FUNCTION_ARRAY property */
prop = dtreePropFind(cpuNode, PROP_CPU_FUNCTION_ARRAY);
if (prop == NULL) {
DKI_ERR(("No PROP_CPU_FUNCTION_ARRAY property in the NODE_CPU node\n"));
return;
}
/* reading of its value */
tmpPtr = dtreePropValue(prop);
if (tmpPtr == NULL) {
DKI_ERR(("No PROP_CPU_FUNCTION_ARRAY value in the NODE_CPU node\n"));
return;
}
unixFct = *tmpPtr;
Access your UNIX functions using the -> structure operator:
unixFct->function_name
function_name is the name of the function you want to call.
Please refer to the exec/chLoader.h header file for a list of types and parameters. Note that some types and constants have been prefixed to avoid conflicts with ChorusOS types and constants.