Skip to contentSkip to conversation

sparc : 32bits integer division overflow

PATCH In review Olivier Danet 5 participants 9 messages Mar 21, 2014 – Mar 26, 2014

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 sparc : 32bits integer division overflow

The signed integer division -0x8000_0000_0000_0000 / -1 must be handled separately to avoid an overflow on the QEMU host.

Negative overflow must be a negative number for correct sign extension in Sparc64 mode. Use <stdint.h> constants.

---
 target-sparc/helper.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
target-sparc/helper.c +10 -7
index f3c7fbf..ae7740b 100644
@@ -85,8 +85,8 @@ static target_ulong helper_udiv_common(CPUSPARCState *env, target_ulong a,
     }
 
     x0 = x0 / x1;
-    if (x0 > 0xffffffff) {
-        x0 = 0xffffffff;
+    if (x0 > UINT32_MAX) {
+        x0 = UINT32_MAX;
         overflow = 1;
     }
 
@@ -122,12 +122,15 @@ static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a,
     if (x1 == 0) {
         cpu_restore_state(CPU(cpu), GETPC());
         helper_raise_exception(env, TT_DIV_ZERO);
-    }
-
-    x0 = x0 / x1;
-    if ((int32_t) x0 != x0) {
-        x0 = x0 < 0 ? 0x80000000 : 0x7fffffff;
+    } else if (x1 == -1 && x0 == INT64_MIN) {
+        x0 = INT32_MAX;
         overflow = 1;
+    } else {
+        x0 = x0 / x1;
+        if ((int32_t) x0 != x0) {
+            x0 = x0 < 0 ? INT32_MIN : INT32_MAX;
+            overflow = 1;
+        }
     }
 
     if (cc) {
Signature · 1 line
1.8.1.5
#1 lore raw
Quoted 37 lines · Olivier Danet

The signed integer division -0x8000_0000_0000_0000 / -1 must be handled separately to avoid an overflow on the QEMU host.

Negative overflow must be a negative number for correct sign extension in Sparc64 mode. Use<stdint.h> constants.

---
  target-sparc/helper.c | 17 ++++++++++-------
  1 file changed, 10 insertions(+), 7 deletions(-)
target-sparc/helper.c +4 -7
index f3c7fbf..ae7740b 100644
@@ -85,8 +85,8 @@ static target_ulong helper_udiv_common(CPUSPARCState *env, target_ulong a,
      }
 
      x0 = x0 / x1;
-    if (x0>  0xffffffff) {
-        x0 = 0xffffffff;
+    if (x0>  UINT32_MAX) {
+        x0 = UINT32_MAX;
          overflow = 1;
      }
 
@@ -122,12 +122,15 @@ static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a,
      if (x1 == 0) {
          cpu_restore_state(CPU(cpu), GETPC());
          helper_raise_exception(env, TT_DIV_ZERO);
-    }
-
-    x0 = x0 / x1;
-    if ((int32_t) x0 != x0) {
-        x0 = x0<  0 ? 0x80000000 : 0x7fffffff;
+    } else if (x1 == -1&&  x0 == INT64_MIN) {
+        x0 = INT32_MAX;

target-sparc/helper.c static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a, · line 136

Quoted 10 lines
target-sparc/helper.c +6 -0
          overflow = 1;
+    } else {
+        x0 = x0 / x1;
+        if ((int32_t) x0 != x0) {
+            x0 = x0<  0 ? INT32_MIN : INT32_MAX;
+            overflow = 1;
+        }
      }
 
      if (cc) {

Hi Olivier,

This basic patch looks good to me. My only comment is that I suspect for bisection purposes it may be better to split this into 2 patches - one to perform the conversion of all existing constants to INT*_MAX and INT*_MIN, and then a second to add your change to prevent the crash. I'll let Richard have the final say though.

Having said that, I will definitely give it a test over the next couple of days when I get a moment.

ATB,

Mark.

#2 lore raw
Quoted 6 lines · Mark Cave-Ayland

This basic patch looks good to me. My only comment is that I suspect for bisection purposes it may be better to split this into 2 patches - one to perform the conversion of all existing constants to INT*_MAX and INT*_MIN, and then a second to add your change to prevent the crash. I'll let Richard have the final say though.

I think one patch is fine.

r~

Reviewed-by on v3 1/1
#3 lore raw
In reply to Olivier Danet
Quoted 10 lines · Olivier Danet

The signed integer division -0x8000_0000_0000_0000 / -1 must be handled separately to avoid an overflow on the QEMU host.

Negative overflow must be a negative number for correct sign extension in Sparc64 mode. Use <stdint.h> constants.

---
 target-sparc/helper.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

r~

Tested-by on v3 1/1
#4 lore raw
In reply to Olivier Danet
Quoted 37 lines · Olivier Danet

The signed integer division -0x8000_0000_0000_0000 / -1 must be handled separately to avoid an overflow on the QEMU host.

Negative overflow must be a negative number for correct sign extension in Sparc64 mode. Use<stdint.h> constants.

---
  target-sparc/helper.c | 17 ++++++++++-------
  1 file changed, 10 insertions(+), 7 deletions(-)
target-sparc/helper.c +4 -7
index f3c7fbf..ae7740b 100644
@@ -85,8 +85,8 @@ static target_ulong helper_udiv_common(CPUSPARCState *env, target_ulong a,
      }
 
      x0 = x0 / x1;
-    if (x0>  0xffffffff) {
-        x0 = 0xffffffff;
+    if (x0>  UINT32_MAX) {
+        x0 = UINT32_MAX;
          overflow = 1;
      }
 
@@ -122,12 +122,15 @@ static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a,
      if (x1 == 0) {
          cpu_restore_state(CPU(cpu), GETPC());
          helper_raise_exception(env, TT_DIV_ZERO);
-    }
-
-    x0 = x0 / x1;
-    if ((int32_t) x0 != x0) {
-        x0 = x0<  0 ? 0x80000000 : 0x7fffffff;
+    } else if (x1 == -1&&  x0 == INT64_MIN) {
+        x0 = INT32_MAX;

target-sparc/helper.c static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a, · line 136

Quoted 10 lines
target-sparc/helper.c +6 -0
          overflow = 1;
+    } else {
+        x0 = x0 / x1;
+        if ((int32_t) x0 != x0) {
+            x0 = x0<  0 ? INT32_MIN : INT32_MAX;
+            overflow = 1;
+        }
      }
 
      if (cc) {

This patch fixes the original bug report, and doesn't appear to have any ill-effects on my SPARC32/SPARC64 image collection boot tests so:

Peter - given that this prevents a guest from crashing the QEMU host, is it a candidate for 2.0?

ATB,

Mark.

#5 lore raw
Quoted 7 lines · Mark Cave-Ayland

This patch fixes the original bug report, and doesn't appear to have any ill-effects on my SPARC32/SPARC64 image collection boot tests so:

Peter - given that this prevents a guest from crashing the QEMU host, is it a candidate for 2.0?

Yes, I think so -- it's small and self-contained, it fixes a crash bug, and it's been reviewed. If you want to put it in a pull request I'll apply it.

thanks
-- PMM

#6 lore raw

Am 24.03.2014 22:36, schrieb Peter Maydell:

Quoted 12 lines · Mark Cave-Ayland
Quoted 7 lines

This patch fixes the original bug report, and doesn't appear to have any ill-effects on my SPARC32/SPARC64 image collection boot tests so:

Peter - given that this prevents a guest from crashing the QEMU host, is it a candidate for 2.0?

Yes, I think so -- it's small and self-contained, it fixes a crash bug, and it's been reviewed. If you want to put it in a pull request I'll apply it.

Mark, please fix up the subject then. :)

Andreas

Signature · 2 lines
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
#7 lore raw
Quoted 7 lines · Andreas Färber

Am 24.03.2014 22:36, schrieb Peter Maydell:

Quoted 6 lines · Mark Cave-Ayland
Quoted 5 lines

This patch fixes the original bug report, and doesn't appear to have any ill-effects on my SPARC32/SPARC64 image collection boot tests so:

Quoted 8 lines
Quoted 6 lines
Quoted 2 lines

Peter - given that this prevents a guest from crashing the QEMU host, is it a candidate for 2.0?

Yes, I think so -- it's small and self-contained, it fixes a crash bug, and it's been reviewed. If you want to put it in a pull request I'll apply it.

Mark, please fix up the subject then. :)

Hi Andreas,

Do you mean s/sparc/target-sparc/ ? My main observation was that I could also prefix the part after the colon with the word "fix".

ATB,

Mark.

#8 lore raw

Hi Mark,

Am 26.03.2014 16:03, schrieb Mark Cave-Ayland:

Quoted 10 lines · Andreas Färber
Quoted 9 lines

Am 24.03.2014 22:36, schrieb Peter Maydell:

Quoted 7 lines
Quoted 3 lines

Peter - given that this prevents a guest from crashing the QEMU host, is it
a candidate for 2.0?

Yes, I think so -- it's small and self-contained, it fixes a crash bug, and it's been reviewed. If you want to put it in a pull request I'll apply it.

Quoted 6 lines
Quoted 1 line

Mark, please fix up the subject then. :)

Hi Andreas,

Do you mean s/sparc/target-sparc/ ? My main observation was that I could also prefix the part after the colon with the word "fix".

Both, and the space after the topic, i.e. s/sparc :/target-sparc:/.

Cheers,
Andreas

Signature · 2 lines
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg