|
|
1.1 ! root 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, hppa, 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.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 -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.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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.