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

disas.c (9029B)


      1/*
      2 * OpenRISC disassembler
      3 *
      4 * Copyright (c) 2018 Richard Henderson <rth@twiddle.net>
      5 *
      6 * This program is free software: you can redistribute it and/or modify
      7 * it under the terms of the GNU General Public License as published by
      8 * the Free Software Foundation, either version 2 of the License, or
      9 * (at your option) any later version.
     10 *
     11 * This program is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 * GNU General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU General Public License
     17 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     18 */
     19
     20#include "qemu/osdep.h"
     21#include "disas/dis-asm.h"
     22#include "qemu/bitops.h"
     23#include "cpu.h"
     24
     25typedef disassemble_info DisasContext;
     26
     27/* Include the auto-generated decoder.  */
     28#include "decode-insns.c.inc"
     29
     30#define output(mnemonic, format, ...) \
     31    (info->fprintf_func(info->stream, "%-9s " format, \
     32                        mnemonic, ##__VA_ARGS__))
     33
     34int print_insn_or1k(bfd_vma addr, disassemble_info *info)
     35{
     36    bfd_byte buffer[4];
     37    uint32_t insn;
     38    int status;
     39
     40    status = info->read_memory_func(addr, buffer, 4, info);
     41    if (status != 0) {
     42        info->memory_error_func(status, addr, info);
     43        return -1;
     44    }
     45    insn = bfd_getb32(buffer);
     46
     47    if (!decode(info, insn)) {
     48        output(".long", "%#08x", insn);
     49    }
     50    return 4;
     51}
     52
     53#define INSN(opcode, format, ...)                                       \
     54static bool trans_l_##opcode(disassemble_info *info, arg_l_##opcode *a) \
     55{                                                                       \
     56    output("l." #opcode, format, ##__VA_ARGS__);                        \
     57    return true;                                                        \
     58}
     59
     60INSN(add,    "r%d, r%d, r%d", a->d, a->a, a->b)
     61INSN(addc,   "r%d, r%d, r%d", a->d, a->a, a->b)
     62INSN(sub,    "r%d, r%d, r%d", a->d, a->a, a->b)
     63INSN(and,    "r%d, r%d, r%d", a->d, a->a, a->b)
     64INSN(or,     "r%d, r%d, r%d", a->d, a->a, a->b)
     65INSN(xor,    "r%d, r%d, r%d", a->d, a->a, a->b)
     66INSN(sll,    "r%d, r%d, r%d", a->d, a->a, a->b)
     67INSN(srl,    "r%d, r%d, r%d", a->d, a->a, a->b)
     68INSN(sra,    "r%d, r%d, r%d", a->d, a->a, a->b)
     69INSN(ror,    "r%d, r%d, r%d", a->d, a->a, a->b)
     70INSN(exths,  "r%d, r%d", a->d, a->a)
     71INSN(extbs,  "r%d, r%d", a->d, a->a)
     72INSN(exthz,  "r%d, r%d", a->d, a->a)
     73INSN(extbz,  "r%d, r%d", a->d, a->a)
     74INSN(cmov,   "r%d, r%d, r%d", a->d, a->a, a->b)
     75INSN(ff1,    "r%d, r%d", a->d, a->a)
     76INSN(fl1,    "r%d, r%d", a->d, a->a)
     77INSN(mul,    "r%d, r%d, r%d", a->d, a->a, a->b)
     78INSN(mulu,   "r%d, r%d, r%d", a->d, a->a, a->b)
     79INSN(div,    "r%d, r%d, r%d", a->d, a->a, a->b)
     80INSN(divu,   "r%d, r%d, r%d", a->d, a->a, a->b)
     81INSN(muld,   "r%d, r%d", a->a, a->b)
     82INSN(muldu,  "r%d, r%d", a->a, a->b)
     83INSN(j,      "%d", a->n)
     84INSN(jal,    "%d", a->n)
     85INSN(bf,     "%d", a->n)
     86INSN(bnf,    "%d", a->n)
     87INSN(jr,     "r%d", a->b)
     88INSN(jalr,   "r%d", a->b)
     89INSN(lwa,    "r%d, %d(r%d)", a->d, a->i, a->a)
     90INSN(lwz,    "r%d, %d(r%d)", a->d, a->i, a->a)
     91INSN(lws,    "r%d, %d(r%d)", a->d, a->i, a->a)
     92INSN(lbz,    "r%d, %d(r%d)", a->d, a->i, a->a)
     93INSN(lbs,    "r%d, %d(r%d)", a->d, a->i, a->a)
     94INSN(lhz,    "r%d, %d(r%d)", a->d, a->i, a->a)
     95INSN(lhs,    "r%d, %d(r%d)", a->d, a->i, a->a)
     96INSN(swa,    "%d(r%d), r%d", a->i, a->a, a->b)
     97INSN(sw,     "%d(r%d), r%d", a->i, a->a, a->b)
     98INSN(sb,     "%d(r%d), r%d", a->i, a->a, a->b)
     99INSN(sh,     "%d(r%d), r%d", a->i, a->a, a->b)
    100INSN(nop,    "")
    101INSN(adrp,   "r%d, %d", a->d, a->i)
    102INSN(addi,   "r%d, r%d, %d", a->d, a->a, a->i)
    103INSN(addic,  "r%d, r%d, %d", a->d, a->a, a->i)
    104INSN(muli,   "r%d, r%d, %d", a->d, a->a, a->i)
    105INSN(maci,   "r%d, %d", a->a, a->i)
    106INSN(andi,   "r%d, r%d, %d", a->d, a->a, a->k)
    107INSN(ori,    "r%d, r%d, %d", a->d, a->a, a->k)
    108INSN(xori,   "r%d, r%d, %d", a->d, a->a, a->i)
    109INSN(mfspr,  "r%d, r%d, %d", a->d, a->a, a->k)
    110INSN(mtspr,  "r%d, r%d, %d", a->a, a->b, a->k)
    111INSN(mac,    "r%d, r%d", a->a, a->b)
    112INSN(msb,    "r%d, r%d", a->a, a->b)
    113INSN(macu,   "r%d, r%d", a->a, a->b)
    114INSN(msbu,   "r%d, r%d", a->a, a->b)
    115INSN(slli,   "r%d, r%d, %d", a->d, a->a, a->l)
    116INSN(srli,   "r%d, r%d, %d", a->d, a->a, a->l)
    117INSN(srai,   "r%d, r%d, %d", a->d, a->a, a->l)
    118INSN(rori,   "r%d, r%d, %d", a->d, a->a, a->l)
    119INSN(movhi,  "r%d, %d", a->d, a->k)
    120INSN(macrc,  "r%d", a->d)
    121INSN(sfeq,   "r%d, r%d", a->a, a->b)
    122INSN(sfne,   "r%d, r%d", a->a, a->b)
    123INSN(sfgtu,  "r%d, r%d", a->a, a->b)
    124INSN(sfgeu,  "r%d, r%d", a->a, a->b)
    125INSN(sfltu,  "r%d, r%d", a->a, a->b)
    126INSN(sfleu,  "r%d, r%d", a->a, a->b)
    127INSN(sfgts,  "r%d, r%d", a->a, a->b)
    128INSN(sfges,  "r%d, r%d", a->a, a->b)
    129INSN(sflts,  "r%d, r%d", a->a, a->b)
    130INSN(sfles,  "r%d, r%d", a->a, a->b)
    131INSN(sfeqi,  "r%d, %d", a->a, a->i)
    132INSN(sfnei,  "r%d, %d", a->a, a->i)
    133INSN(sfgtui, "r%d, %d", a->a, a->i)
    134INSN(sfgeui, "r%d, %d", a->a, a->i)
    135INSN(sfltui, "r%d, %d", a->a, a->i)
    136INSN(sfleui, "r%d, %d", a->a, a->i)
    137INSN(sfgtsi, "r%d, %d", a->a, a->i)
    138INSN(sfgesi, "r%d, %d", a->a, a->i)
    139INSN(sfltsi, "r%d, %d", a->a, a->i)
    140INSN(sflesi, "r%d, %d", a->a, a->i)
    141INSN(sys,    "%d", a->k)
    142INSN(trap,   "%d", a->k)
    143INSN(msync,  "")
    144INSN(psync,  "")
    145INSN(csync,  "")
    146INSN(rfe,    "")
    147
    148#define FP_INSN(opcode, suffix, format, ...)                            \
    149static bool trans_lf_##opcode##_##suffix(disassemble_info *info,        \
    150                                         arg_lf_##opcode##_##suffix *a) \
    151{                                                                       \
    152    output("lf." #opcode "." #suffix, format, ##__VA_ARGS__);           \
    153    return true;                                                        \
    154}
    155
    156FP_INSN(add, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    157FP_INSN(sub, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    158FP_INSN(mul, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    159FP_INSN(div, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    160FP_INSN(rem, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    161FP_INSN(itof, s, "r%d, r%d", a->d, a->a)
    162FP_INSN(ftoi, s, "r%d, r%d", a->d, a->a)
    163FP_INSN(madd, s, "r%d, r%d, r%d", a->d, a->a, a->b)
    164FP_INSN(sfeq, s, "r%d, r%d", a->a, a->b)
    165FP_INSN(sfne, s, "r%d, r%d", a->a, a->b)
    166FP_INSN(sfgt, s, "r%d, r%d", a->a, a->b)
    167FP_INSN(sfge, s, "r%d, r%d", a->a, a->b)
    168FP_INSN(sflt, s, "r%d, r%d", a->a, a->b)
    169FP_INSN(sfle, s, "r%d, r%d", a->a, a->b)
    170FP_INSN(sfun, s, "r%d, r%d", a->a, a->b)
    171FP_INSN(sfueq, s, "r%d, r%d", a->a, a->b)
    172FP_INSN(sfuge, s, "r%d, r%d", a->a, a->b)
    173FP_INSN(sfugt, s, "r%d, r%d", a->a, a->b)
    174FP_INSN(sfule, s, "r%d, r%d", a->a, a->b)
    175FP_INSN(sfult, s, "r%d, r%d", a->a, a->b)
    176
    177FP_INSN(add, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    178        a->d, a->d + a->dp + 1,
    179        a->a, a->a + a->ap + 1,
    180        a->b, a->b + a->bp + 1)
    181FP_INSN(sub, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    182        a->d, a->d + a->dp + 1,
    183        a->a, a->a + a->ap + 1,
    184        a->b, a->b + a->bp + 1)
    185FP_INSN(mul, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    186        a->d, a->d + a->dp + 1,
    187        a->a, a->a + a->ap + 1,
    188        a->b, a->b + a->bp + 1)
    189FP_INSN(div, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    190        a->d, a->d + a->dp + 1,
    191        a->a, a->a + a->ap + 1,
    192        a->b, a->b + a->bp + 1)
    193FP_INSN(rem, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    194        a->d, a->d + a->dp + 1,
    195        a->a, a->a + a->ap + 1,
    196        a->b, a->b + a->bp + 1)
    197FP_INSN(madd, d, "r%d,r%d, r%d,r%d, r%d,r%d",
    198        a->d, a->d + a->dp + 1,
    199        a->a, a->a + a->ap + 1,
    200        a->b, a->b + a->bp + 1)
    201
    202FP_INSN(itof, d, "r%d,r%d, r%d,r%d",
    203        a->d, a->d + a->dp + 1,
    204        a->a, a->a + a->ap + 1)
    205FP_INSN(ftoi, d, "r%d,r%d, r%d,r%d",
    206        a->d, a->d + a->dp + 1,
    207        a->a, a->a + a->ap + 1)
    208
    209FP_INSN(stod, d, "r%d,r%d, r%d",
    210        a->d, a->d + a->dp + 1, a->a)
    211FP_INSN(dtos, d, "r%d r%d,r%d",
    212        a->d, a->a, a->a + a->ap + 1)
    213
    214FP_INSN(sfeq, d, "r%d,r%d, r%d,r%d",
    215        a->a, a->a + a->ap + 1,
    216        a->b, a->b + a->bp + 1)
    217FP_INSN(sfne, d, "r%d,r%d, r%d,r%d",
    218        a->a, a->a + a->ap + 1,
    219        a->b, a->b + a->bp + 1)
    220FP_INSN(sfgt, d, "r%d,r%d, r%d,r%d",
    221        a->a, a->a + a->ap + 1,
    222        a->b, a->b + a->bp + 1)
    223FP_INSN(sfge, d, "r%d,r%d, r%d,r%d",
    224        a->a, a->a + a->ap + 1,
    225        a->b, a->b + a->bp + 1)
    226FP_INSN(sflt, d, "r%d,r%d, r%d,r%d",
    227        a->a, a->a + a->ap + 1,
    228        a->b, a->b + a->bp + 1)
    229FP_INSN(sfle, d, "r%d,r%d, r%d,r%d",
    230        a->a, a->a + a->ap + 1,
    231        a->b, a->b + a->bp + 1)
    232FP_INSN(sfun, d, "r%d,r%d, r%d,r%d",
    233        a->a, a->a + a->ap + 1,
    234        a->b, a->b + a->bp + 1)
    235FP_INSN(sfueq, d, "r%d,r%d, r%d,r%d",
    236        a->a, a->a + a->ap + 1,
    237        a->b, a->b + a->bp + 1)
    238FP_INSN(sfuge, d, "r%d,r%d, r%d,r%d",
    239        a->a, a->a + a->ap + 1,
    240        a->b, a->b + a->bp + 1)
    241FP_INSN(sfugt, d, "r%d,r%d, r%d,r%d",
    242        a->a, a->a + a->ap + 1,
    243        a->b, a->b + a->bp + 1)
    244FP_INSN(sfule, d, "r%d,r%d, r%d,r%d",
    245        a->a, a->a + a->ap + 1,
    246        a->b, a->b + a->bp + 1)
    247FP_INSN(sfult, d, "r%d,r%d, r%d,r%d",
    248        a->a, a->a + a->ap + 1,
    249        a->b, a->b + a->bp + 1)