Getting Started » History » Version 22
Sergey Smolov, 02/12/2020 03:38 PM
1 | 1 | Sergey Smolov | h1. Getting Started |
---|---|---|---|
2 | |||
3 | {{toc}} |
||
4 | |||
5 | 3 | Sergey Smolov | h2. General notes |
6 | |||
7 | 18 | Sergey Smolov | First of all, "install":https://forge.ispras.ru/projects/qemu4v/wiki/Installation the QEMU4V. |
8 | 8 | Sergey Smolov | |
9 | 3 | Sergey Smolov | It is possible to terminate QEMU by hands only. Neither Ctrl-C nor Ctrl-Z works, use _kill <process-id>_ or _killall qemu-system*_. |
10 | |||
11 | 1 | Sergey Smolov | h2. Aarch64 |
12 | |||
13 | 19 | Sergey Smolov | It is supposed that "Aarch64 toolchain":http://releases.linaro.org/components/toolchain/binaries is already installed in your system. |
14 | 1 | Sergey Smolov | |
15 | 3 | Sergey Smolov | # Write a simple Aarch64 program (it is called @sample.s@) that does nothing but puts 0x10 value to X0 register and then halts. Here it is: |
16 | 1 | Sergey Smolov | <pre> |
17 | .text |
||
18 | .globl _start |
||
19 | bl _start |
||
20 | _start: |
||
21 | movz x1, #0x10, LSL #0 |
||
22 | hlt #57005 |
||
23 | </pre> |
||
24 | 3 | Sergey Smolov | # To compile the Aarch64 assembler program, do the following: |
25 | 20 | Sergey Smolov | <pre><code class="shell"> |
26 | 1 | Sergey Smolov | aarch64-linux-gnu-as sample.s -o sample.o |
27 | aarch64-linux-gnu-ld sample.o -o sample.elf |
||
28 | aarch64-linux-gnu-objcopy -O binary sample.elf sample.bin |
||
29 | 20 | Sergey Smolov | </code></pre> |
30 | 1 | Sergey Smolov | # Finally, run _QEMU4V_ emulator with enabled option of microprocessor execution trace logging: |
31 | 20 | Sergey Smolov | <pre><code class="shell"> |
32 | 1 | Sergey Smolov | qemu-system-aarch64 -M virt -cpu cortex-a57 -bios sample.bin -d nochain,in_asm -singlestep -nographic -trace-log -D log-file.txt |
33 | 20 | Sergey Smolov | </code></pre> |
34 | 6 | Sergey Smolov | # Wait for a while, then stop QEMU4V. The following @log-file.txt@ trace file should be generated: |
35 | 1 | Sergey Smolov | <pre> |
36 | 0 clk IT (0) 0000000000000000 94000001 A svc_ns : bl #+0x4 (addr 0x4) |
||
37 | 1 clk IT (1) 0000000000000004 d2800201 A svc_ns : movz x1, #0x10, LSL #0 |
||
38 | 2 clk IT (2) 0000000000000008 d45bd5a0 A svc_ns : hlt #57005 |
||
39 | </pre> |
||
40 | |||
41 | h2. MIPS32 |
||
42 | 5 | Sergey Smolov | |
43 | 19 | Sergey Smolov | It is supposed that "MIPS toolchain":https://www.linux-mips.org/wiki/Toolchains is already installed in your system. |
44 | 3 | Sergey Smolov | |
45 | # First of all, let's write a simple MIPS program (it is called @sample.s@) that stores 0x10 value at x12345678 address. Here it is: |
||
46 | <pre> |
||
47 | .text |
||
48 | .globl _start |
||
49 | _start: |
||
50 | lui $1, 0x1234 |
||
51 | ori $1, $1, 0x5678 |
||
52 | addi $8, $0, 10 |
||
53 | sw $8, 0($1) |
||
54 | </pre> |
||
55 | 6 | Sergey Smolov | # To compile the MIPS32 assembler program, do the following: |
56 | 20 | Sergey Smolov | <pre><code class="shell"> |
57 | 3 | Sergey Smolov | mips-linux-gnu-as sample.s -o sample.o |
58 | mips-linux-gnu-ld sample.o -Ttext 0xbfc00000 -o sample.elf |
||
59 | 20 | Sergey Smolov | </code></pre> |
60 | 3 | Sergey Smolov | # Finally, run _QEMU4V_ emulator: |
61 | 20 | Sergey Smolov | <pre><code class="shell"> |
62 | 3 | Sergey Smolov | qemu-system-mips -M mips -cpu mips32r6-generic -d unimp,nochain,in_asm -nographic -singlestep -D log.txt -bios sample.elf |
63 | 20 | Sergey Smolov | </code></pre> |
64 | 6 | Sergey Smolov | # Wait for a while, then stop QEMU4V. The following @log-file.txt@ trace file should be generated: |
65 | 3 | Sergey Smolov | <pre> |
66 | ... |
||
67 | ---------------- |
||
68 | IN: |
||
69 | 0xbfc0fffc: nop |
||
70 | |||
71 | ---------------- |
||
72 | IN: |
||
73 | 0xbfc10000: lui at,0x1234 |
||
74 | |||
75 | ---------------- |
||
76 | IN: |
||
77 | 0xbfc10004: ori at,at,0x5678 |
||
78 | |||
79 | ---------------- |
||
80 | IN: |
||
81 | 0xbfc10008: beqzalc zero,t0,0xbfc10034 |
||
82 | |||
83 | ---------------- |
||
84 | IN: |
||
85 | 0xbfc10034: cache 0x0,0(s8) |
||
86 | 1 | Sergey Smolov | </pre> |
87 | 3 | Sergey Smolov | |
88 | 9 | Sergey Smolov | h2. PowerPC32 |
89 | 15 | Sergey Smolov | |
90 | 19 | Sergey Smolov | It is supposed that "PowerPC toolchain":https://packages.debian.org/sid/gcc-powerpc-linux-gnu is already installed in your system. |
91 | 15 | Sergey Smolov | |
92 | 10 | Maxim Chudnov | # Write a simple PowerPC program (it is called @p1.s@). Here it is: |
93 | <pre> |
||
94 | .section .text |
||
95 | addi 4,0,5 # bad |
||
96 | la 3,3(0) # very bad |
||
97 | la 3,0(3) |
||
98 | la 5,2500(3) |
||
99 | </pre> |
||
100 | # To compile the PowerPC assembler program, do the following: |
||
101 | 20 | Sergey Smolov | <pre><code class="shell"> |
102 | 17 | Sergey Smolov | powerpc-linux-gnu-as p1.s -me500mc -o p1.o |
103 | 16 | Sergey Smolov | powerpc-linux-gnu-ld p1.o -Ttext 0x0 -o p1.elf |
104 | 20 | Sergey Smolov | </code></pre> |
105 | # Finally, run _QEMU4V_ emulator: |
||
106 | <pre><code class="shell"> |
||
107 | 14 | Maxim Chudnov | qemu-system-ppc -M ppce500 -cpu e500 -d unimp,nochain,in_asm -nographic -singlestep -bios p1.elf |
108 | 20 | Sergey Smolov | </code></pre> |
109 | 14 | Maxim Chudnov | # Wait for a while, then stop QEMU4V. The following trace should be generated: |
110 | <pre> |
||
111 | IN: |
||
112 | 0x00000000: li r4,5 |
||
113 | |||
114 | IN: |
||
115 | 0x00000004: li r3,3 |
||
116 | |||
117 | IN: |
||
118 | 0x00000008: addi r3,r3,0 |
||
119 | |||
120 | IN: |
||
121 | 1 | Sergey Smolov | 0x0000000c: addi r5,r3,2500 |
122 | 14 | Maxim Chudnov | |
123 | </pre> |
||
124 | 1 | Sergey Smolov | |
125 | h2. RISC-V |
||
126 | 5 | Sergey Smolov | |
127 | 19 | Sergey Smolov | It is supposed that "RISC-V toolchain":https://github.com/riscv/riscv-gnu-toolchain is already installed in your system. |
128 | 1 | Sergey Smolov | |
129 | 3 | Sergey Smolov | # Write a simple RISC-V program (it is called @sample.s@) that does nothing but puts 0x18 value to @t1@ register and puts 0x21 value to @t2@ register. Here it is: |
130 | 1 | Sergey Smolov | <pre> |
131 | .text |
||
132 | .globl _start |
||
133 | _start: |
||
134 | addi t1, zero, 0x18 |
||
135 | addi t2, zero, 0x21 |
||
136 | </pre> |
||
137 | 3 | Sergey Smolov | # To compile the RISC-V assembler program, do the following: |
138 | 20 | Sergey Smolov | <pre><code class="shell"> |
139 | 1 | Sergey Smolov | aarch64-linux-gnu-as sample.s -o sample.o |
140 | aarch64-linux-gnu-ld sample.o -Ttext 0x1000 -o sample.elf |
||
141 | 20 | Sergey Smolov | </code></pre> |
142 | 1 | Sergey Smolov | # Finally, run _QEMU4V_ emulator with enabled option of microprocessor execution trace logging (0x1000 value was used by linker because of QEMU-related features): |
143 | 20 | Sergey Smolov | <pre><code class="shell"> |
144 | 2 | Sergey Smolov | qemu-system-riscv64 -M spike_v1.10 -cpu any -d unimp,nochain,in_asm -nographic -singlestep -trace-log -kernel sample.elf |
145 | 20 | Sergey Smolov | </code></pre> |
146 | 6 | Sergey Smolov | # Wait for a while, then stop QEMU4V. The following trace should be generated: |
147 | 1 | Sergey Smolov | <pre> |
148 | 0 clk 0 IT (0) 0000000000001000 01800313 A svc_ns : li t1,24 |
||
149 | 1 clk R t1 0000000000000018 |
||
150 | 1 clk 0 IT (1) 0000000000001004 02100393 A svc_ns : li t2,33 |
||
151 | 2 clk R t2 0000000000000021 |
||
152 | 2 clk 0 IT (2) 0000000000001008 00000000 A svc_ns : unimp |
||
153 | 3 clk 0 IT (3) 0000000000001010 00000000 A svc_ns : unimp |
||
154 | 3 | Sergey Smolov | </pre> |
155 | 7 | Sergey Smolov | |
156 | 3 | Sergey Smolov | h2. X86 (8086 case) |
157 | 5 | Sergey Smolov | |
158 | 19 | Sergey Smolov | It is supposed that "GCC":https://gcc.gnu.org is already installed in your system. |
159 | 1 | Sergey Smolov | |
160 | 7 | Sergey Smolov | # Write a simple X86 program (it is called @sample.s@) that performs some calculations: |
161 | 1 | Sergey Smolov | <pre> |
162 | 7 | Sergey Smolov | .code16 # tell the assembler that we're using 16 bit mode |
163 | .text |
||
164 | .global _start |
||
165 | 3 | Sergey Smolov | _start: |
166 | 7 | Sergey Smolov | mov $11, %AX |
167 | and $204, %BX |
||
168 | mov %AX, %CX |
||
169 | add %CX, %BX |
||
170 | sub %CX, %AX |
||
171 | 22 | Sergey Smolov | .org 510 # address before magic bytes |
172 | 7 | Sergey Smolov | .word 0xaa55 # magic bytes that tell BIOS that this is bootable |
173 | 1 | Sergey Smolov | </pre> |
174 | # To compile the X86 GNU assembler program, do the following: |
||
175 | 20 | Sergey Smolov | <pre><code class="shell"> |
176 | 1 | Sergey Smolov | x86_64-linux-gnu-as sample.s -o sample.o |
177 | 7 | Sergey Smolov | x86_64-linux-gnu-ld sample.o -T 0x7c00 --oformat binary -o sample.elf |
178 | 20 | Sergey Smolov | </code></pre> |
179 | 1 | Sergey Smolov | # Finally, run _QEMU4V_ emulator: |
180 | 20 | Sergey Smolov | <pre><code class="shell"> |
181 | 21 | Sergey Smolov | qemu-system-i386 -d unimp,nochain,in_asm -nographic -singlestep -D log.txt -hda sample.elf |
182 | 20 | Sergey Smolov | </code></pre> |
183 | 7 | Sergey Smolov | # Wait for a while, then stop QEMU4V. The following @log-file.txt@ trace file should be generated (go to the 0x7c00 address and see the program execution fragment): |
184 | 1 | Sergey Smolov | <pre> |
185 | 7 | Sergey Smolov | ---------------- |
186 | IN: |
||
187 | 0x00007c00: mov $0xb,%ax |
||
188 | |||
189 | ---------------- |
||
190 | IN: |
||
191 | 0x00007c03: and $0xcc,%bx |
||
192 | |||
193 | ---------------- |
||
194 | IN: |
||
195 | 0x00007c07: mov %ax,%cx |
||
196 | |||
197 | ---------------- |
||
198 | IN: |
||
199 | 0x00007c09: add %cx,%bx |
||
200 | |||
201 | ---------------- |
||
202 | IN: |
||
203 | 0x00007c0b: sub %cx,%ax |
||
204 | |||
205 | ---------------- |
||
206 | 1 | Sergey Smolov | </pre> |