qemu/target/s390x/crypto_helper.c
<<
>>
Prefs
   1/*
   2 *  s390x crypto helpers
   3 *
   4 *  Copyright (c) 2017 Red Hat Inc
   5 *
   6 *  Authors:
   7 *   David Hildenbrand <david@redhat.com>
   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
  20uint32_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}
  63