]>
Commit | Line | Data |
---|---|---|
7705c750 DH |
1 | /* |
2 | * s390x crypto helpers | |
3 | * | |
4 | * Copyright (c) 2017 Red Hat Inc | |
5 | * | |
6 | * Authors: | |
7 | * David Hildenbrand <[email protected]> | |
8 | * | |
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. | |
11 | */ | |
12 | ||
13 | #include "qemu/osdep.h" | |
14 | #include "qemu/main-loop.h" | |
15 | #include "internal.h" | |
16 | #include "exec/helper-proto.h" | |
17 | #include "exec/exec-all.h" | |
18 | #include "exec/cpu_ldst.h" | |
19 | ||
20 | uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_t r3, | |
21 | uint32_t type) | |
22 | { | |
23 | const uintptr_t ra = GETPC(); | |
24 | const uint8_t mod = env->regs[0] & 0x80ULL; | |
25 | const uint8_t fc = env->regs[0] & 0x7fULL; | |
7705c750 DH |
26 | uint8_t subfunc[16] = { 0 }; |
27 | uint64_t param_addr; | |
28 | int i; | |
29 | ||
30 | switch (type) { | |
31 | case S390_FEAT_TYPE_KMAC: | |
32 | case S390_FEAT_TYPE_KIMD: | |
33 | case S390_FEAT_TYPE_KLMD: | |
34 | case S390_FEAT_TYPE_PCKMO: | |
35 | case S390_FEAT_TYPE_PCC: | |
36 | if (mod) { | |
8d2f850a | 37 | s390_program_interrupt(env, PGM_SPECIFICATION, 4, ra); |
7705c750 DH |
38 | return 0; |
39 | } | |
40 | break; | |
41 | } | |
42 | ||
43 | s390_get_feat_block(type, subfunc); | |
44 | if (!test_be_bit(fc, subfunc)) { | |
8d2f850a | 45 | s390_program_interrupt(env, PGM_SPECIFICATION, 4, ra); |
7705c750 DH |
46 | return 0; |
47 | } | |
48 | ||
49 | switch (fc) { | |
50 | case 0: /* query subfunction */ | |
51 | for (i = 0; i < 16; i++) { | |
52 | param_addr = wrap_address(env, env->regs[1] + i); | |
53 | cpu_stb_data_ra(env, param_addr, subfunc[i], ra); | |
54 | } | |
55 | break; | |
56 | default: | |
57 | /* we don't implement any other subfunction yet */ | |
58 | g_assert_not_reached(); | |
59 | } | |
60 | ||
61 | return 0; | |
62 | } |