Commit 1eb20527c88ff596e761574e6615c8f2272882b8
1 parent
e3e86d56
update
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@283 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
268 additions
and
40 deletions
Changelog
@@ -4,6 +4,7 @@ version 0.4: | @@ -4,6 +4,7 @@ version 0.4: | ||
4 | - fixed signal handling for correct dosemu DPMI emulation | 4 | - fixed signal handling for correct dosemu DPMI emulation |
5 | - fast x86 MMU emulation with mmap() | 5 | - fast x86 MMU emulation with mmap() |
6 | - fixed popl (%esp) case | 6 | - fixed popl (%esp) case |
7 | + - Linux kernel can be executed by QEMU with the 'vl' command. | ||
7 | 8 | ||
8 | version 0.3: | 9 | version 0.3: |
9 | 10 | ||
@@ -17,10 +18,10 @@ version 0.3: | @@ -17,10 +18,10 @@ version 0.3: | ||
17 | 18 | ||
18 | version 0.2: | 19 | version 0.2: |
19 | 20 | ||
20 | - - PowerPC disassembly and ELF symbols output (Rusty Russel) | ||
21 | - - flock support (Rusty Russel) | ||
22 | - - ugetrlimit support (Rusty Russel) | ||
23 | - - fstat64 fix (Rusty Russel) | 21 | + - PowerPC disassembly and ELF symbols output (Rusty Russell) |
22 | + - flock support (Rusty Russell) | ||
23 | + - ugetrlimit support (Rusty Russell) | ||
24 | + - fstat64 fix (Rusty Russell) | ||
24 | - initial Alpha port (Falk Hueffner) | 25 | - initial Alpha port (Falk Hueffner) |
25 | - initial IA64 port (Matt Wilson) | 26 | - initial IA64 port (Matt Wilson) |
26 | - initial Sparc and Sparc64 port (David S. Miller) | 27 | - initial Sparc and Sparc64 port (David S. Miller) |
TODO
1 | 1 | ||
2 | +- finish segment ops (call far, ret far, load_seg suppressed) | ||
2 | - fix arm fpu rounding (at least for float->integer conversions) | 3 | - fix arm fpu rounding (at least for float->integer conversions) |
3 | - fix CCOP optimisation | 4 | - fix CCOP optimisation |
4 | - optimize FPU operations (evaluate x87 stack pointer statically) | 5 | - optimize FPU operations (evaluate x87 stack pointer statically) |
@@ -7,7 +8,6 @@ | @@ -7,7 +8,6 @@ | ||
7 | state, find a solution for tb_flush()). | 8 | state, find a solution for tb_flush()). |
8 | - add gcc 2.96 test configure (some gcc3 flags are needed) | 9 | - add gcc 2.96 test configure (some gcc3 flags are needed) |
9 | - add IPC syscalls | 10 | - add IPC syscalls |
10 | -- submit a patch to fix DOSEMU coopthreads | ||
11 | 11 | ||
12 | lower priority: | 12 | lower priority: |
13 | -------------- | 13 | -------------- |
VERSION
qemu-doc.texi
@@ -11,35 +11,62 @@ | @@ -11,35 +11,62 @@ | ||
11 | 11 | ||
12 | @section Features | 12 | @section Features |
13 | 13 | ||
14 | -QEMU is a FAST! processor emulator. Its purpose is to run Linux executables | ||
15 | -compiled for one architecture on another. For example, x86 Linux | ||
16 | -processes can be ran on PowerPC Linux architectures. By using dynamic | ||
17 | -translation it achieves a reasonnable speed while being easy to port on | ||
18 | -new host CPUs. Its main goal is to be able to launch the @code{Wine} | ||
19 | -Windows API emulator (@url{http://www.winehq.org}) or @code{DOSEMU} | ||
20 | -(@url{http://www.dosemu.org}) on non-x86 CPUs. | 14 | +QEMU is a FAST! processor emulator. By using dynamic translation it |
15 | +achieves a reasonnable speed while being easy to port on new host | ||
16 | +CPUs. | ||
17 | + | ||
18 | +QEMU has two operating modes: | ||
19 | +@itemize | ||
20 | +@item User mode emulation. In this mode, QEMU can launch Linux processes | ||
21 | +compiled for one CPU on another CPU. Linux system calls are converted | ||
22 | +because of endianness and 32/64 bit mismatches. The Wine Windows API | ||
23 | +emulator (@url{http://www.winehq.org}) and the DOSEMU DOS emulator | ||
24 | +(@url{www.dosemu.org}) are the main targets for QEMU. | ||
25 | + | ||
26 | +@item Full system emulation. In this mode, QEMU emulates a full | ||
27 | +system, including a processor and various peripherials. Currently, it | ||
28 | +is only used to launch an x86 Linux kernel on an x86 Linux system. It | ||
29 | +enables easier testing and debugging of system code. It can also be | ||
30 | +used to provide virtual hosting of several virtual PCs on a single | ||
31 | +server. | ||
32 | + | ||
33 | +@end itemize | ||
34 | + | ||
35 | +As QEMU requires no host kernel patches to run, it is very safe and | ||
36 | +easy to use. | ||
21 | 37 | ||
22 | QEMU generic features: | 38 | QEMU generic features: |
23 | 39 | ||
24 | @itemize | 40 | @itemize |
25 | 41 | ||
26 | -@item User space only emulation. | 42 | +@item User space only or full system emulation. |
43 | + | ||
44 | +@item Using dynamic translation to native code for reasonnable speed. | ||
27 | 45 | ||
28 | @item Working on x86 and PowerPC hosts. Being tested on ARM, Sparc32, Alpha and S390. | 46 | @item Working on x86 and PowerPC hosts. Being tested on ARM, Sparc32, Alpha and S390. |
29 | 47 | ||
30 | -@item Using dynamic translation to native code for reasonnable speed. | 48 | +@item Self-modifying code support. |
49 | + | ||
50 | +@item Precise exception support. | ||
31 | 51 | ||
52 | +@item The virtual CPU is a library (@code{libqemu}) which can be used | ||
53 | +in other projects. | ||
54 | + | ||
55 | +@end itemize | ||
56 | + | ||
57 | +QEMU user mode emulation features: | ||
58 | +@itemize | ||
32 | @item Generic Linux system call converter, including most ioctls. | 59 | @item Generic Linux system call converter, including most ioctls. |
33 | 60 | ||
34 | @item clone() emulation using native CPU clone() to use Linux scheduler for threads. | 61 | @item clone() emulation using native CPU clone() to use Linux scheduler for threads. |
35 | 62 | ||
36 | @item Accurate signal handling by remapping host signals to target signals. | 63 | @item Accurate signal handling by remapping host signals to target signals. |
64 | +@end itemize | ||
65 | +@end itemize | ||
37 | 66 | ||
38 | -@item Self-modifying code support. | ||
39 | - | ||
40 | -@item The virtual CPU is a library (@code{libqemu}) which can be used | ||
41 | -in other projects. | ||
42 | - | 67 | +QEMU full system emulation features: |
68 | +@itemize | ||
69 | +@item Using mmap() system calls to simulate the MMU | ||
43 | @end itemize | 70 | @end itemize |
44 | 71 | ||
45 | @section x86 emulation | 72 | @section x86 emulation |
@@ -49,11 +76,9 @@ QEMU x86 target features: | @@ -49,11 +76,9 @@ QEMU x86 target features: | ||
49 | @itemize | 76 | @itemize |
50 | 77 | ||
51 | @item The virtual x86 CPU supports 16 bit and 32 bit addressing with segmentation. | 78 | @item The virtual x86 CPU supports 16 bit and 32 bit addressing with segmentation. |
52 | -User space LDT and GDT are emulated. VM86 mode is also supported to run DOSEMU. | ||
53 | - | ||
54 | -@item Precise user space x86 exceptions. | 79 | +LDT/GDT and IDT are emulated. VM86 mode is also supported to run DOSEMU. |
55 | 80 | ||
56 | -@item Support of host page sizes bigger than 4KB. | 81 | +@item Support of host page sizes bigger than 4KB in user mode emulation. |
57 | 82 | ||
58 | @item QEMU can emulate itself on x86. | 83 | @item QEMU can emulate itself on x86. |
59 | 84 | ||
@@ -73,12 +98,21 @@ Current QEMU limitations: | @@ -73,12 +98,21 @@ Current QEMU limitations: | ||
73 | @item IPC syscalls are missing. | 98 | @item IPC syscalls are missing. |
74 | 99 | ||
75 | @item The x86 segment limits and access rights are not tested at every | 100 | @item The x86 segment limits and access rights are not tested at every |
76 | -memory access (and will never be to have good performances). | 101 | +memory access. |
77 | 102 | ||
78 | @item On non x86 host CPUs, @code{double}s are used instead of the non standard | 103 | @item On non x86 host CPUs, @code{double}s are used instead of the non standard |
79 | 10 byte @code{long double}s of x86 for floating point emulation to get | 104 | 10 byte @code{long double}s of x86 for floating point emulation to get |
80 | maximum performances. | 105 | maximum performances. |
81 | 106 | ||
107 | +@item Full system emulation only works if no data are mapped above the virtual address | ||
108 | +0xc0000000 (yet). | ||
109 | + | ||
110 | +@item Some priviledged instructions or behaviors are missing. Only the ones | ||
111 | +needed for proper Linux kernel operation are emulated. | ||
112 | + | ||
113 | +@item No memory separation between the kernel and the user processes is done. | ||
114 | +It will be implemented very soon. | ||
115 | + | ||
82 | @end itemize | 116 | @end itemize |
83 | 117 | ||
84 | @section ARM emulation | 118 | @section ARM emulation |
@@ -94,7 +128,7 @@ generic dynamic code generation architecture of QEMU. | @@ -94,7 +128,7 @@ generic dynamic code generation architecture of QEMU. | ||
94 | 128 | ||
95 | @end itemize | 129 | @end itemize |
96 | 130 | ||
97 | -@chapter Invocation | 131 | +@chapter QEMU User space emulation invocation |
98 | 132 | ||
99 | @section Quick Start | 133 | @section Quick Start |
100 | 134 | ||
@@ -198,27 +232,188 @@ Activate log (logfile=/tmp/qemu.log) | @@ -198,27 +232,188 @@ Activate log (logfile=/tmp/qemu.log) | ||
198 | Act as if the host page size was 'pagesize' bytes | 232 | Act as if the host page size was 'pagesize' bytes |
199 | @end table | 233 | @end table |
200 | 234 | ||
235 | +@chapter QEMU System emulator invocation | ||
236 | + | ||
237 | +@section Quick Start | ||
238 | + | ||
239 | +This section explains how to launch a Linux kernel inside QEMU. | ||
240 | + | ||
241 | +@enumerate | ||
242 | +@item | ||
243 | +Download the archive @file{vl-test-xxx.tar.gz} containing a Linux kernel | ||
244 | +and an initrd (initial Ram Disk). The archive also contains a | ||
245 | +precompiled version of @file{vl}, the QEMU System emulator. | ||
246 | + | ||
247 | +@item Optional: If you want network support (for example to launch X11 examples), you | ||
248 | +must copy the script @file{vl-ifup} in @file{/etc} and configure | ||
249 | +properly @code{sudo} so that the command @code{ifconfig} contained in | ||
250 | +@file{vl-ifup} can be executed as root. You must verify that your host | ||
251 | +kernel supports the TUN/TAP network interfaces: the device | ||
252 | +@file{/dev/net/tun} must be present. | ||
253 | + | ||
254 | +When network is enabled, there is a virtual network connection between | ||
255 | +the host kernel and the emulated kernel. The emulated kernel is seen | ||
256 | +from the host kernel at IP address 172.20.0.2 and the host kernel is | ||
257 | +seen from the emulated kernel at IP address 172.20.0.1. | ||
258 | + | ||
259 | +@item Launch @code{vl.sh}. You should have the following output: | ||
260 | + | ||
261 | +@example | ||
262 | +> ./vl.sh | ||
263 | +connected to host network interface: tun0 | ||
264 | +Uncompressing Linux... Ok, booting the kernel. | ||
265 | +Linux version 2.4.20 (bellard@voyager) (gcc version 2.95.2 20000220 (Debian GNU/Linux)) #42 Wed Jun 25 14:16:12 CEST 2003 | ||
266 | +BIOS-provided physical RAM map: | ||
267 | + BIOS-88: 0000000000000000 - 000000000009f000 (usable) | ||
268 | + BIOS-88: 0000000000100000 - 0000000002000000 (usable) | ||
269 | +32MB LOWMEM available. | ||
270 | +On node 0 totalpages: 8192 | ||
271 | +zone(0): 4096 pages. | ||
272 | +zone(1): 4096 pages. | ||
273 | +zone(2): 0 pages. | ||
274 | +Kernel command line: root=/dev/ram ramdisk_size=6144 | ||
275 | +Initializing CPU#0 | ||
276 | +Detected 501.785 MHz processor. | ||
277 | +Calibrating delay loop... 973.20 BogoMIPS | ||
278 | +Memory: 24776k/32768k available (725k kernel code, 7604k reserved, 151k data, 48k init, 0k highmem) | ||
279 | +Dentry cache hash table entries: 4096 (order: 3, 32768 bytes) | ||
280 | +Inode cache hash table entries: 2048 (order: 2, 16384 bytes) | ||
281 | +Mount-cache hash table entries: 512 (order: 0, 4096 bytes) | ||
282 | +Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes) | ||
283 | +Page-cache hash table entries: 8192 (order: 3, 32768 bytes) | ||
284 | +CPU: Intel Pentium Pro stepping 03 | ||
285 | +Checking 'hlt' instruction... OK. | ||
286 | +POSIX conformance testing by UNIFIX | ||
287 | +Linux NET4.0 for Linux 2.4 | ||
288 | +Based upon Swansea University Computer Society NET3.039 | ||
289 | +Initializing RT netlink socket | ||
290 | +apm: BIOS not found. | ||
291 | +Starting kswapd | ||
292 | +pty: 256 Unix98 ptys configured | ||
293 | +Serial driver version 5.05c (2001-07-08) with no serial options enabled | ||
294 | +ttyS00 at 0x03f8 (irq = 4) is a 16450 | ||
295 | +ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com) | ||
296 | +Last modified Nov 1, 2000 by Paul Gortmaker | ||
297 | +NE*000 ethercard probe at 0x300: 52 54 00 12 34 56 | ||
298 | +eth0: NE2000 found at 0x300, using IRQ 9. | ||
299 | +RAMDISK driver initialized: 16 RAM disks of 6144K size 1024 blocksize | ||
300 | +NET4: Linux TCP/IP 1.0 for NET4.0 | ||
301 | +IP Protocols: ICMP, UDP, TCP, IGMP | ||
302 | +IP: routing cache hash table of 512 buckets, 4Kbytes | ||
303 | +TCP: Hash tables configured (established 2048 bind 2048) | ||
304 | +NET4: Unix domain sockets 1.0/SMP for Linux NET4.0. | ||
305 | +RAMDISK: ext2 filesystem found at block 0 | ||
306 | +RAMDISK: Loading 6144 blocks [1 disk] into ram disk... done. | ||
307 | +Freeing initrd memory: 6144k freed | ||
308 | +VFS: Mounted root (ext2 filesystem). | ||
309 | +Freeing unused kernel memory: 48k freed | ||
310 | +sh: can't access tty; job control turned off | ||
311 | +# | ||
312 | +@end example | ||
313 | + | ||
314 | +@item | ||
315 | +Then you can play with the kernel inside the virtual serial console. You | ||
316 | +can launch @code{ls} for example. Type @key{Ctrl-a h} to have an help | ||
317 | +about the keys you can type inside the virtual serial console. In | ||
318 | +particular @key{Ctrl-a b} is the Magic SysRq key. | ||
319 | + | ||
320 | +@item | ||
321 | +If the network is enabled, launch the script @file{/etc/linuxrc} in the | ||
322 | +emulator (don't forget the leading dot): | ||
323 | +@example | ||
324 | +. /etc/linuxrc | ||
325 | +@end example | ||
326 | + | ||
327 | +Then enable X11 connections on your PC from the emulated Linux: | ||
328 | +@example | ||
329 | +xhost +172.20.0.2 | ||
330 | +@end example | ||
331 | + | ||
332 | +You can now launch @file{xterm} or @file{xlogo} and verify that you have | ||
333 | +a real Virtual Linux system ! | ||
334 | + | ||
335 | +@end enumerate | ||
336 | + | ||
337 | +NOTE: the example initrd is a modified version of the one made by Kevin | ||
338 | +Lawton for the plex86 Project (@url{www.plex86.org}). | ||
339 | + | ||
340 | +@section Kernel Compilation | ||
341 | + | ||
342 | +You can use any Linux kernel within QEMU provided it is mapped at | ||
343 | +address 0x90000000 (the default is 0xc0000000). You must modify only two | ||
344 | +lines in the kernel source: | ||
345 | + | ||
346 | +In asm/page.h, replace | ||
347 | +@example | ||
348 | +#define __PAGE_OFFSET (0xc0000000) | ||
349 | +@end example | ||
350 | +by | ||
351 | +@example | ||
352 | +#define __PAGE_OFFSET (0x90000000) | ||
353 | +@end example | ||
354 | + | ||
355 | +And in arch/i386/vmlinux.lds, replace | ||
356 | +@example | ||
357 | + . = 0xc0000000 + 0x100000; | ||
358 | +@end example | ||
359 | +by | ||
360 | +@example | ||
361 | + . = 0x90000000 + 0x100000; | ||
362 | +@end example | ||
363 | + | ||
364 | +The file config-2.4.20 gives the configuration of the example kernel. | ||
365 | + | ||
366 | +Just type | ||
367 | +@example | ||
368 | +make bzImage | ||
369 | +@end example | ||
370 | + | ||
371 | +As you would do to make a real kernel. Then you can use with QEMU | ||
372 | +exactly the same kernel as you would boot on your PC (in | ||
373 | +@file{arch/i386/boot/bzImage}). | ||
374 | + | ||
375 | +@section PC Emulation | ||
376 | + | ||
377 | +QEMU emulates the following PC peripherials: | ||
378 | + | ||
379 | +@itemize | ||
380 | +@item | ||
381 | +PIC (interrupt controler) | ||
382 | +@item | ||
383 | +PIT (timers) | ||
384 | +@item | ||
385 | +CMOS memory | ||
386 | +@item | ||
387 | +Serial port (port=0x3f8, irq=4) | ||
388 | +@item | ||
389 | +NE2000 network adapter (port=0x300, irq=9) | ||
390 | +@item | ||
391 | +Dumb VGA (to print the @code{uncompressing Linux kernel} message) | ||
392 | +@end itemize | ||
393 | + | ||
201 | @chapter QEMU Internals | 394 | @chapter QEMU Internals |
202 | 395 | ||
203 | @section QEMU compared to other emulators | 396 | @section QEMU compared to other emulators |
204 | 397 | ||
205 | -Unlike bochs [3], QEMU emulates only a user space x86 CPU. It means that | ||
206 | -you cannot launch an operating system with it. The benefit is that it is | ||
207 | -simpler and faster due to the fact that some of the low level CPU state | ||
208 | -can be ignored (in particular, no virtual memory needs to be emulated). | 398 | +Like bochs [3], QEMU emulates an x86 CPU. But QEMU is much faster than |
399 | +bochs as it uses dynamic compilation and because it uses the host MMU to | ||
400 | +simulate the x86 MMU. The downside is that currently the emulation is | ||
401 | +not as accurate as bochs (for example, you cannot currently run Windows | ||
402 | +inside QEMU). | ||
209 | 403 | ||
210 | Like Valgrind [2], QEMU does user space emulation and dynamic | 404 | Like Valgrind [2], QEMU does user space emulation and dynamic |
211 | translation. Valgrind is mainly a memory debugger while QEMU has no | 405 | translation. Valgrind is mainly a memory debugger while QEMU has no |
212 | -support for it (QEMU could be used to detect out of bound memory accesses | ||
213 | -as Valgrind, but it has no support to track uninitialised data as | ||
214 | -Valgrind does). Valgrind dynamic translator generates better code than | ||
215 | -QEMU (in particular it does register allocation) but it is closely tied | ||
216 | -to an x86 host and target. | ||
217 | - | ||
218 | -EM86 [4] is the closest project to QEMU (and QEMU still uses some of its | ||
219 | -code, in particular the ELF file loader). EM86 was limited to an alpha | ||
220 | -host and used a proprietary and slow interpreter (the interpreter part | ||
221 | -of the FX!32 Digital Win32 code translator [5]). | 406 | +support for it (QEMU could be used to detect out of bound memory |
407 | +accesses as Valgrind, but it has no support to track uninitialised data | ||
408 | +as Valgrind does). Valgrind dynamic translator generates better code | ||
409 | +than QEMU (in particular it does register allocation) but it is closely | ||
410 | +tied to an x86 host and target and has no support for precise exception | ||
411 | +and system emulation. | ||
412 | + | ||
413 | +EM86 [4] is the closest project to user space QEMU (and QEMU still uses | ||
414 | +some of its code, in particular the ELF file loader). EM86 was limited | ||
415 | +to an alpha host and used a proprietary and slow interpreter (the | ||
416 | +interpreter part of the FX!32 Digital Win32 code translator [5]). | ||
222 | 417 | ||
223 | TWIN [6] is a Windows API emulator like Wine. It is less accurate than | 418 | TWIN [6] is a Windows API emulator like Wine. It is less accurate than |
224 | Wine but includes a protected mode x86 interpreter to launch x86 Windows | 419 | Wine but includes a protected mode x86 interpreter to launch x86 Windows |
@@ -227,6 +422,20 @@ Windows API is executed natively but it is far more difficult to develop | @@ -227,6 +422,20 @@ Windows API is executed natively but it is far more difficult to develop | ||
227 | because all the data structures and function parameters exchanged | 422 | because all the data structures and function parameters exchanged |
228 | between the API and the x86 code must be converted. | 423 | between the API and the x86 code must be converted. |
229 | 424 | ||
425 | +User mode Linux [7] was the only solution before QEMU to launch a Linux | ||
426 | +kernel as a process while not needing any host kernel patches. However, | ||
427 | +user mode Linux requires heavy kernel patches while QEMU accepts | ||
428 | +unpatched Linux kernels. It would be interesting to compare the | ||
429 | +performance of the two approaches. | ||
430 | + | ||
431 | +The new Plex86 [8] PC virtualizer is done in the same spirit as the QEMU | ||
432 | +system emulator. It requires a patched Linux kernel to work (you cannot | ||
433 | +launch the same kernel on your PC), but the patches are really small. As | ||
434 | +it is a PC virtualizer (no emulation is done except for some priveledged | ||
435 | +instructions), it has the potential of being faster than QEMU. The | ||
436 | +downside is that a complicated (and potentially unsafe) kernel patch is | ||
437 | +needed. | ||
438 | + | ||
230 | @section Portable dynamic translation | 439 | @section Portable dynamic translation |
231 | 440 | ||
232 | QEMU is a dynamic translator. When it first encounters a piece of code, | 441 | QEMU is a dynamic translator. When it first encounters a piece of code, |
@@ -409,6 +618,16 @@ space conflicts. QEMU solves this problem by being an executable ELF | @@ -409,6 +618,16 @@ space conflicts. QEMU solves this problem by being an executable ELF | ||
409 | shared object as the ld-linux.so ELF interpreter. That way, it can be | 618 | shared object as the ld-linux.so ELF interpreter. That way, it can be |
410 | relocated at load time. | 619 | relocated at load time. |
411 | 620 | ||
621 | +@section MMU emulation | ||
622 | + | ||
623 | +For system emulation, QEMU uses the mmap() system call to emulate the | ||
624 | +target CPU MMU. It works as long the emulated OS does not use an area | ||
625 | +reserved by the host OS (such as the area above 0xc0000000 on x86 | ||
626 | +Linux). | ||
627 | + | ||
628 | +It is planned to add a slower but more precise MMU emulation | ||
629 | +with a software MMU. | ||
630 | + | ||
412 | @section Bibliography | 631 | @section Bibliography |
413 | 632 | ||
414 | @table @asis | 633 | @table @asis |
@@ -439,6 +658,14 @@ Chernoff and Ray Hookway. | @@ -439,6 +658,14 @@ Chernoff and Ray Hookway. | ||
439 | @url{http://www.willows.com/}, Windows API library emulation from | 658 | @url{http://www.willows.com/}, Windows API library emulation from |
440 | Willows Software. | 659 | Willows Software. |
441 | 660 | ||
661 | +@item [7] | ||
662 | +@url{http://user-mode-linux.sourceforge.net/}, | ||
663 | +The User-mode Linux Kernel. | ||
664 | + | ||
665 | +@item [8] | ||
666 | +@url{http://www.plex86.org/}, | ||
667 | +The new Plex86 project. | ||
668 | + | ||
442 | @end table | 669 | @end table |
443 | 670 | ||
444 | @chapter Regression Tests | 671 | @chapter Regression Tests |