//
// Constructor
//
static VMIOS_CONSTRUCTOR_FN(constructor) {

    Uns32 i;

    // first few argument registers (standard ABI)
    object->args[0] = vmiosGetRegDesc(processor, "R3");
    object->args[1] = vmiosGetRegDesc(processor, "R4");
    object->args[2] = vmiosGetRegDesc(processor, "R5");

    // return register (standard ABI)
    object->result = vmiosGetRegDesc(processor, "R11");

    // stack pointer (standard ABI)
    object->sp = vmiosGetRegDesc(processor, "R1");

    // __impure_ptr address
    object->impurePtrDomain = vmirtAddressLookup(
        processor, ERRNO_REF, &object->impurePtrAddr
    );

    // initialise stdin, stderr and stdout
    object->fileDescriptors[0] = vmiosGetStdin(processor);
    object->fileDescriptors[1] = vmiosGetStdout(processor);
    object->fileDescriptors[2] = vmiosGetStderr(processor);

    // initialise remaining file descriptors
    for(i=3; i<FILE_DES_NUM; i++) {
        object->fileDescriptors[i] = -1;
    }
}
//
// Constructor
//
static VMIOS_CONSTRUCTOR_FN(constructor) {

    paramValuesP params = parameterValues;

    // get parameters
    object->argv = params->userargv;
    object->envp = params->userenvp;

    // first three argument registers
    object->args[0] = vmiosGetRegDesc(processor, "r0");
    object->args[1] = vmiosGetRegDesc(processor, "r1");
    object->args[2] = vmiosGetRegDesc(processor, "r2");

    // return register (standard ABI)
    object->resultReg = vmiosGetRegDesc(processor, "r0");

    // return register (standard ABI)
    object->argSP = vmiosGetRegDesc(processor, "sp");

    // Sets up data common to all newlib implementations
    // Defined in newlibSemiHost.c.h
    setupNewlib(object, processor);
}
// Constructor
//
static VMIOS_CONSTRUCTOR_FN(constructor)
{
    if(DIAG_LOW)
        vmiMessage("I", PREFIX, "Starting SLIRP");

    // What am I ?
    const char *procType = vmirtProcessorType(processor);
    if (strcmp(procType, "pse") != 0) {
        vmiMessage("F", PREFIX, "Processor must be a PSE");
    }
    memEndian  endian    = vmirtGetProcessorDataEndian(processor);
    if(endian != ENDIAN_NATIVE) {
        vmiMessage("F", PREFIX, "Host processor must have same endianity as a PSE");
    }

    // return register (standard ABI)
    object->result = vmiosGetRegDesc(processor, "eax");

    // stack pointer (standard ABI)
    object->sp = vmiosGetRegDesc(processor, "esp");

    object->count = 0;
}
//
// Constructor
//
static VMIOS_CONSTRUCTOR_FN(constructor) {

    // first three argument registers (standard ABI)
    object->args[0] = vmiosGetRegDesc(processor, "R5");
    object->args[1] = vmiosGetRegDesc(processor, "R6");
    object->args[2] = vmiosGetRegDesc(processor, "R7");
    object->args[3] = vmiosGetRegDesc(processor, "R8");
    object->args[4] = vmiosGetRegDesc(processor, "R9");
    object->args[5] = vmiosGetRegDesc(processor, "R10");

    // return register (standard ABI)
    object->resultReg = vmiosGetRegDesc(processor, "R3");

    // Stack Pointer
    object->argSP = vmiosGetRegDesc(processor, "R1");
    Bool found;
    object->argv = (char **)(UnsPS)vmirtPlatformUns64Attribute(processor, "userargv", &found);
    object->envp = (char **)(UnsPS)vmirtPlatformUns64Attribute(processor, "userenvp", &found);

    // Sets up data common to all newlib implementations
    // Defined in newlibSemiHost.c.h
    setupNewlib(object, processor);

}