386c3c7507547b598d48b3b3e2d5729e51e514d6
[qemu.git] / tcg / tci / README
1 TCG Interpreter (TCI) - Copyright (c) 2011 Stefan Weil.
2
3 This file is released under the BSD license.
4
5 1) Introduction
6
7 TCG (Tiny Code Generator) is a code generator which translates
8 code fragments ("basic blocks") from target code (any of the
9 targets supported by QEMU) to a code representation which
10 can be run on a host.
11
12 QEMU can create native code for some hosts (arm, i386, ia64, ppc, ppc64,
13 s390, sparc, x86_64). For others, unofficial host support was written.
14
15 By adding a code generator for a virtual machine and using an
16 interpreter for the generated bytecode, it is possible to
17 support (almost) any host.
18
19 This is what TCI (Tiny Code Interpreter) does.
20
21 2) Implementation
22
23 Like each TCG host frontend, TCI implements the code generator in
24 tcg-target.inc.c, tcg-target.h. Both files are in directory tcg/tci.
25
26 The additional file tcg/tci.c adds the interpreter.
27
28 The bytecode consists of opcodes (same numeric values as those used by
29 TCG), command length and arguments of variable size and number.
30
31 3) Usage
32
33 For hosts without native TCG, the interpreter TCI must be enabled by
34
35         configure --enable-tcg-interpreter
36
37 If configure is called without --enable-tcg-interpreter, it will
38 suggest using this option. Setting it automatically would need
39 additional code in configure which must be fixed when new native TCG
40 implementations are added.
41
42 System emulation should work on any 32 or 64 bit host.
43 User mode emulation might work. Maybe a new linker script (*.ld)
44 is needed. Byte order might be wrong (on big endian hosts)
45 and need fixes in configure.
46
47 For hosts with native TCG, the interpreter TCI can be enabled by
48
49         configure --enable-tcg-interpreter
50
51 The only difference from running QEMU with TCI to running without TCI
52 should be speed. Especially during development of TCI, it was very
53 useful to compare runs with and without TCI. Create /tmp/qemu.log by
54
55         qemu-system-i386 -d in_asm,op_opt,cpu -D /tmp/qemu.log -singlestep
56
57 once with interpreter and once without interpreter and compare the resulting
58 qemu.log files. This is also useful to see the effects of additional
59 registers or additional opcodes (it is easy to modify the virtual machine).
60 It can also be used to verify native TCGs.
61
62 Hosts with native TCG can also enable TCI by claiming to be unsupported:
63
64         configure --cpu=unknown --enable-tcg-interpreter
65
66 configure then no longer uses the native linker script (*.ld) for
67 user mode emulation.
68
69
70 4) Status
71
72 TCI needs special implementation for 32 and 64 bit host, 32 and 64 bit target,
73 host and target with same or different endianness.
74
75             | host (le)                     host (be)
76             | 32             64             32             64
77 ------------+------------------------------------------------------------
78 target (le) | s0, u0         s1, u1         s?, u?         s?, u?
79 32 bit      |
80             |
81 target (le) | sc, uc         s1, u1         s?, u?         s?, u?
82 64 bit      |
83             |
84 target (be) | sc, u0         sc, uc         s?, u?         s?, u?
85 32 bit      |
86             |
87 target (be) | sc, uc         sc, uc         s?, u?         s?, u?
88 64 bit      |
89             |
90
91 System emulation
92 s? = untested
93 sc = compiles
94 s0 = bios works
95 s1 = grub works
96 s2 = Linux boots
97
98 Linux user mode emulation
99 u? = untested
100 uc = compiles
101 u0 = static hello works
102 u1 = linux-user-test works
103
104 5) Todo list
105
106 * TCI is not widely tested. It was written and tested on a x86_64 host
107   running i386 and x86_64 system emulation and Linux user mode.
108   A cross compiled QEMU for i386 host also works with the same basic tests.
109   A cross compiled QEMU for mipsel host works, too. It is terribly slow
110   because I run it in a mips malta emulation, so it is an interpreted
111   emulation in an emulation.
112   A cross compiled QEMU for arm host works (tested with pc bios).
113   A cross compiled QEMU for ppc host works at least partially:
114   i386-linux-user/qemu-i386 can run a simple hello-world program
115   (tested in a ppc emulation).
116
117 * Some TCG opcodes are either missing in the code generator and/or
118   in the interpreter. These opcodes raise a runtime exception, so it is
119   possible to see where code must be added.
120
121 * The pseudo code is not optimized and still ugly. For hosts with special
122   alignment requirements, it needs some fixes (maybe aligned bytecode
123   would also improve speed for hosts which support byte alignment).
124
125 * A better disassembler for the pseudo code would be nice (a very primitive
126   disassembler is included in tcg-target.inc.c).
127
128 * It might be useful to have a runtime option which selects the native TCG
129   or TCI, so QEMU would have to include two TCGs. Today, selecting TCI
130   is a configure option, so you need two compilations of QEMU.