Message ID | 20171207153141.15523-4-david@redhat.com |
---|---|
State | New |
Headers | show |
Series | s390x/tcg: CCW hotplug support | expand |
On 12/07/2017 07:31 AM, David Hildenbrand wrote: > +DEF_HELPER_FLAGS_1(sckpf, TCG_CALL_NO_RWG, void, env) ... > +/* Set Tod Programmable Field */ > +void HELPER(sckpf)(CPUS390XState *env) > +{ > + uint32_t val = env->regs[0]; > + > + if (val & 0xffff0000) { > + s390_program_interrupt(env, PGM_SPECIFICATION, 2, GETPC()); > + } > + env->todpr = val; > +} You do read a tcg global -- regs[0]. Either pass in r0 as a parameter or use TCG_CALL_NO_WG. r~
On 08.12.2017 01:00, Richard Henderson wrote: > On 12/07/2017 07:31 AM, David Hildenbrand wrote: >> +DEF_HELPER_FLAGS_1(sckpf, TCG_CALL_NO_RWG, void, env) > ... >> +/* Set Tod Programmable Field */ >> +void HELPER(sckpf)(CPUS390XState *env) >> +{ >> + uint32_t val = env->regs[0]; >> + >> + if (val & 0xffff0000) { >> + s390_program_interrupt(env, PGM_SPECIFICATION, 2, GETPC()); >> + } >> + env->todpr = val; >> +} > > You do read a tcg global -- regs[0]. Either pass in r0 as a parameter or use > TCG_CALL_NO_WG. > > Indeed, I finally understood what the term "global" in this context means. (global tcg vals defined in translate.c) > r~ >
diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 9459b73c73..0281c286b8 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -127,6 +127,7 @@ DEF_HELPER_3(load_psw, noreturn, env, i64, i64) DEF_HELPER_FLAGS_2(spx, TCG_CALL_NO_RWG, void, env, i64) DEF_HELPER_FLAGS_1(stck, TCG_CALL_NO_RWG_SE, i64, env) DEF_HELPER_FLAGS_2(sckc, TCG_CALL_NO_RWG, void, env, i64) +DEF_HELPER_FLAGS_1(sckpf, TCG_CALL_NO_RWG, void, env) DEF_HELPER_FLAGS_1(stckc, TCG_CALL_NO_RWG, i64, env) DEF_HELPER_FLAGS_2(spt, TCG_CALL_NO_RWG, void, env, i64) DEF_HELPER_FLAGS_1(stpt, TCG_CALL_NO_RWG, i64, env) diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index 16e27c8a35..8c2541f545 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -999,6 +999,8 @@ C(0xb204, SCK, S, Z, 0, 0, 0, 0, 0, 0) /* SET CLOCK COMPARATOR */ C(0xb206, SCKC, S, Z, 0, m2_64, 0, 0, sckc, 0) +/* SET CLOCK PROGRAMMABLE FIELD */ + C(0x0107, SCKPF, E, Z, 0, 0, 0, 0, sckpf, 0) /* SET CPU TIMER */ C(0xb208, SPT, S, Z, 0, m2_64, 0, 0, spt, 0) /* SET PREFIX */ diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c index 6d766ce1e7..25b71f08ee 100644 --- a/target/s390x/misc_helper.c +++ b/target/s390x/misc_helper.c @@ -146,6 +146,17 @@ void HELPER(sckc)(CPUS390XState *env, uint64_t time) timer_mod(env->tod_timer, env->tod_basetime + time); } +/* Set Tod Programmable Field */ +void HELPER(sckpf)(CPUS390XState *env) +{ + uint32_t val = env->regs[0]; + + if (val & 0xffff0000) { + s390_program_interrupt(env, PGM_SPECIFICATION, 2, GETPC()); + } + env->todpr = val; +} + /* Store Clock Comparator */ uint64_t HELPER(stckc)(CPUS390XState *env) { diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 26cf993405..48b031894a 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -3922,6 +3922,13 @@ static ExitStatus op_sckc(DisasContext *s, DisasOps *o) return NO_EXIT; } +static ExitStatus op_sckpf(DisasContext *s, DisasOps *o) +{ + check_privileged(s); + gen_helper_sckpf(cpu_env); + return NO_EXIT; +} + static ExitStatus op_stckc(DisasContext *s, DisasOps *o) { check_privileged(s);