From: Stefan Weil <weil@mail.berlios.de>
To: QEMU Developers <qemu-devel@nongnu.org>
Subject: [Qemu-devel] [Bug] MIPS code fails at branch instruction
Date: Sat, 17 Mar 2007 00:12:28 +0100 [thread overview]
Message-ID: <45FB245C.2010900@mail.berlios.de> (raw)
[-- Attachment #1: Type: text/plain, Size: 825 bytes --]
Hi,
QEMU MIPS emulation fails with code using "illegal" commands
in the delay slot of a branch.
I had an endless loop with QEMU running the firmware of a
MIPS based router.
MIPS says: branches, jumps, ... instructions should not be
placed in the delay slot of a branch or jump.
Nevertheless, some routers use this kind of code.
I wrote a test program to examine the difference between emulation
and a real MIPS CPU (see appendices).
Results are given below for real hardware, normal emulation and
emulation using single stepping.
Stefan
Compile branch test like this:
mipsel-linux-gcc -Os -g btest.c btest2.S
AR7 (MIPS 4KEc) router:
# ./a.out
0
1100
1000
qemu-system-mipsel (unmodified):
# ./a.out
0
# (program hangs)
qemu-system-mipsel (single stepping / MIPS_SINGLE_STEP in translate.c):
# ./a.out
0
1221
1221
[-- Attachment #2: btest.c --]
[-- Type: text/x-csrc, Size: 746 bytes --]
/*
Compile branch test like this:
mipsel-linux-gcc -Os -g btest.c btest2.S
Original code failing with emulation:
218: 8d090000 lw t1,0(t0)
21c: 31290001 andi t1,t1,0x1
220: 1120fffd beqz t1,0x218
224: 03e00008 jr ra
228: 3c088000 lui t0,0x8000
22c: 3c093c1a lui t1,0x3c1a
AR7 router:
# ./a.out
0
1100
1000
qemu-system-mipsel (unmodified):
# ./a.out
0
# (program hangs)
qemu-system-mipsel (unmodified):
# ./a.out
0
1221
1221
*/
#include <stdio.h>
extern int test1(int i);
extern int test2(int i);
int main(void)
{
int i = 0;
printf("%d\n", i);
i = test1(0);
printf("%d\n", i);
i = test2(0);
printf("%d\n", i);
return 0;
}
[-- Attachment #3: btest2.S --]
[-- Type: text/plain, Size: 1141 bytes --]
#if 0
218: 8d090000 lw t1,0(t0)
21c: 31290001 andi t1,t1,0x1
220: 1120fffd beqz t1,0x218
224: 03e00008 jr ra
228: 3c088000 lui t0,0x8000
22c: 3c093c1a lui t1,0x3c1a
230: 35299400 ori t1,t1,0x9400
234: ad090000 sw t1,0(t0)
238: 3c09275a lui t1,0x275a
23c: ad090004 sw t1,4(t0)
#endif
#include <asm/asm.h>
#include <asm/regdef.h>
.text
.set noreorder
.set mips32r2
LEAF(test1)
move v0,a0
addiu v0,v0,1000
bnez a0,$L1
jr ra
addiu v0,v0,100
$L1:
beqz a0,$L2
jr ra
addiu v0,v0,10
$L2:
addiu v0,v0,1
jr ra
nop
END(test1)
LEAF(test2)
move v0,a0
addiu v0,v0,1000
beqz a0,$L3
jr ra
addiu v0,v0,100
$L3:
bnez a0,$L4
jr ra
addiu v0,v0,10
$L4:
addiu v0,v0,1
jr ra
nop
END(test2)
next reply other threads:[~2007-03-16 23:13 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-16 23:12 Stefan Weil [this message]
2007-03-17 0:46 ` [Qemu-devel] [Bug] MIPS code fails at branch instruction Thiemo Seufer
2007-03-17 11:37 ` Stefan Weil
2007-03-17 14:31 ` Thiemo Seufer
2007-03-17 18:57 ` Stefan Weil
2007-03-17 20:32 ` Paul Brook
2007-03-19 21:04 ` [Qemu-devel] [Bug] [Patch] " Stefan Weil
2007-03-19 21:34 ` Thiemo Seufer
2007-03-19 22:34 ` Thiemo Seufer
2007-03-20 7:54 ` Alexander Voropay
2007-03-20 9:51 ` Thiemo Seufer
2007-03-20 18:27 ` Stefan Weil
2007-03-25 0:22 ` Thiemo Seufer
2007-03-25 1:43 ` Aurelien Jarno
2007-03-25 12:51 ` Stuart Brady
2007-03-25 16:26 ` Thiemo Seufer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45FB245C.2010900@mail.berlios.de \
--to=weil@mail.berlios.de \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).