All of lore.kernel.org
 help / color / mirror / Atom feed
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"

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.