| 984 | #include "../dynamic/dynamic_generic_base.h" |
| 985 | |
| 986 | void 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 |
no test coverage detected