Statistics
| Branch: | Revision:

root / disas / tci.c @ 76cad711

History | View | Annotate | Download (1.8 kB)

1
/*
2
 * Tiny Code Interpreter for QEMU - disassembler
3
 *
4
 * Copyright (c) 2011 Stefan Weil
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 "disas/bfd.h"
21
#include "tcg/tcg.h"
22

    
23
/* Disassemble TCI bytecode. */
24
int print_insn_tci(bfd_vma addr, disassemble_info *info)
25
{
26
    int length;
27
    uint8_t byte;
28
    int status;
29
    TCGOpcode op;
30

    
31
    status = info->read_memory_func(addr, &byte, 1, info);
32
    if (status != 0) {
33
        info->memory_error_func(status, addr, info);
34
        return -1;
35
    }
36
    op = byte;
37

    
38
    addr++;
39
    status = info->read_memory_func(addr, &byte, 1, info);
40
    if (status != 0) {
41
        info->memory_error_func(status, addr, info);
42
        return -1;
43
    }
44
    length = byte;
45

    
46
    if (op >= tcg_op_defs_max) {
47
        info->fprintf_func(info->stream, "illegal opcode %d", op);
48
    } else {
49
        const TCGOpDef *def = &tcg_op_defs[op];
50
        int nb_oargs = def->nb_oargs;
51
        int nb_iargs = def->nb_iargs;
52
        int nb_cargs = def->nb_cargs;
53
        /* TODO: Improve disassembler output. */
54
        info->fprintf_func(info->stream, "%s\to=%d i=%d c=%d",
55
                           def->name, nb_oargs, nb_iargs, nb_cargs);
56
    }
57

    
58
    return length;
59
}