This commit introduces support for native library calls on the mips target. When encountering special instructions reserved for native calls, this commit extracts the function name and generates the corresponding native call.
Signed-off-by: Yeqi Fu <fufuyqqq...@gmail.com> --- configs/targets/mips-linux-user.mak | 1 + configs/targets/mips64-linux-user.mak | 1 + target/mips/tcg/translate.c | 36 ++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/configs/targets/mips-linux-user.mak b/configs/targets/mips-linux-user.mak index b4569a9893..fa005d487a 100644 --- a/configs/targets/mips-linux-user.mak +++ b/configs/targets/mips-linux-user.mak @@ -3,3 +3,4 @@ TARGET_ABI_MIPSO32=y TARGET_SYSTBL_ABI=o32 TARGET_SYSTBL=syscall_o32.tbl TARGET_BIG_ENDIAN=y +CONFIG_NATIVE_CALL=y diff --git a/configs/targets/mips64-linux-user.mak b/configs/targets/mips64-linux-user.mak index d2ff509a11..ecfe6bcf73 100644 --- a/configs/targets/mips64-linux-user.mak +++ b/configs/targets/mips64-linux-user.mak @@ -4,3 +4,4 @@ TARGET_BASE_ARCH=mips TARGET_SYSTBL_ABI=n64 TARGET_SYSTBL=syscall_n64.tbl TARGET_BIG_ENDIAN=y +CONFIG_NATIVE_CALL=y diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c index 74af91e4f5..fa58f9e12f 100644 --- a/target/mips/tcg/translate.c +++ b/target/mips/tcg/translate.c @@ -36,6 +36,7 @@ #include "exec/helper-info.c.inc" #undef HELPER_H +#include "native/native.h" /* * Many sysemu-only helpers are not reachable for user-only. @@ -13484,10 +13485,38 @@ static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx) } } +static void gen_native_call(DisasContext *ctx, CPUMIPSState *env) +{ +#ifdef CONFIG_USER_ONLY + char *func_name; + TCGv arg1 = tcg_temp_new(); + TCGv arg2 = tcg_temp_new(); + TCGv arg3 = tcg_temp_new(); + TCGv ret = tcg_temp_new(); + tcg_gen_mov_tl(arg1, cpu_gpr[4]); + tcg_gen_mov_tl(arg2, cpu_gpr[5]); + tcg_gen_mov_tl(arg3, cpu_gpr[6]); +#if defined(TARGET_MIPS64) + uint64_t func_tmp = + translator_ldq(env, &ctx->base, ctx->base.pc_next + 8); + ctx->base.pc_next += 12; + func_name = g2h(env_cpu(env), func_tmp); + gen_native_call_i64(func_name, ret, arg1, arg2, arg3); +#else + uint32_t func_tmp = + translator_ldl(env, &ctx->base, ctx->base.pc_next + 4); + ctx->base.pc_next += 4; + func_name = g2h(env_cpu(env), func_tmp); + gen_native_call_i32(func_name, ret, arg1, arg2, arg3); +#endif + tcg_gen_mov_tl(cpu_gpr[2], ret); +#endif +} + static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx) { int rs, rt, rd, sa; - uint32_t op1; + uint32_t op1, sig; rs = (ctx->opcode >> 21) & 0x1f; rt = (ctx->opcode >> 16) & 0x1f; @@ -13583,6 +13612,11 @@ static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx) #endif break; case OPC_SYSCALL: + sig = (ctx->opcode) >> 6; + if ((sig == 0xffff) && native_bypass_enabled()) { + gen_native_call(ctx, env); + break; + } generate_exception_end(ctx, EXCP_SYSCALL); break; case OPC_BREAK: -- 2.34.1