• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revisionfec7daab3d63b7b2ca61581fffc40142b22b2bd5 (tree)
Time2015-10-07 18:24:04
AuthorChen Gang <gang.chen.5i5j@gmai...>
CommiterRichard Henderson

Log Message

target-tilegx: Support iret instruction and related special registers

EX_CONTEXT_0_0 is used for jumping address, and EX_CONTEXT_0_1 is for
INTERRUPT_CRITICAL_SECTION, which should only be 0 or 1 in user mode, or
it will cause target SIGILL (and the patch doesn't support system mode).

Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
Signed-off-by: Richard Henderson <rth@twiddle.net>

Change Summary

Incremental Difference

--- a/target-tilegx/cpu.h
+++ b/target-tilegx/cpu.h
@@ -53,6 +53,8 @@ enum {
5353 TILEGX_SPR_CMPEXCH = 0,
5454 TILEGX_SPR_CRITICAL_SEC = 1,
5555 TILEGX_SPR_SIM_CONTROL = 2,
56+ TILEGX_SPR_EX_CONTEXT_0_0 = 3,
57+ TILEGX_SPR_EX_CONTEXT_0_1 = 4,
5658 TILEGX_SPR_COUNT
5759 };
5860
--- a/target-tilegx/helper.c
+++ b/target-tilegx/helper.c
@@ -22,6 +22,7 @@
2222 #include "qemu-common.h"
2323 #include "exec/helper-proto.h"
2424 #include <zlib.h> /* For crc32 */
25+#include "syscall_defs.h"
2526
2627 void helper_exception(CPUTLGState *env, uint32_t excp)
2728 {
@@ -31,6 +32,27 @@ void helper_exception(CPUTLGState *env, uint32_t excp)
3132 cpu_loop_exit(cs);
3233 }
3334
35+void helper_ext01_ics(CPUTLGState *env)
36+{
37+ uint64_t val = env->spregs[TILEGX_SPR_EX_CONTEXT_0_1];
38+
39+ switch (val) {
40+ case 0:
41+ case 1:
42+ env->spregs[TILEGX_SPR_CRITICAL_SEC] = val;
43+ break;
44+ default:
45+#if defined(CONFIG_USER_ONLY)
46+ env->signo = TARGET_SIGILL;
47+ env->sigcode = TARGET_ILL_ILLOPC;
48+ helper_exception(env, TILEGX_EXCP_SIGNAL);
49+#else
50+ helper_exception(env, TILEGX_EXCP_OPCODE_UNIMPLEMENTED);
51+#endif
52+ break;
53+ }
54+}
55+
3456 uint64_t helper_cntlz(uint64_t arg)
3557 {
3658 return clz64(arg);
--- a/target-tilegx/helper.h
+++ b/target-tilegx/helper.h
@@ -1,4 +1,5 @@
11 DEF_HELPER_2(exception, noreturn, env, i32)
2+DEF_HELPER_1(ext01_ics, void, env)
23 DEF_HELPER_FLAGS_1(cntlz, TCG_CALL_NO_RWG_SE, i64, i64)
34 DEF_HELPER_FLAGS_1(cnttz, TCG_CALL_NO_RWG_SE, i64, i64)
45 DEF_HELPER_FLAGS_1(pcnt, TCG_CALL_NO_RWG_SE, i64, i64)
--- a/target-tilegx/translate.c
+++ b/target-tilegx/translate.c
@@ -529,6 +529,15 @@ static TileExcp gen_rr_opcode(DisasContext *dc, unsigned opext,
529529 /* ??? This should yield, especially in system mode. */
530530 mnemonic = "nap";
531531 goto done0;
532+ case OE_RR_X1(IRET):
533+ gen_helper_ext01_ics(cpu_env);
534+ dc->jmp.cond = TCG_COND_ALWAYS;
535+ dc->jmp.dest = tcg_temp_new();
536+ tcg_gen_ld_tl(dc->jmp.dest, cpu_env,
537+ offsetof(CPUTLGState, spregs[TILEGX_SPR_EX_CONTEXT_0_0]));
538+ tcg_gen_andi_tl(dc->jmp.dest, dc->jmp.dest, ~7);
539+ mnemonic = "iret";
540+ goto done0;
532541 case OE_RR_X1(SWINT0):
533542 case OE_RR_X1(SWINT2):
534543 case OE_RR_X1(SWINT3):
@@ -606,7 +615,6 @@ static TileExcp gen_rr_opcode(DisasContext *dc, unsigned opext,
606615 break;
607616 case OE_RR_X0(FSINGLE_PACK1):
608617 case OE_RR_Y0(FSINGLE_PACK1):
609- case OE_RR_X1(IRET):
610618 return TILEGX_EXCP_OPCODE_UNIMPLEMENTED;
611619 case OE_RR_X1(LD1S):
612620 memop = MO_SB;
@@ -1947,6 +1955,10 @@ static const TileSPR *find_spr(unsigned spr)
19471955 offsetof(CPUTLGState, spregs[TILEGX_SPR_CRITICAL_SEC]), 0, 0)
19481956 D(SIM_CONTROL,
19491957 offsetof(CPUTLGState, spregs[TILEGX_SPR_SIM_CONTROL]), 0, 0)
1958+ D(EX_CONTEXT_0_0,
1959+ offsetof(CPUTLGState, spregs[TILEGX_SPR_EX_CONTEXT_0_0]), 0, 0)
1960+ D(EX_CONTEXT_0_1,
1961+ offsetof(CPUTLGState, spregs[TILEGX_SPR_EX_CONTEXT_0_1]), 0, 0)
19501962 }
19511963
19521964 #undef D