root / tci-dis.c @ 60e1b2a6
History | View | Annotate | Download (1.8 kB)
1 | 5826e519 | Stefan Weil | /*
|
---|---|---|---|
2 | 5826e519 | Stefan Weil | * Tiny Code Interpreter for QEMU - disassembler
|
3 | 5826e519 | Stefan Weil | *
|
4 | 5826e519 | Stefan Weil | * Copyright (c) 2011 Stefan Weil
|
5 | 5826e519 | Stefan Weil | *
|
6 | 5826e519 | Stefan Weil | * This program is free software: you can redistribute it and/or modify
|
7 | 5826e519 | Stefan Weil | * it under the terms of the GNU General Public License as published by
|
8 | 5826e519 | Stefan Weil | * the Free Software Foundation, either version 2 of the License, or
|
9 | 5826e519 | Stefan Weil | * (at your option) any later version.
|
10 | 5826e519 | Stefan Weil | *
|
11 | 5826e519 | Stefan Weil | * This program is distributed in the hope that it will be useful,
|
12 | 5826e519 | Stefan Weil | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 5826e519 | Stefan Weil | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 | 5826e519 | Stefan Weil | * GNU General Public License for more details.
|
15 | 5826e519 | Stefan Weil | *
|
16 | 5826e519 | Stefan Weil | * You should have received a copy of the GNU General Public License
|
17 | 5826e519 | Stefan Weil | * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18 | 5826e519 | Stefan Weil | */
|
19 | 5826e519 | Stefan Weil | |
20 | 5826e519 | Stefan Weil | #include "dis-asm.h" |
21 | 5826e519 | Stefan Weil | #include "tcg/tcg.h" |
22 | 5826e519 | Stefan Weil | |
23 | 5826e519 | Stefan Weil | /* Disassemble TCI bytecode. */
|
24 | 5826e519 | Stefan Weil | int print_insn_tci(bfd_vma addr, disassemble_info *info)
|
25 | 5826e519 | Stefan Weil | { |
26 | 5826e519 | Stefan Weil | int length;
|
27 | 5826e519 | Stefan Weil | uint8_t byte; |
28 | 5826e519 | Stefan Weil | int status;
|
29 | 5826e519 | Stefan Weil | TCGOpcode op; |
30 | 5826e519 | Stefan Weil | |
31 | 5826e519 | Stefan Weil | status = info->read_memory_func(addr, &byte, 1, info);
|
32 | 5826e519 | Stefan Weil | if (status != 0) { |
33 | 5826e519 | Stefan Weil | info->memory_error_func(status, addr, info); |
34 | 5826e519 | Stefan Weil | return -1; |
35 | 5826e519 | Stefan Weil | } |
36 | 5826e519 | Stefan Weil | op = byte; |
37 | 5826e519 | Stefan Weil | |
38 | 5826e519 | Stefan Weil | addr++; |
39 | 5826e519 | Stefan Weil | status = info->read_memory_func(addr, &byte, 1, info);
|
40 | 5826e519 | Stefan Weil | if (status != 0) { |
41 | 5826e519 | Stefan Weil | info->memory_error_func(status, addr, info); |
42 | 5826e519 | Stefan Weil | return -1; |
43 | 5826e519 | Stefan Weil | } |
44 | 5826e519 | Stefan Weil | length = byte; |
45 | 5826e519 | Stefan Weil | |
46 | 5826e519 | Stefan Weil | if (op >= tcg_op_defs_max) {
|
47 | 5826e519 | Stefan Weil | info->fprintf_func(info->stream, "illegal opcode %d", op);
|
48 | 5826e519 | Stefan Weil | } else {
|
49 | 5826e519 | Stefan Weil | const TCGOpDef *def = &tcg_op_defs[op];
|
50 | 5826e519 | Stefan Weil | int nb_oargs = def->nb_oargs;
|
51 | 5826e519 | Stefan Weil | int nb_iargs = def->nb_iargs;
|
52 | 5826e519 | Stefan Weil | int nb_cargs = def->nb_cargs;
|
53 | 5826e519 | Stefan Weil | /* TODO: Improve disassembler output. */
|
54 | 5826e519 | Stefan Weil | info->fprintf_func(info->stream, "%s\to=%d i=%d c=%d",
|
55 | 5826e519 | Stefan Weil | def->name, nb_oargs, nb_iargs, nb_cargs); |
56 | 5826e519 | Stefan Weil | } |
57 | 5826e519 | Stefan Weil | |
58 | 5826e519 | Stefan Weil | return length;
|
59 | 5826e519 | Stefan Weil | } |