Commit 4690764bba3a489d5180106d08970ced59113e22
1 parent
3c1cf9fa
update
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@312 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
8 changed files
with
104 additions
and
54 deletions
Changelog
| 1 | +version 0.4.2: | |
| 2 | + | |
| 3 | + - many exception handling fixes (can compile a Linux kernel inside vl) | |
| 4 | + - IDE emulation support | |
| 5 | + - initial GDB stub support | |
| 6 | + - deferred update support for disk images (Rusty Russell) | |
| 7 | + - accept user mode Linux Copy On Write disk images | |
| 8 | + - SMP kernels can at least be booted | |
| 9 | + | |
| 1 | 10 | version 0.4.1: |
| 2 | 11 | |
| 3 | 12 | - more accurate timer support in vl. | ... | ... |
Makefile
| ... | ... | @@ -141,7 +141,7 @@ endif |
| 141 | 141 | |
| 142 | 142 | # must use static linking to avoid leaving stuff in virtual address space |
| 143 | 143 | vl: vl.o block.o libqemu.a |
| 144 | - $(CC) -pg -static -Wl,-T,i386-vl.ld -o $@ $^ $(LIBS) | |
| 144 | + $(CC) -static -Wl,-T,i386-vl.ld -o $@ $^ $(LIBS) | |
| 145 | 145 | |
| 146 | 146 | vlmkcow: vlmkcow.o |
| 147 | 147 | $(CC) -o $@ $^ $(LIBS) |
| ... | ... | @@ -213,11 +213,11 @@ dyngen.c dyngen.h dyngen-exec.h ioctls.h syscall_types.h \ |
| 213 | 213 | Makefile elf.h elfload.c main.c signal.c qemu.h \ |
| 214 | 214 | syscall.c syscall_defs.h vm86.c path.c mmap.c \ |
| 215 | 215 | i386.ld ppc.ld alpha.ld s390.ld sparc.ld arm.ld\ |
| 216 | -vl.c i386-vl.ld vl.h block.c\ | |
| 216 | +vl.c i386-vl.ld vl.h block.c vlmkcow.c\ | |
| 217 | 217 | thunk.c cpu-exec.c translate.c cpu-all.h thunk.h exec.h\ |
| 218 | -exec.c cpu-exec.c\ | |
| 218 | +exec.c cpu-exec.c gdbstub.c\ | |
| 219 | 219 | cpu-i386.h op-i386.c helper-i386.c syscall-i386.h translate-i386.c \ |
| 220 | -exec-i386.h ops_template.h op_string.h opreg_template.h \ | |
| 220 | +exec-i386.h ops_template.h ops_template_mem.h op_string.h opreg_template.h \ | |
| 221 | 221 | cpu-arm.h syscall-arm.h exec-arm.h op-arm.c translate-arm.c op-arm-template.h \ |
| 222 | 222 | dis-asm.h disas.c disas.h alpha-dis.c ppc-dis.c i386-dis.c sparc-dis.c \ |
| 223 | 223 | arm-dis.c \ | ... | ... |
TODO
| 1 | - | |
| 2 | -- finish segment ops (call far, ret far, load_seg suppressed) | |
| 3 | -- fix arm fpu rounding (at least for float->integer conversions) | |
| 1 | +- optimize FPU operations (evaluate x87 stack pointer statically) and | |
| 2 | + fix cr0.TS emulation | |
| 4 | 3 | - fix CCOP optimisation |
| 5 | -- optimize FPU operations (evaluate x87 stack pointer statically) | |
| 6 | -- fpush not before mem load restarting | |
| 7 | 4 | - fix all remaining thread lock issues (must put TBs in a specific invalid |
| 8 | 5 | state, find a solution for tb_flush()). |
| 9 | -- add gcc 2.96 test configure (some gcc3 flags are needed) | |
| 6 | +- cpu loop optimisation (optimise ret case as the cpu state does not change) | |
| 7 | +- fix arm fpu rounding (at least for float->integer conversions) | |
| 10 | 8 | - add IPC syscalls |
| 11 | 9 | |
| 12 | 10 | lower priority: |
| 13 | 11 | -------------- |
| 12 | +- sysenter/sysexit emulation | |
| 13 | +- SMP support | |
| 14 | +- finish segment ops (call far, ret far, load_seg suppressed) | |
| 14 | 15 | - use -msoft-float on ARM |
| 15 | 16 | - use kernel traps for unaligned accesses on ARM ? |
| 16 | 17 | - handle rare page fault cases (in particular if page fault in heplers or | ... | ... |
VERSION
cpu-all.h
| ... | ... | @@ -311,7 +311,7 @@ extern CPUState *cpu_single_env; |
| 311 | 311 | |
| 312 | 312 | #define CPU_INTERRUPT_EXIT 0x01 /* wants exit from main loop */ |
| 313 | 313 | #define CPU_INTERRUPT_HARD 0x02 /* hardware interrupt pending */ |
| 314 | -void cpu_interrupt(CPUX86State *s, int mask); | |
| 314 | +void cpu_interrupt(CPUState *s, int mask); | |
| 315 | 315 | |
| 316 | 316 | /* gdb stub API */ |
| 317 | 317 | extern int gdbstub_fd; | ... | ... |
cpu-arm.h
| ... | ... | @@ -49,7 +49,6 @@ typedef struct CPUARMState { |
| 49 | 49 | |
| 50 | 50 | CPUARMState *cpu_arm_init(void); |
| 51 | 51 | int cpu_arm_exec(CPUARMState *s); |
| 52 | -void cpu_arm_interrupt(CPUARMState *s); | |
| 53 | 52 | void cpu_arm_close(CPUARMState *s); |
| 54 | 53 | /* you can call this signal handler from your SIGBUS and SIGSEGV |
| 55 | 54 | signal handlers to inform the virtual CPU of exceptions. non zero | ... | ... |
qemu-doc.texi
| ... | ... | @@ -240,9 +240,9 @@ This section explains how to launch a Linux kernel inside QEMU. |
| 240 | 240 | |
| 241 | 241 | @enumerate |
| 242 | 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. | |
| 243 | +Download the archive @file{vl-test-xxx.tar.gz} containing a Linux | |
| 244 | +kernel and a disk image. The archive also contains a precompiled | |
| 245 | +version of @file{vl}, the QEMU System emulator. | |
| 246 | 246 | |
| 247 | 247 | @item Optional: If you want network support (for example to launch X11 examples), you |
| 248 | 248 | must copy the script @file{vl-ifup} in @file{/etc} and configure |
| ... | ... | @@ -262,20 +262,25 @@ seen from the emulated kernel at IP address 172.20.0.1. |
| 262 | 262 | > ./vl.sh |
| 263 | 263 | connected to host network interface: tun0 |
| 264 | 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 | |
| 265 | +Linux version 2.4.20 (fabrice@localhost.localdomain) (gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)) #22 lun jui 7 13:37:41 CEST 2003 | |
| 266 | 266 | BIOS-provided physical RAM map: |
| 267 | - BIOS-88: 0000000000000000 - 000000000009f000 (usable) | |
| 268 | - BIOS-88: 0000000000100000 - 0000000002000000 (usable) | |
| 267 | + BIOS-e801: 0000000000000000 - 000000000009f000 (usable) | |
| 268 | + BIOS-e801: 0000000000100000 - 0000000002000000 (usable) | |
| 269 | 269 | 32MB LOWMEM available. |
| 270 | 270 | On node 0 totalpages: 8192 |
| 271 | 271 | zone(0): 4096 pages. |
| 272 | 272 | zone(1): 4096 pages. |
| 273 | 273 | zone(2): 0 pages. |
| 274 | -Kernel command line: root=/dev/ram ramdisk_size=6144 | |
| 274 | +Kernel command line: root=/dev/hda ide1=noprobe ide2=noprobe ide3=noprobe ide4=noprobe ide5=noprobe | |
| 275 | +ide_setup: ide1=noprobe | |
| 276 | +ide_setup: ide2=noprobe | |
| 277 | +ide_setup: ide3=noprobe | |
| 278 | +ide_setup: ide4=noprobe | |
| 279 | +ide_setup: ide5=noprobe | |
| 275 | 280 | 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) | |
| 281 | +Detected 501.285 MHz processor. | |
| 282 | +Calibrating delay loop... 989.59 BogoMIPS | |
| 283 | +Memory: 29268k/32768k available (907k kernel code, 3112k reserved, 212k data, 52k init, 0k highmem) | |
| 279 | 284 | Dentry cache hash table entries: 4096 (order: 3, 32768 bytes) |
| 280 | 285 | Inode cache hash table entries: 2048 (order: 2, 16384 bytes) |
| 281 | 286 | Mount-cache hash table entries: 512 (order: 0, 4096 bytes) |
| ... | ... | @@ -289,24 +294,30 @@ Based upon Swansea University Computer Society NET3.039 |
| 289 | 294 | Initializing RT netlink socket |
| 290 | 295 | apm: BIOS not found. |
| 291 | 296 | Starting kswapd |
| 297 | +Journalled Block Device driver loaded | |
| 292 | 298 | pty: 256 Unix98 ptys configured |
| 293 | 299 | Serial driver version 5.05c (2001-07-08) with no serial options enabled |
| 294 | 300 | ttyS00 at 0x03f8 (irq = 4) is a 16450 |
| 301 | +Uniform Multi-Platform E-IDE driver Revision: 6.31 | |
| 302 | +ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx | |
| 303 | +hda: QEMU HARDDISK, ATA DISK drive | |
| 304 | +ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 | |
| 305 | +hda: 12288 sectors (6 MB) w/256KiB Cache, CHS=12/16/63 | |
| 306 | +Partition check: | |
| 307 | + hda: unknown partition table | |
| 295 | 308 | ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com) |
| 296 | 309 | Last modified Nov 1, 2000 by Paul Gortmaker |
| 297 | 310 | NE*000 ethercard probe at 0x300: 52 54 00 12 34 56 |
| 298 | 311 | eth0: NE2000 found at 0x300, using IRQ 9. |
| 299 | -RAMDISK driver initialized: 16 RAM disks of 6144K size 1024 blocksize | |
| 312 | +RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize | |
| 300 | 313 | NET4: Linux TCP/IP 1.0 for NET4.0 |
| 301 | 314 | IP Protocols: ICMP, UDP, TCP, IGMP |
| 302 | 315 | IP: routing cache hash table of 512 buckets, 4Kbytes |
| 303 | -TCP: Hash tables configured (established 2048 bind 2048) | |
| 316 | +TCP: Hash tables configured (established 2048 bind 4096) | |
| 304 | 317 | 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 | |
| 318 | +EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended | |
| 308 | 319 | VFS: Mounted root (ext2 filesystem). |
| 309 | -Freeing unused kernel memory: 48k freed | |
| 320 | +Freeing unused kernel memory: 52k freed | |
| 310 | 321 | sh: can't access tty; job control turned off |
| 311 | 322 | # |
| 312 | 323 | @end example |
| ... | ... | @@ -338,7 +349,7 @@ a real Virtual Linux system ! |
| 338 | 349 | NOTES: |
| 339 | 350 | @enumerate |
| 340 | 351 | @item |
| 341 | -A 2.5.66 kernel is also included in the vl-test archive. Just | |
| 352 | +A 2.5.74 kernel is also included in the vl-test archive. Just | |
| 342 | 353 | replace the bzImage in vl.sh to try it. |
| 343 | 354 | |
| 344 | 355 | @item |
| ... | ... | @@ -348,7 +359,19 @@ a temporary directory using the tmpfs filesystem to avoid too many |
| 348 | 359 | unnecessary disk accesses. |
| 349 | 360 | |
| 350 | 361 | @item |
| 351 | -The example initrd is a modified version of the one made by Kevin | |
| 362 | +In order to exit cleanly for vl, you can do a @emph{shutdown} inside | |
| 363 | +vl. vl will automatically exit when the Linux shutdown is done. | |
| 364 | + | |
| 365 | +@item | |
| 366 | +You can boot slightly faster by disabling the probe of non present IDE | |
| 367 | +interfaces. To do so, add the following options on the kernel command | |
| 368 | +line: | |
| 369 | +@example | |
| 370 | +ide1=noprobe ide2=noprobe ide3=noprobe ide4=noprobe ide5=noprobe | |
| 371 | +@end example | |
| 372 | + | |
| 373 | +@item | |
| 374 | +The example disk image is a modified version of the one made by Kevin | |
| 352 | 375 | Lawton for the plex86 Project (@url{www.plex86.org}). |
| 353 | 376 | |
| 354 | 377 | @end enumerate |
| ... | ... | @@ -363,9 +386,6 @@ usage: vl [options] bzImage [kernel parameters...] |
| 363 | 386 | |
| 364 | 387 | General options: |
| 365 | 388 | @table @option |
| 366 | -@item -initrd file | |
| 367 | -Use 'file' as initial ram disk. | |
| 368 | - | |
| 369 | 389 | @item -hda file |
| 370 | 390 | @item -hdb file |
| 371 | 391 | Use 'file' as hard disk 0 or 1 image (@xref{disk_images}). |
| ... | ... | @@ -383,6 +403,9 @@ Set virtual RAM size to @var{megs} megabytes. |
| 383 | 403 | Set network init script [default=/etc/vl-ifup]. This script is |
| 384 | 404 | launched to configure the host network interface (usually tun0) |
| 385 | 405 | corresponding to the virtual NE2000 card. |
| 406 | + | |
| 407 | +@item -initrd file | |
| 408 | +Use 'file' as initial ram disk. | |
| 386 | 409 | @end table |
| 387 | 410 | |
| 388 | 411 | Debug options: |
| ... | ... | @@ -481,13 +504,17 @@ Since holes are used, the displayed size of the COW disk image is not |
| 481 | 504 | the real one. To know it, use the @code{ls -ls} command. |
| 482 | 505 | @end enumerate |
| 483 | 506 | |
| 484 | -@section Kernel Compilation | |
| 507 | +@section Linux Kernel Compilation | |
| 508 | + | |
| 509 | +You should be able to use any kernel with QEMU provided you make the | |
| 510 | +following changes (only 2.4.x and 2.5.x were tested): | |
| 485 | 511 | |
| 486 | -You can use any Linux kernel within QEMU provided it is mapped at | |
| 487 | -address 0x90000000 (the default is 0xc0000000). You must modify only two | |
| 488 | -lines in the kernel source: | |
| 512 | +@enumerate | |
| 513 | +@item | |
| 514 | +The kernel must be mapped at 0x90000000 (the default is | |
| 515 | +0xc0000000). You must modify only two lines in the kernel source: | |
| 489 | 516 | |
| 490 | -In asm/page.h, replace | |
| 517 | +In @file{include/asm/page.h}, replace | |
| 491 | 518 | @example |
| 492 | 519 | #define __PAGE_OFFSET (0xc0000000) |
| 493 | 520 | @end example |
| ... | ... | @@ -496,7 +523,7 @@ by |
| 496 | 523 | #define __PAGE_OFFSET (0x90000000) |
| 497 | 524 | @end example |
| 498 | 525 | |
| 499 | -And in arch/i386/vmlinux.lds, replace | |
| 526 | +And in @file{arch/i386/vmlinux.lds}, replace | |
| 500 | 527 | @example |
| 501 | 528 | . = 0xc0000000 + 0x100000; |
| 502 | 529 | @end example |
| ... | ... | @@ -505,22 +532,25 @@ by |
| 505 | 532 | . = 0x90000000 + 0x100000; |
| 506 | 533 | @end example |
| 507 | 534 | |
| 508 | -The file config-2.4.20 gives the configuration of the example kernel. | |
| 509 | - | |
| 510 | -Just type | |
| 535 | +@item | |
| 536 | +If you want to enable SMP (Symmetric Multi-Processing) support, you | |
| 537 | +must make the following change in @file{include/asm/fixmap.h}. Replace | |
| 511 | 538 | @example |
| 512 | -make bzImage | |
| 539 | +#define FIXADDR_TOP (0xffffX000UL) | |
| 513 | 540 | @end example |
| 541 | +by | |
| 542 | +@example | |
| 543 | +#define FIXADDR_TOP (0xa7ffX000UL) | |
| 544 | +@end example | |
| 545 | +(X is 'e' or 'f' depending on the kernel version). Although you can | |
| 546 | +use an SMP kernel with QEMU, it only supports one CPU. | |
| 514 | 547 | |
| 515 | -As you would do to make a real kernel. Then you can use with QEMU | |
| 516 | -exactly the same kernel as you would boot on your PC (in | |
| 517 | -@file{arch/i386/boot/bzImage}). | |
| 518 | - | |
| 548 | +@item | |
| 519 | 549 | If you are not using a 2.5 kernel as host kernel but if you use a target |
| 520 | 550 | 2.5 kernel, you must also ensure that the 'HZ' define is set to 100 |
| 521 | 551 | (1000 is the default) as QEMU cannot currently emulate timers at |
| 522 | 552 | frequencies greater than 100 Hz on host Linux systems < 2.5. In |
| 523 | -asm/param.h, replace: | |
| 553 | +@file{include/asm/param.h}, replace: | |
| 524 | 554 | |
| 525 | 555 | @example |
| 526 | 556 | # define HZ 1000 /* Internal kernel timer frequency */ |
| ... | ... | @@ -530,8 +560,18 @@ by |
| 530 | 560 | # define HZ 100 /* Internal kernel timer frequency */ |
| 531 | 561 | @end example |
| 532 | 562 | |
| 533 | -If you have problems running your kernel, verify that neither the SMP nor | |
| 534 | -HIGHMEM configuration options are activated. | |
| 563 | +@end enumerate | |
| 564 | + | |
| 565 | +The file config-2.x.x gives the configuration of the example kernels. | |
| 566 | + | |
| 567 | +Just type | |
| 568 | +@example | |
| 569 | +make bzImage | |
| 570 | +@end example | |
| 571 | + | |
| 572 | +As you would do to make a real kernel. Then you can use with QEMU | |
| 573 | +exactly the same kernel as you would boot on your PC (in | |
| 574 | +@file{arch/i386/boot/bzImage}). | |
| 535 | 575 | |
| 536 | 576 | @section PC Emulation |
| 537 | 577 | |
| ... | ... | @@ -733,7 +773,7 @@ Correct translated code invalidation is done efficiently by maintaining |
| 733 | 773 | a linked list of every translated block contained in a given page. Other |
| 734 | 774 | linked lists are also maintained to undo direct block chaining. |
| 735 | 775 | |
| 736 | -Althought the overhead of doing @code{mprotect()} calls is important, | |
| 776 | +Although the overhead of doing @code{mprotect()} calls is important, | |
| 737 | 777 | most MSDOS programs can be emulated at reasonnable speed with QEMU and |
| 738 | 778 | DOSEMU. |
| 739 | 779 | |
| ... | ... | @@ -802,7 +842,7 @@ reentrancy. |
| 802 | 842 | |
| 803 | 843 | @section Self-virtualization |
| 804 | 844 | |
| 805 | -QEMU was conceived so that ultimately it can emulate itself. Althought | |
| 845 | +QEMU was conceived so that ultimately it can emulate itself. Although | |
| 806 | 846 | it is not very useful, it is an important test to show the power of the |
| 807 | 847 | emulator. |
| 808 | 848 | ... | ... |
vlmkcow.c
| ... | ... | @@ -85,7 +85,8 @@ int cow_create(int cow_fd, const char *image_filename, |
| 85 | 85 | |
| 86 | 86 | void help(void) |
| 87 | 87 | { |
| 88 | - printf("usage vlmkcow [-h] [-f disk_image] cow_image [cow_size]\n" | |
| 88 | + printf("vlmkcow version " QEMU_VERSION ", Copyright (c) 2003 Fabrice Bellard\n" | |
| 89 | + "usage: vlmkcow [-h] [-f disk_image] cow_image [cow_size]\n" | |
| 89 | 90 | "Create a Copy On Write disk image from an optional raw disk image\n" |
| 90 | 91 | "\n" |
| 91 | 92 | "-f disk_image set the raw disk image name\n" | ... | ... |