qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] qemu regression 0.7.2 -> 0.8.0 (ARM user emulation)
@ 2006-03-01 22:18 Anderson Lizardo
  2006-03-06 14:03 ` Ulrich Hecht
  0 siblings, 1 reply; 4+ messages in thread
From: Anderson Lizardo @ 2006-03-01 22:18 UTC (permalink / raw)
  To: qemu-devel

Hi,

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;
}

Compile it with an ARM cross-compiler and run it with "qemu-arm". It
should print

a < b: 1

for qemu 0.7.2 and

a < b: 0

for 0.8.0. Obviously, the first one is right.

Tested with the following setup:
qemu 0.7.2/0.8.0
arm-linux-gnu-gcc (GCC) 3.4.5
glibc 2.3.5

--
Anderson Lizardo
Embedded Linux Lab - 10LE
Nokia Institute of Technology - INdT
Manaus - Brazil

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] qemu regression 0.7.2 -> 0.8.0 (ARM user emulation)
  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
  2006-03-07 20:22   ` Anderson Lizardo
  2006-03-11 21:02   ` Paul Brook
  0 siblings, 2 replies; 4+ messages in thread
From: Ulrich Hecht @ 2006-03-06 14:03 UTC (permalink / raw)
  To: qemu-devel

[-- 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"

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] qemu regression 0.7.2 -> 0.8.0 (ARM user emulation)
  2006-03-06 14:03 ` Ulrich Hecht
@ 2006-03-07 20:22   ` Anderson Lizardo
  2006-03-11 21:02   ` Paul Brook
  1 sibling, 0 replies; 4+ messages in thread
From: Anderson Lizardo @ 2006-03-07 20:22 UTC (permalink / raw)
  To: qemu-devel

On 3/6/06, Ulrich Hecht <uli@suse.de> wrote:
> 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.

This patch seems to fix the specific problem I was having. Just
waiting to see it on CVS...

Thanks!
--
Anderson Lizardo
Embedded Linux Lab - 10LE
Nokia Institute of Technology - INdT
Manaus - Brazil

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] qemu regression 0.7.2 -> 0.8.0 (ARM user emulation)
  2006-03-06 14:03 ` Ulrich Hecht
  2006-03-07 20:22   ` Anderson Lizardo
@ 2006-03-11 21:02   ` Paul Brook
  1 sibling, 0 replies; 4+ messages in thread
From: Paul Brook @ 2006-03-11 21:02 UTC (permalink / raw)
  To: qemu-devel

On Monday 06 March 2006 14:03, Ulrich Hecht wrote:
> 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.)
>...
> +        cpsr_write(user_registers,x,~CPSR_M);

This should be CPSR_NZCV. Applied with that change.

Paul

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-03-11 21:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
2006-03-07 20:22   ` Anderson Lizardo
2006-03-11 21:02   ` Paul Brook

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).