4 * Copyright (c) 2017 Red Hat Inc
7 * David Hildenbrand <david@redhat.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
13 #include "qemu/osdep.h"
14 #include "qemu/main-loop.h"
16 #include "tcg_s390x.h"
17 #include "exec/helper-proto.h"
18 #include "exec/exec-all.h"
19 #include "exec/cpu_ldst.h"
21 uint32_t HELPER(msa
)(CPUS390XState
*env
, uint32_t r1
, uint32_t r2
, uint32_t r3
,
24 const uintptr_t ra
= GETPC();
25 const uint8_t mod
= env
->regs
[0] & 0x80ULL
;
26 const uint8_t fc
= env
->regs
[0] & 0x7fULL
;
27 uint8_t subfunc
[16] = { 0 };
32 case S390_FEAT_TYPE_KMAC
:
33 case S390_FEAT_TYPE_KIMD
:
34 case S390_FEAT_TYPE_KLMD
:
35 case S390_FEAT_TYPE_PCKMO
:
36 case S390_FEAT_TYPE_PCC
:
38 tcg_s390_program_interrupt(env
, PGM_SPECIFICATION
, ra
);
43 s390_get_feat_block(type
, subfunc
);
44 if (!test_be_bit(fc
, subfunc
)) {
45 tcg_s390_program_interrupt(env
, PGM_SPECIFICATION
, ra
);
49 case 0: /* query subfunction */
50 for (i
= 0; i
< 16; i
++) {
51 param_addr
= wrap_address(env
, env
->regs
[1] + i
);
52 cpu_stb_data_ra(env
, param_addr
, subfunc
[i
], ra
);
56 /* we don't implement any other subfunction yet */
57 g_assert_not_reached();