]> Git Repo - qemu.git/blob - target/s390x/crypto_helper.c
s390x/cpumodel: Add "-cpu max" support
[qemu.git] / target / s390x / crypto_helper.c
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;
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) {
37             s390_program_interrupt(env, PGM_SPECIFICATION, 4, ra);
38             return 0;
39         }
40         break;
41     }
42
43     s390_get_feat_block(type, subfunc);
44     if (!test_be_bit(fc, subfunc)) {
45         s390_program_interrupt(env, PGM_SPECIFICATION, 4, ra);
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 }
This page took 0.026761 seconds and 4 git commands to generate.