1By Vlad Lungu vlad.lungu@windriver.com 2007-Oct-01 2---------------------------------------- 3Qemu is a full system emulator. See 4 5http://www.nongnu.org/qemu/ 6 7Limitations & comments 8---------------------- 9Supports the "-M mips" configuration of qemu: serial,NE2000,IDE. 10Supports little and big endian as well as 32 bit and 64 bit. 11Derived from au1x00 with a lot of things cut out. 12 13Supports emulated flash (patch Jean-Christophe PLAGNIOL-VILLARD) with 14recent qemu versions. When using emulated flash, launch with 15-pflash <filename> and erase mips_bios.bin. 16 17 18Notes for the Qemu MIPS port 19---------------------------- 20 21I) Example usage: 22 23Using u-boot.bin as ROM (replaces Qemu monitor): 24 2532 bit, big endian: 26# make qemu_mips 27# qemu-system-mips -M mips -bios u-boot.bin -nographic 28 2932 bit, little endian: 30# make qemu_mipsel 31# qemu-system-mipsel -M mips -bios u-boot.bin -nographic 32 3364 bit, big endian: 34# make qemu_mips64 35# qemu-system-mips64 -cpu MIPS64R2-generic -M mips -bios u-boot.bin -nographic 36 3764 bit, little endian: 38# make qemu_mips64el 39# qemu-system-mips64el -cpu MIPS64R2-generic -M mips -bios u-boot.bin -nographic 40 41or using u-boot.bin from emulated flash: 42 43if you use a qemu version after commit 4224 44 45create image: 46# dd of=flash bs=1k count=4k if=/dev/zero 47# dd of=flash bs=1k conv=notrunc if=u-boot.bin 48start it (see above): 49# qemu-system-mips[64][el] [-cpu MIPS64R2-generic] -M mips -pflash flash -nographic 50 512) Download kernel + initrd 52 53On ftp://ftp.denx.de/pub/contrib/Jean-Christophe_Plagniol-Villard/qemu_mips/ 54you can downland 55 56#config to build the kernel 57qemu_mips_defconfig 58#patch to fix mips interrupt init on 2.6.24.y kernel 59qemu_mips_kernel.patch 60initrd.gz 61vmlinux 62vmlinux.bin 63System.map 64 654) Generate uImage 66 67# tools/mkimage -A mips -O linux -T kernel -C gzip -a 0x80010000 -e 0x80245650 -n "Linux 2.6.24.y" -d vmlinux.bin.gz uImage 68 695) Copy uImage to Flash 70# dd if=uImage bs=1k conv=notrunc seek=224 of=flash 71 726) Generate Ide Disk 73 74# dd of=ide bs=1k cout=100k if=/dev/zero 75 76# sfdisk -C 261 -d ide 77# partition table of ide 78unit: sectors 79 80 ide1 : start= 63, size= 32067, Id=83 81 ide2 : start= 32130, size= 32130, Id=83 82 ide3 : start= 64260, size= 4128705, Id=83 83 ide4 : start= 0, size= 0, Id= 0 84 857) Copy to ide 86 87# dd if=uImage bs=512 conv=notrunc seek=63 of=ide 88 898) Generate ext2 on part 2 on Copy uImage and initrd.gz 90 91# Attached as loop device ide offset = 32130 * 512 92# losetup -o 16450560 -f ide 93# Format as ext2 ( arg2 : nb blocks) 94# mke2fs /dev/loop0 16065 95# losetup -d /dev/loop0 96# Mount and copy uImage and initrd.gz to it 97# mount -o loop,offset=16450560 -t ext2 ide /mnt 98# mkdir /mnt/boot 99# cp {initrd.gz,uImage} /mnt/boot/ 100# Umount it 101# umount /mnt 102 1039) Set Environment 104 105setenv rd_start 0x80800000 106setenv rd_size 2663940 107setenv kernel BFC38000 108setenv oad_addr 80500000 109setenv load_addr2 80F00000 110setenv kernel_flash BFC38000 111setenv load_addr_hello 80200000 112setenv bootargs 'root=/dev/ram0 init=/bin/sh' 113setenv load_rd_ext2 'ide res; ext2load ide 0:2 ${rd_start} /boot/initrd.gz' 114setenv load_rd_tftp 'tftp ${rd_start} /initrd.gz' 115setenv load_kernel_hda 'ide res; diskboot ${load_addr} 0:2' 116setenv load_kernel_ext2 'ide res; ext2load ide 0:2 ${load_addr} /boot/uImage' 117setenv load_kernel_tftp 'tftp ${load_addr} /qemu_mips/uImage' 118setenv boot_ext2_ext2 'run load_rd_ext2; run load_kernel_ext2; run addmisc; bootm ${load_addr}' 119setenv boot_ext2_flash 'run load_rd_ext2; run addmisc; bootm ${kernel_flash}' 120setenv boot_ext2_hda 'run load_rd_ext2; run load_kernel_hda; run addmisc; bootm ${load_addr}' 121setenv boot_ext2_tftp 'run load_rd_ext2; run load_kernel_tftp; run addmisc; bootm ${load_addr}' 122setenv boot_tftp_hda 'run load_rd_tftp; run load_kernel_hda; run addmisc; bootm ${load_addr}' 123setenv boot_tftp_ext2 'run load_rd_tftp; run load_kernel_ext2; run addmisc; bootm ${load_addr}' 124setenv boot_tftp_flash 'run load_rd_tftp; run addmisc; bootm ${kernel_flash}' 125setenv boot_tftp_tftp 'run load_rd_tftp; run load_kernel_tftp; run addmisc; bootm ${load_addr}' 126setenv load_hello_tftp 'tftp ${load_addr_hello} /examples/hello_world.bin' 127setenv go_tftp 'run load_hello_tftp; go ${load_addr_hello}' 128setenv addmisc 'setenv bootargs ${bootargs} console=ttyS0,${baudrate} rd_start=${rd_start} rd_size=${rd_size} ethaddr=${ethaddr}' 129setenv bootcmd 'run boot_tftp_flash' 130 13110) Now you can boot from flash, ide, ide+ext2 and tfp 132 133# qemu-system-mips -M mips -pflash flash -monitor null -nographic -net nic -net user -tftp `pwd` -hda ide 134 135II) How to debug U-Boot 136 137In order to debug U-Boot you need to start qemu with gdb server support (-s) 138and waiting the connection to start the CPU (-S) 139 140# qemu-system-mips -S -s -M mips -pflash flash -monitor null -nographic -net nic -net user -tftp `pwd` -hda ide 141 142in an other console you start gdb 143 1441) Debugging of U-Boot Before Relocation 145 146Before relocation, the addresses in the ELF file can be used without any problems 147by connecting to the gdb server localhost:1234 148 149# mipsel-unknown-linux-gnu-gdb u-boot 150GNU gdb 6.6 151Copyright (C) 2006 Free Software Foundation, Inc. 152GDB is free software, covered by the GNU General Public License, and you are 153welcome to change it and/or distribute copies of it under certain conditions. 154Type "show copying" to see the conditions. 155There is absolutely no warranty for GDB. Type "show warranty" for details. 156This GDB was configured as "--host=i486-linux-gnu --target=mipsel-unknown-linux-gnu"... 157(gdb) target remote localhost:1234 158Remote debugging using localhost:1234 159_start () at start.S:64 16064 RVECENT(reset,0) /* U-boot entry point */ 161Current language: auto; currently asm 162(gdb) b board.c:289 163Breakpoint 1 at 0xbfc00cc8: file board.c, line 289. 164(gdb) c 165Continuing. 166 167Breakpoint 1, board_init_f (bootflag=<value optimized out>) at board.c:290 168290 relocate_code (addr_sp, id, addr); 169Current language: auto; currently c 170(gdb) p/x addr 171$1 = 0x87fa0000 172 1732) Debugging of U-Boot After Relocation 174 175For debugging U-Boot after relocation we need to know the address to which 176U-Boot relocates itself to 0x87fa0000 by default. 177And replace the symbol table to this offset. 178 179(gdb) symbol-file 180Discard symbol table from `/private/u-boot-arm/u-boot'? (y or n) y 181Error in re-setting breakpoint 1: 182No symbol table is loaded. Use the "file" command. 183No symbol file now. 184(gdb) add-symbol-file u-boot 0x87fa0000 185add symbol table from file "u-boot" at 186 .text_addr = 0x87fa0000 187(y or n) y 188Reading symbols from /private/u-boot-arm/u-boot...done. 189Breakpoint 1 at 0x87fa0cc8: file board.c, line 289. 190(gdb) c 191Continuing. 192 193Program received signal SIGINT, Interrupt. 1940xffffffff87fa0de4 in udelay (usec=<value optimized out>) at time.c:78 19578 while ((tmo - read_c0_count()) < 0x7fffffff) 196