cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

opcodes.c (3517B)


      1/*
      2 *  Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
      3 *
      4 *  This program is free software; you can redistribute it and/or modify
      5 *  it under the terms of the GNU General Public License as published by
      6 *  the Free Software Foundation; either version 2 of the License, or
      7 *  (at your option) any later version.
      8 *
      9 *  This program is distributed in the hope that it will be useful,
     10 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 *  GNU General Public License for more details.
     13 *
     14 *  You should have received a copy of the GNU General Public License
     15 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
     16 */
     17
     18/*
     19 * opcodes.c
     20 *
     21 * data tables generated automatically
     22 * Maybe some functions too
     23 */
     24
     25#include "qemu/osdep.h"
     26#include "attribs.h"
     27#include "decode.h"
     28
     29#define VEC_DESCR(A, B, C) DESCR(A, B, C)
     30#define DONAME(X) #X
     31
     32const char * const opcode_names[] = {
     33#define OPCODE(IID) DONAME(IID)
     34#include "opcodes_def_generated.h.inc"
     35    NULL
     36#undef OPCODE
     37};
     38
     39const char * const opcode_reginfo[] = {
     40#define IMMINFO(TAG, SIGN, SIZE, SHAMT, SIGN2, SIZE2, SHAMT2)    /* nothing */
     41#define REGINFO(TAG, REGINFO, RREGS, WREGS) REGINFO,
     42#include "op_regs_generated.h.inc"
     43    NULL
     44#undef REGINFO
     45#undef IMMINFO
     46};
     47
     48
     49const char * const opcode_rregs[] = {
     50#define IMMINFO(TAG, SIGN, SIZE, SHAMT, SIGN2, SIZE2, SHAMT2)    /* nothing */
     51#define REGINFO(TAG, REGINFO, RREGS, WREGS) RREGS,
     52#include "op_regs_generated.h.inc"
     53    NULL
     54#undef REGINFO
     55#undef IMMINFO
     56};
     57
     58
     59const char * const opcode_wregs[] = {
     60#define IMMINFO(TAG, SIGN, SIZE, SHAMT, SIGN2, SIZE2, SHAMT2)    /* nothing */
     61#define REGINFO(TAG, REGINFO, RREGS, WREGS) WREGS,
     62#include "op_regs_generated.h.inc"
     63    NULL
     64#undef REGINFO
     65#undef IMMINFO
     66};
     67
     68const char * const opcode_short_semantics[] = {
     69#define DEF_SHORTCODE(TAG, SHORTCODE)              [TAG] = #SHORTCODE,
     70#include "shortcode_generated.h.inc"
     71#undef DEF_SHORTCODE
     72    NULL
     73};
     74
     75DECLARE_BITMAP(opcode_attribs[XX_LAST_OPCODE], A_ZZ_LASTATTRIB);
     76
     77static void init_attribs(int tag, ...)
     78{
     79    va_list ap;
     80    int attr;
     81    va_start(ap, tag);
     82    while ((attr = va_arg(ap, int)) != 0) {
     83        set_bit(attr, opcode_attribs[tag]);
     84    }
     85    va_end(ap);
     86}
     87
     88const OpcodeEncoding opcode_encodings[] = {
     89#define DEF_ENC32(OPCODE, ENCSTR) \
     90    [OPCODE] = { .encoding = ENCSTR },
     91
     92#define DEF_ENC_SUBINSN(OPCODE, CLASS, ENCSTR) \
     93    [OPCODE] = { .encoding = ENCSTR, .enc_class = CLASS },
     94
     95#define DEF_EXT_ENC(OPCODE, CLASS, ENCSTR) \
     96    [OPCODE] = { .encoding = ENCSTR, .enc_class = CLASS },
     97
     98#include "imported/encode.def"
     99
    100#undef DEF_ENC32
    101#undef DEF_ENC_SUBINSN
    102#undef DEF_EXT_ENC
    103};
    104
    105void opcode_init(void)
    106{
    107    init_attribs(0, 0);
    108
    109#define ATTRIBS(...) , ## __VA_ARGS__, 0
    110#define OP_ATTRIB(TAG, ARGS) init_attribs(TAG ARGS);
    111#include "op_attribs_generated.h.inc"
    112#undef OP_ATTRIB
    113#undef ATTRIBS
    114
    115    decode_init();
    116}
    117
    118
    119#define NEEDLE "IMMEXT("
    120
    121int opcode_which_immediate_is_extended(Opcode opcode)
    122{
    123    const char *p;
    124
    125    g_assert(opcode < XX_LAST_OPCODE);
    126    g_assert(GET_ATTRIB(opcode, A_EXTENDABLE));
    127
    128    p = opcode_short_semantics[opcode];
    129    p = strstr(p, NEEDLE);
    130    g_assert(p);
    131    p += strlen(NEEDLE);
    132    while (isspace(*p)) {
    133        p++;
    134    }
    135    /* lower is always imm 0, upper always imm 1. */
    136    if (islower(*p)) {
    137        return 0;
    138    } else if (isupper(*p)) {
    139        return 1;
    140    } else {
    141        g_assert_not_reached();
    142    }
    143}