MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / callHostFunction

Function callHostFunction

source/emulation/cpu/armv7/armv7CPU.cpp:986–1058  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

984#include "../dynamic/dynamic_generic_base.h"
985
986void callHostFunction(void* address, bool hasReturn, U32 argCount, U32 arg1, DynCallParamType arg1Type, bool doneWithArg1, U32 arg2, DynCallParamType arg2Type, bool doneWithArg2, U32 arg3, DynCallParamType arg3Type, bool doneWithArg3, U32 arg4, DynCallParamType arg4Type, bool doneWithArg4, U32 arg5, DynCallParamType arg5Type, bool doneWithArg5) {
987 bool regDone[NUMBER_OF_REGS] = { false, false, false, false, false, false, false, false };
988
989 if (argCount >= 5) {
990 if (isParamTypeReg(arg5Type) && doneWithArg5) {
991 if (arg5 >= NUMBER_OF_REGS)
992 kpanic("armv7::callHostFunction bad param 5: arg=%d argType=%d", arg5, arg5Type);
993 regDone[arg5] = true;
994 }
995 }
996 if (argCount >= 4) {
997 if (isParamTypeReg(arg4Type) && doneWithArg4) {
998 if (arg4 >= NUMBER_OF_REGS)
999 kpanic("armv7::callHostFunction bad param 4: arg=%d argType=%d", arg4, arg4Type);
1000 regDone[arg4] = true;
1001 }
1002 }
1003 if (argCount >= 3) {
1004 if (isParamTypeReg(arg3Type) && doneWithArg3) {
1005 if (arg3 >= NUMBER_OF_REGS)
1006 kpanic("armv7::callHostFunction bad param 3: arg=%d argType=%d", arg3, arg3Type);
1007 regDone[arg3] = true;
1008 }
1009 }
1010 if (argCount >= 2) {
1011 if (isParamTypeReg(arg2Type) && doneWithArg2) {
1012 if (arg2 >= NUMBER_OF_REGS)
1013 kpanic("armv7::callHostFunction bad param 5: arg=%d argType=%d", arg2, arg2Type);
1014 regDone[arg2] = true;
1015 }
1016 }
1017 if (argCount >= 1) {
1018 if (isParamTypeReg(arg1Type) && doneWithArg1) {
1019 if (arg1 >= NUMBER_OF_REGS)
1020 kpanic("armv7::callHostFunction bad param 5: arg=%d argType=%d", arg1, arg1Type);
1021 regDone[arg1] = true;
1022 }
1023 }
1024
1025 if (argCount >= 5) {
1026 pushValue(arg5, arg5Type);
1027 }
1028 if (argCount >= 4) {
1029 setValue(arg4, arg4Type, 3);
1030 }
1031 if (argCount >= 3) {
1032 setValue(arg3, arg3Type, 2);
1033 }
1034 if (argCount >= 2) {
1035 setValue(arg2, arg2Type, 1);
1036 }
1037 if (argCount >= 1) {
1038 setValue(arg1, arg1Type, 0);
1039 }
1040 if (regUsed[DYN_CALL_RESULT] && !hasReturn && !regDone[DYN_CALL_RESULT]) {
1041 int ii = 0;
1042 }
1043 // reg can't be R0-R3 because that is used for params

Callers 5

createSignalHandlerMethod · 0.50
createEmulateSingleOpMethod · 0.50
callMethod · 0.50
call_IMethod · 0.50
call_RIMethod · 0.50

Calls 5

kpanicFunction · 0.85
loadConst32Function · 0.70
callFunctionReg32Function · 0.70
addValue32Function · 0.70
clearRegUsedFunction · 0.70

Tested by

no test coverage detected