//
// This callback should create code to push 64-bit function parameter 'paramNum'
//
static Uns32 push8ByteArg(vmiProcessorP processor, Uns32 paramNum) {
    VMI_ABORT("Unsupported Function push8ByteArg");

//    // align parameter number to an even word
//    if((paramNum)&1) {
//        paramNum += 1;
//    }
//
//    if(paramNum<=5) {
//
//        // argument in a register
//        vmimtArgReg(32, V850_REG(4+paramNum));    // LSW
//        vmimtArgReg(32, V850_REG(3+paramNum));    // MSW
//
//    } else {
//
//        // argument on the stack - fetch into a temporary
//        vmimtLoadRRO(
//            64,                         // destBits
//            64,                         // memBits
//            (paramNum-6)*4,             // offset
//            V850_TEMPL_REG,             // destination (rd)
//            V850_REG(1),                // stack address (ra)
//            MEM_ENDIAN_BIG,             // endian
//            False,                      // signExtend
//            False                       // checkAlign
//        );
//
//        // push temporary argument
//        vmimtArgReg(64, V850_TEMPL_REG);
//    }

    return paramNum+2;
}
//
// Return processor mode
//
microblazeVMMode microblazeGetVMMode(microblazeP microblaze) {

    // MMU
    // 0 = None
    // 1 = User Mode
    // 2 = Protection
    // 3 = Virtual
    switch (microblaze->SPR_PVR11.bits.MMU) {
        case 0:
        case 1:
            return VM_MODE_REAL;
            break;

        case 2:
        case 3:
            if (microblaze->SPR_MSR.bits.VM) {
                if (microblaze->SPR_MSR.bits.UM) {
                    return VM_MODE_VIRTUAL_USER;
                } else {
                    return VM_MODE_VIRTUAL_PRIV;
                }
            } else {
                return VM_MODE_REAL;
            }
            break;

        default:
            VMI_ABORT("Unexpected value for PVR11[MMU]");
            break;
    }
}
//
// This callback should create code to push address function parameter 'paramNum'
//
static Uns32 pushAddressArg(vmiProcessorP processor, Uns32 paramNum) {
    VMI_ABORT("Unsupported Function pushAddressArg");
//
//    if(paramNum<=5) {
//
//        // argument in a register
//        vmimtArgRegSimAddress(32, V850_REG(3+paramNum));
//
//    } else {
//
//        // argument on the stack - fetch into a temporary
//        vmimtLoadRRO(
//            32,                         // destBits
//            32,                         // memBits
//            (paramNum-6)*4,             // offset
//            V850_TEMPL_REG,             // destination (rd)
//            V850_REG(1),                // stack address (ra)
//            MEM_ENDIAN_BIG,             // endian
//            False,                      // signExtend
//            False                       // checkAlign
//        );
//
//        // push temporary argument
//        vmimtArgRegSimAddress(32, V850_TEMPL_REG);
//    }

    return paramNum+1;
}