1 By Vlad Lungu vlad.lungu (a] windriver.com 2007-Oct-01 2 ---------------------------------------- 3 Qemu is a full system emulator. See 4 5 http://www.nongnu.org/qemu/ 6 7 Limitations & comments 8 ---------------------- 9 Supports the "-M mips" configuration of qemu: serial,NE2000,IDE. 10 Supports little and big endian as well as 32 bit and 64 bit. 11 Derived from au1x00 with a lot of things cut out. 12 13 Supports emulated flash (patch Jean-Christophe PLAGNIOL-VILLARD) with 14 recent qemu versions. When using emulated flash, launch with 15 -pflash <filename> and erase mips_bios.bin. 16 17 18 Notes for the Qemu MIPS port 19 ---------------------------- 20 21 I) Example usage: 22 23 Using u-boot.bin as ROM (replaces Qemu monitor): 24 25 32 bit, big endian: 26 # make qemu_mips 27 # qemu-system-mips -M mips -bios u-boot.bin -nographic 28 29 32 bit, little endian: 30 # make qemu_mipsel 31 # qemu-system-mipsel -M mips -bios u-boot.bin -nographic 32 33 64 bit, big endian: 34 # make qemu_mips64 35 # qemu-system-mips64 -cpu MIPS64R2-generic -M mips -bios u-boot.bin -nographic 36 37 64 bit, little endian: 38 # make qemu_mips64el 39 # qemu-system-mips64el -cpu MIPS64R2-generic -M mips -bios u-boot.bin -nographic 40 41 or using u-boot.bin from emulated flash: 42 43 if you use a qemu version after commit 4224 44 45 create image: 46 # dd of=flash bs=1k count=4k if=/dev/zero 47 # dd of=flash bs=1k conv=notrunc if=u-boot.bin 48 start it (see above): 49 # qemu-system-mips[64][el] [-cpu MIPS64R2-generic] -M mips -pflash flash -nographic 50 51 2) Download kernel + initrd 52 53 On ftp://ftp.denx.de/pub/contrib/Jean-Christophe_Plagniol-Villard/qemu_mips/ 54 you can downland 55 56 #config to build the kernel 57 qemu_mips_defconfig 58 #patch to fix mips interrupt init on 2.6.24.y kernel 59 qemu_mips_kernel.patch 60 initrd.gz 61 vmlinux 62 vmlinux.bin 63 System.map 64 65 4) 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 69 5) Copy uImage to Flash 70 # dd if=uImage bs=1k conv=notrunc seek=224 of=flash 71 72 6) 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 78 unit: 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 85 7) Copy to ide 86 87 # dd if=uImage bs=512 conv=notrunc seek=63 of=ide 88 89 8) 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 103 9) Set Environment 104 105 setenv rd_start 0x80800000 106 setenv rd_size 2663940 107 setenv kernel BFC38000 108 setenv oad_addr 80500000 109 setenv load_addr2 80F00000 110 setenv kernel_flash BFC38000 111 setenv load_addr_hello 80200000 112 setenv bootargs 'root=/dev/ram0 init=/bin/sh' 113 setenv load_rd_ext2 'ide res; ext2load ide 0:2 ${rd_start} /boot/initrd.gz' 114 setenv load_rd_tftp 'tftp ${rd_start} /initrd.gz' 115 setenv load_kernel_hda 'ide res; diskboot ${load_addr} 0:2' 116 setenv load_kernel_ext2 'ide res; ext2load ide 0:2 ${load_addr} /boot/uImage' 117 setenv load_kernel_tftp 'tftp ${load_addr} /qemu_mips/uImage' 118 setenv boot_ext2_ext2 'run load_rd_ext2; run load_kernel_ext2; run addmisc; bootm ${load_addr}' 119 setenv boot_ext2_flash 'run load_rd_ext2; run addmisc; bootm ${kernel_flash}' 120 setenv boot_ext2_hda 'run load_rd_ext2; run load_kernel_hda; run addmisc; bootm ${load_addr}' 121 setenv boot_ext2_tftp 'run load_rd_ext2; run load_kernel_tftp; run addmisc; bootm ${load_addr}' 122 setenv boot_tftp_hda 'run load_rd_tftp; run load_kernel_hda; run addmisc; bootm ${load_addr}' 123 setenv boot_tftp_ext2 'run load_rd_tftp; run load_kernel_ext2; run addmisc; bootm ${load_addr}' 124 setenv boot_tftp_flash 'run load_rd_tftp; run addmisc; bootm ${kernel_flash}' 125 setenv boot_tftp_tftp 'run load_rd_tftp; run load_kernel_tftp; run addmisc; bootm ${load_addr}' 126 setenv load_hello_tftp 'tftp ${load_addr_hello} /examples/hello_world.bin' 127 setenv go_tftp 'run load_hello_tftp; go ${load_addr_hello}' 128 setenv addmisc 'setenv bootargs ${bootargs} console=ttyS0,${baudrate} rd_start=${rd_start} rd_size=${rd_size} ethaddr=${ethaddr}' 129 setenv bootcmd 'run boot_tftp_flash' 130 131 10) 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 135 II) How to debug U-Boot 136 137 In order to debug U-Boot you need to start qemu with gdb server support (-s) 138 and 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 142 in an other console you start gdb 143 144 1) Debugging of U-Boot Before Relocation 145 146 Before relocation, the addresses in the ELF file can be used without any problems 147 by connecting to the gdb server localhost:1234 148 149 # mipsel-unknown-linux-gnu-gdb u-boot 150 GNU gdb 6.6 151 Copyright (C) 2006 Free Software Foundation, Inc. 152 GDB is free software, covered by the GNU General Public License, and you are 153 welcome to change it and/or distribute copies of it under certain conditions. 154 Type "show copying" to see the conditions. 155 There is absolutely no warranty for GDB. Type "show warranty" for details. 156 This GDB was configured as "--host=i486-linux-gnu --target=mipsel-unknown-linux-gnu"... 157 (gdb) target remote localhost:1234 158 Remote debugging using localhost:1234 159 _start () at start.S:64 160 64 RVECENT(reset,0) /* U-Boot entry point */ 161 Current language: auto; currently asm 162 (gdb) b board.c:289 163 Breakpoint 1 at 0xbfc00cc8: file board.c, line 289. 164 (gdb) c 165 Continuing. 166 167 Breakpoint 1, board_init_f (bootflag=<value optimized out>) at board.c:290 168 290 relocate_code (addr_sp, id, addr); 169 Current language: auto; currently c 170 (gdb) p/x addr 171 $1 = 0x87fa0000 172 173 2) Debugging of U-Boot After Relocation 174 175 For debugging U-Boot after relocation we need to know the address to which 176 U-Boot relocates itself to 0x87fa0000 by default. 177 And replace the symbol table to this offset. 178 179 (gdb) symbol-file 180 Discard symbol table from `/private/u-boot-arm/u-boot'? (y or n) y 181 Error in re-setting breakpoint 1: 182 No symbol table is loaded. Use the "file" command. 183 No symbol file now. 184 (gdb) add-symbol-file u-boot 0x87fa0000 185 add symbol table from file "u-boot" at 186 .text_addr = 0x87fa0000 187 (y or n) y 188 Reading symbols from /private/u-boot-arm/u-boot...done. 189 Breakpoint 1 at 0x87fa0cc8: file board.c, line 289. 190 (gdb) c 191 Continuing. 192 193 Program received signal SIGINT, Interrupt. 194 0xffffffff87fa0de4 in udelay (usec=<value optimized out>) at time.c:78 195 78 while ((tmo - read_c0_count()) < 0x7fffffff) 196