s390x/tcg: implement spm (SET PROGRAM MASK)
Missing and is used inside Linux in the context of CPACF. Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20170920153016.3858-2-david@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
d8f932cc69
commit
6b257354c4
|
@ -292,6 +292,7 @@ extern const struct VMStateDescription vmstate_s390_cpu;
|
||||||
#undef PSW_SHIFT_ASC
|
#undef PSW_SHIFT_ASC
|
||||||
#undef PSW_MASK_CC
|
#undef PSW_MASK_CC
|
||||||
#undef PSW_MASK_PM
|
#undef PSW_MASK_PM
|
||||||
|
#undef PSW_SHIFT_MASK_PM
|
||||||
#undef PSW_MASK_64
|
#undef PSW_MASK_64
|
||||||
#undef PSW_MASK_32
|
#undef PSW_MASK_32
|
||||||
#undef PSW_MASK_ESA_ADDR
|
#undef PSW_MASK_ESA_ADDR
|
||||||
|
@ -309,6 +310,7 @@ extern const struct VMStateDescription vmstate_s390_cpu;
|
||||||
#define PSW_SHIFT_ASC 46
|
#define PSW_SHIFT_ASC 46
|
||||||
#define PSW_MASK_CC 0x0000300000000000ULL
|
#define PSW_MASK_CC 0x0000300000000000ULL
|
||||||
#define PSW_MASK_PM 0x00000F0000000000ULL
|
#define PSW_MASK_PM 0x00000F0000000000ULL
|
||||||
|
#define PSW_SHIFT_MASK_PM 40
|
||||||
#define PSW_MASK_64 0x0000000100000000ULL
|
#define PSW_MASK_64 0x0000000100000000ULL
|
||||||
#define PSW_MASK_32 0x0000000080000000ULL
|
#define PSW_MASK_32 0x0000000080000000ULL
|
||||||
#define PSW_MASK_ESA_ADDR 0x000000007fffffffULL
|
#define PSW_MASK_ESA_ADDR 0x000000007fffffffULL
|
||||||
|
|
|
@ -755,6 +755,8 @@
|
||||||
C(0xb2b8, SRNMB, S, FPE, 0, 0, 0, 0, srnm, 0)
|
C(0xb2b8, SRNMB, S, FPE, 0, 0, 0, 0, srnm, 0)
|
||||||
/* SET DFP ROUNDING MODE */
|
/* SET DFP ROUNDING MODE */
|
||||||
C(0xb2b9, SRNMT, S, DFPR, 0, 0, 0, 0, srnm, 0)
|
C(0xb2b9, SRNMT, S, DFPR, 0, 0, 0, 0, srnm, 0)
|
||||||
|
/* SET PROGRAM MASK */
|
||||||
|
C(0x0400, SPM, RR_a, Z, r1, 0, 0, 0, spm, 0)
|
||||||
|
|
||||||
/* SHIFT LEFT SINGLE */
|
/* SHIFT LEFT SINGLE */
|
||||||
D(0x8b00, SLA, RS_a, Z, r1, sh32, new, r1_32, sla, 0, 31)
|
D(0x8b00, SLA, RS_a, Z, r1, sh32, new, r1_32, sla, 0, 31)
|
||||||
|
|
|
@ -3796,6 +3796,17 @@ static ExitStatus op_srnm(DisasContext *s, DisasOps *o)
|
||||||
return NO_EXIT;
|
return NO_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ExitStatus op_spm(DisasContext *s, DisasOps *o)
|
||||||
|
{
|
||||||
|
tcg_gen_extrl_i64_i32(cc_op, o->in1);
|
||||||
|
tcg_gen_extract_i32(cc_op, cc_op, 28, 2);
|
||||||
|
set_cc_static(s);
|
||||||
|
|
||||||
|
tcg_gen_shri_i64(o->in1, o->in1, 24);
|
||||||
|
tcg_gen_deposit_i64(psw_mask, psw_mask, o->in1, PSW_SHIFT_MASK_PM, 4);
|
||||||
|
return NO_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
static ExitStatus op_spka(DisasContext *s, DisasOps *o)
|
static ExitStatus op_spka(DisasContext *s, DisasOps *o)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue