From: Ulrich Hecht <uli@suse.de>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] qemu regression 0.7.2 -> 0.8.0 (ARM user emulation)
Date: Mon, 6 Mar 2006 15:03:18 +0100 [thread overview]
Message-ID: <200603061503.18426.uli@suse.de> (raw)
In-Reply-To: <5b5833aa0603011418j33a74eb4ob9bde3906cad8790@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 521 bytes --]
Hi!
On Wednesday 01 March 2006 23:18, Anderson Lizardo wrote:
> I was having some issues with the latest qemu (ARM user emulation),
> which I tracked down to the following reduced test case:
>
> #include <stdio.h>
> int main(void)
> {
> float a, b;
> a = 0.1f;
> b = 0.8f;
> printf("a < b: %d\n", (a < b));
> return 0;
> }
This fails because of a bug in the glue code between NWFPE and QEMU. (It
relies on a specific layout of the CPUARMState structure.)
Fix attached.
CU
Uli
[-- Attachment #2: qemu-nwfpe-cpsr.patch --]
[-- Type: text/x-diff, Size: 3469 bytes --]
diff -ru qemu-0.8.0/linux-user/main.c qemu-0.8.0.fixed/linux-user/main.c
--- qemu-0.8.0/linux-user/main.c 2005-12-19 23:51:53.000000000 +0100
+++ qemu-0.8.0.fixed/linux-user/main.c 2006-03-06 14:21:49.000000000 +0100
@@ -345,7 +345,7 @@
/* we get the opcode */
opcode = ldl_raw((uint8_t *)env->regs[15]);
- if (EmulateAll(opcode, &ts->fpa, env->regs) == 0) {
+ if (EmulateAll(opcode, &ts->fpa, env) == 0) {
info.si_signo = SIGILL;
info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPN;
diff -ru qemu-0.8.0/target-arm/nwfpe/fpa11.c qemu-0.8.0.fixed/target-arm/nwfpe/fpa11.c
--- qemu-0.8.0/target-arm/nwfpe/fpa11.c 2005-12-19 23:51:53.000000000 +0100
+++ qemu-0.8.0.fixed/target-arm/nwfpe/fpa11.c 2006-03-06 14:19:43.000000000 +0100
@@ -36,7 +36,7 @@
unsigned int EmulateCPRT(const unsigned int);
FPA11* qemufpa=0;
-unsigned int* user_registers=0;
+CPUARMState* user_registers=0;
/* Reset the FPA11 chip. Called to initialize and reset the emulator. */
void resetFPA11(void)
@@ -137,7 +137,7 @@
}
/* Emulate the instruction in the opcode. */
-unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, unsigned int* qregs)
+unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs)
{
unsigned int nRc = 0;
// unsigned long flags;
diff -ru qemu-0.8.0/target-arm/nwfpe/fpa11.h qemu-0.8.0.fixed/target-arm/nwfpe/fpa11.h
--- qemu-0.8.0/target-arm/nwfpe/fpa11.h 2005-12-19 23:51:53.000000000 +0100
+++ qemu-0.8.0.fixed/target-arm/nwfpe/fpa11.h 2006-03-06 14:58:21.000000000 +0100
@@ -26,6 +26,8 @@
#include <stdio.h>
#include <errno.h>
+#include <cpu.h>
+
#define GET_FPA11() (qemufpa)
/*
@@ -33,7 +35,7 @@
* stack+task struct. Use the same method as 'current' uses to
* reach them.
*/
-extern unsigned int *user_registers;
+extern CPUARMState *user_registers;
#define GET_USERREG() (user_registers)
@@ -94,7 +96,7 @@
static inline unsigned int readRegister(unsigned int reg)
{
- return (user_registers[(reg)]);
+ return (user_registers->regs[(reg)]);
}
static inline void writeRegister(unsigned int x, unsigned int y)
@@ -102,34 +104,17 @@
#if 0
printf("writing %d to r%d\n",y,x);
#endif
- user_registers[(x)]=(y);
+ user_registers->regs[(x)]=(y);
}
static inline void writeConditionCodes(unsigned int x)
{
-#if 0
-unsigned int y;
-unsigned int ZF;
- printf("setting flags to %x from %x\n",x,user_registers[16]);
-#endif
- user_registers[16]=(x); // cpsr
- user_registers[17]=(x>>29)&1; // cf
- user_registers[18]=(x<<3)&(1<<31); // vf
- user_registers[19]=x&(1<<31); // nzf
- if(!(x&(1<<30))) user_registers[19]++; // nzf must be non-zero for zf to be cleared
-
-#if 0
- ZF = (user_registers[19] == 0);
- y=user_registers[16] | (user_registers[19] & 0x80000000) | (ZF << 30) |
- (user_registers[17] << 29) | ((user_registers[18] & 0x80000000) >> 3);
- if(y != x)
- printf("GODDAM SHIIIIIIIIIIIIIIIIT! %x %x nzf %x zf %x\n",x,y,user_registers[19],ZF);
-#endif
+ cpsr_write(user_registers,x,~CPSR_M);
}
#define REG_PC 15
-unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, unsigned int* qregs);
+unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs);
/* included only for get_user/put_user macros */
#include "qemu.h"
next prev parent reply other threads:[~2006-03-06 20:41 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-01 22:18 [Qemu-devel] qemu regression 0.7.2 -> 0.8.0 (ARM user emulation) Anderson Lizardo
2006-03-06 14:03 ` Ulrich Hecht [this message]
2006-03-07 20:22 ` Anderson Lizardo
2006-03-11 21:02 ` Paul Brook
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=200603061503.18426.uli@suse.de \
--to=uli@suse.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).