Hi,

NMU patch below.

diff -u hercules-2.17.1/debian/changelog hercules-2.17.1/debian/changelog
--- hercules-2.17.1/debian/changelog
+++ hercules-2.17.1/debian/changelog
@@ -1,3 +1,11 @@
+hercules (2.17.1-2.1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Apply patch by Andreas Jochens to fix FTBFS with gcc-4.0
+    (Closes: #289121).
+
+ -- Christoph Berg <[EMAIL PROTECTED]>  Sat, 29 Oct 2005 22:48:58 +0200
+
 hercules (2.17.1-2) unstable; urgency=low
 
   * Update config.{guess,sub} (Closes: #182650) 
only in patch2:
unchanged:
--- hercules-2.17.1.orig/feature.h
+++ hercules-2.17.1/feature.h
@@ -70,6 +70,7 @@
 #undef CR
 #undef GR
 #undef GR_A
+#undef GR_A_COPY
 #undef MONCODE
 #undef TEA
 #undef DXC
@@ -162,6 +163,7 @@
 #define CR(_r) CR_L(_r)
 #define GR(_r) GR_L(_r)
 #define GR_A(_r, _regs) ((_regs)->GR_L((_r)))
+#define GR_A_COPY(source, _r, _regs) ((_regs)->GR_L((_r))) = source
 #define MONCODE MC_L
 #define TEA    EA_L
 #define DXC     tea
@@ -262,6 +264,7 @@
 #define CR(_r) CR_L(_r)
 #define GR(_r) GR_L(_r)
 #define GR_A(_r, _regs) ((_regs)->GR_L((_r)))
+#define GR_A_COPY(source, _r, _regs) ((_regs)->GR_L((_r))) = source
 #define MONCODE MC_L
 #define TEA    EA_L
 #define DXC     tea
@@ -362,6 +365,7 @@
 #define CR(_r) CR_G(_r)
 #define GR(_r) GR_G(_r)
 #define GR_A(_r, _regs) ((_regs)->psw.amode64 ? (_regs)->GR_G((_r)) : 
(_regs)->GR_L((_r)))
+#define GR_A_COPY(source, _r, _regs) if ((_regs)->psw.amode64) 
(_regs)->GR_G((_r)) = source; else (_regs)->GR_L((_r)) = source
 #define MONCODE MC_G
 #define TEA    EA_G
 #define DXC     dataexc
only in patch2:
unchanged:
--- hercules-2.17.1.orig/cckddasd.c
+++ hercules-2.17.1/cckddasd.c
@@ -2501,7 +2501,7 @@
     /* Inactivate the previous entry */
     if (cckd->l2active)
         cckd->l2active->flags &= ~CCKD_CACHE_ACTIVE;
-    cckd->l2active = (void *)cckd->l2 = NULL;
+    cckd->l2active = cckd->l2 = NULL;
     cckd->sfx = cckd->l1x = -1;
 
 cckd_read_l2_retry:
@@ -2638,7 +2638,7 @@
     {
         cckd = dev->cckd_ext;
         cckd->sfx = cckd->l1x = -1;
-        cckd->l2 = (void *)cckd->l2active = NULL;
+        cckd->l2 = cckd->l2active = NULL;
     }
 
     for (i = 0; i < cckdblk.l2cachenbr && cckdblk.l2cache; i++)
only in patch2:
unchanged:
--- hercules-2.17.1.orig/general1.c
+++ hercules-2.17.1/general1.c
@@ -98,7 +98,7 @@
     RX(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load 2 bytes from operand address */
-    (S32)n = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
+    n = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
 
     /* Add signed operands and set condition code */
     regs->psw.cc =
@@ -821,7 +821,7 @@
     j = (r3 & 1) ? (S32)regs->GR_L(r3) : (S32)regs->GR_L(r3+1);
 
     /* Add the increment value to the R1 register */
-    (S32)regs->GR_L(r1) += i;
+    regs->GR_L(r1) = (S32)regs->GR_L(r1) + i;
 
     /* Branch if result compares high */
     if ( (S32)regs->GR_L(r1) > j )
@@ -860,7 +860,7 @@
     j = (r3 & 1) ? (S32)regs->GR_L(r3) : (S32)regs->GR_L(r3+1);
 
     /* Add the increment value to the R1 register */
-    (S32)regs->GR_L(r1) += i;
+    regs->GR_L(r1) = (S32)regs->GR_L(r1) + i;
 
     /* Branch if result compares low or equal */
     if ( (S32)regs->GR_L(r1) <= j )
@@ -1001,7 +1001,7 @@
     j = (r3 & 1) ? (S32)regs->GR_L(r3) : (S32)regs->GR_L(r3+1);
 
     /* Add the increment value to the R1 register */
-    (S32)regs->GR_L(r1) += i;
+    regs->GR_L(r1) = (S32)regs->GR_L(r1) + i;
 
     /* Branch if result compares high */
     if ( (S32)regs->GR_L(r1) > j )
@@ -1042,7 +1042,7 @@
     j = (r3 & 1) ? (S32)regs->GR_L(r3) : (S32)regs->GR_L(r3+1);
 
     /* Add the increment value to the R1 register */
-    (S32)regs->GR_L(r1) += i;
+    regs->GR_L(r1) = (S32)regs->GR_L(r1) + i;
 
     /* Branch if result compares low or equal */
     if ( (S32)regs->GR_L(r1) <= j )
@@ -1138,8 +1138,8 @@
     regs->GR_L(r1) = dreg;
 
     /* Update the operand address and length registers */
-    GR_A(r2, regs) = addr2;
-    GR_A(r2+1, regs) = len;
+    GR_A_COPY(addr2, r2, regs);
+    GR_A_COPY(len, r2+1, regs);
 
     /* Set condition code 0 or 3 */
     regs->psw.cc = cc;
@@ -1414,7 +1414,7 @@
     RX(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load rightmost 2 bytes of comparand from operand address */
-    (S32)n = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
+    n = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
 
     /* Compare signed operands and set condition code */
     regs->psw.cc =
@@ -1641,8 +1641,8 @@
         /* Update Regs if cross half page - may get access rupt */
         if ((addr1 & 0x7ff) == 0 || (addr2 & 0x7ff) == 0)
         {
-            GR_A(r1, regs) = addr1;
-            GR_A(r2, regs) = addr2;
+            GR_A_COPY(addr1, r1, regs);
+            GR_A_COPY(addr2, r2, regs);
 
             regs->GR_LA24(r1+1) = len1;
             regs->GR_LA24(r2+1) = len2;
@@ -1663,8 +1663,8 @@
     } /* end while(len1||len2) */
 
     /* Update the registers */
-    GR_A(r1, regs) = addr1;
-    GR_A(r2, regs) = addr2;
+    GR_A_COPY(addr1, r1, regs);
+    GR_A_COPY(addr2, r2, regs);
 
     regs->GR_LA24(r1+1) = len1;
     regs->GR_LA24(r2+1) = len2;
@@ -1745,10 +1745,10 @@
     } /* end for(i) */
 
     /* Update the registers */
-    GR_A(r1, regs) = addr1;
-    GR_A(r1+1, regs) = len1;
-    GR_A(r3, regs) = addr2;
-    GR_A(r3+1, regs) = len2;
+    GR_A_COPY(addr1, r1, regs);
+    GR_A_COPY(len1, r1+1, regs);
+    GR_A_COPY(addr2, r3, regs);
+    GR_A_COPY(len2, r3+1, regs);
 
     regs->psw.cc = cc;
 
@@ -1827,8 +1827,8 @@
     } /* end for(i) */
 
     /* Set R1 and R2 to point to current character of each operand */
-    GR_A(r1, regs) = addr1;
-    GR_A(r2, regs) = addr2;
+    GR_A_COPY(addr1, r1, regs) = addr1;
+    GR_A_COPY(addr2, r2, regs) = addr2;
 
     /* Set condition code */
     regs->psw.cc =  cc;
@@ -1873,8 +1873,8 @@
     addr2 = regs->GR(r2) & ADDRESS_MAXWRAP(regs);
 
     /* update regs so unused bits zeroed */
-    GR_A(r1, regs) = addr1;
-    GR_A(r2, regs) = addr2;
+    GR_A_COPY(addr1, r1, regs);
+    GR_A_COPY(addr2, r2, regs);
 
     /* Load signed operand lengths from R1+1 and R2+1 */
     len1 =
@@ -1986,12 +1986,12 @@
         if ((addr1 & 0x7FF) == 0 || (addr2 & 0x7FF) == 0)
             {
                 /* Update R1 and R2 to point to next bytes to compare */
-                GR_A(r1, regs) = addr1;
-                GR_A(r2, regs) = addr2;
+                GR_A_COPY(addr1, r1, regs);
+                GR_A_COPY(addr2, r2, regs);
 
                 /* Set R1+1 and R2+1 to remaining operand lengths */
-                GR_A(r1+1, regs) = len1;
-                GR_A(r2+1, regs) = len2;
+                GR_A_COPY(len1, r1+1, regs);
+                GR_A_COPY(len2, r2+1, regs);
             }
 
         /* If equal byte count has reached substring length
@@ -2008,23 +2008,23 @@
     if (cc < 2)
     {
         /* Update R1 and R2 to point to the equal substring */
-        GR_A(r1, regs) = eqaddr1;
-        GR_A(r2, regs) = eqaddr2;
+        GR_A_COPY(eqaddr1, r1, regs);
+        GR_A_COPY(eqaddr2, r2, regs);
 
         /* Set R1+1 and R2+1 to length remaining in each
            operand after the start of the substring */
-        GR_A(r1+1, regs) = remlen1;
-        GR_A(r2+1, regs) = remlen2;
+        GR_A_COPY(remlen1, r1+1, regs);
+        GR_A_COPY(remlen2, r2+1, regs);
     }
     else
     {
         /* Update R1 and R2 to point to next bytes to compare */
-        GR_A(r1, regs) = addr1;
-        GR_A(r2, regs) = addr2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(addr2, r2, regs);
 
         /* Set R1+1 and R2+1 to remaining operand lengths */
-        GR_A(r1+1, regs) = len1;
-        GR_A(r2+1, regs) = len2;
+        GR_A_COPY(len1, r1+1, regs);
+        GR_A_COPY(len2, r2+1, regs);
     }
 
     /* Set condition code */
@@ -2149,10 +2149,10 @@
         len2 = nlen2;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1+1, regs) = len1;
-        GR_A(r2, regs) = addr2;
-        GR_A(r2+1, regs) = len2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len1, r1+1, regs);
+        GR_A_COPY(addr2, r2, regs);
+        GR_A_COPY(len2, r2+1, regs);
 
         if (len1 == 0)
             cc = 1;
@@ -2310,10 +2310,10 @@
         len2 -= n + 1;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1+1, regs) = len1;
-        GR_A(r2, regs) = addr2;
-        GR_A(r2+1, regs) = len2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len1, r1+1, regs);
+        GR_A_COPY(addr2, r2, regs);
+        GR_A_COPY(len2, r2+1, regs);
 
         if (len1 == 0)
             cc = 1;
@@ -2398,7 +2398,7 @@
     /* Result is negative if sign is X'B' or X'D' */
     if (d == 0x0B || d == 0x0D)
     {
-        (S64)dreg = -((S64)dreg);
+        dreg = -((S64)dreg);
     }
 
     /* Store low-order 32 bits of result into R1 register */
@@ -2928,7 +2928,7 @@
     RX(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load operand address into register */
-    GR_A(r1, regs) = effective_addr2;
+    GR_A_COPY(effective_addr2, r1, regs);
 }
 
 
@@ -2945,7 +2945,7 @@
     RX(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load operand address into register */
-    GR_A(r1, regs) = effective_addr2;
+    GR_A_COPY(effective_addr2, r1, regs);
 
     /* Load corresponding value into access register */
     if ( PRIMARY_SPACE_MODE(&(regs->psw)) )
@@ -2999,7 +2999,7 @@
     }
 
     /* Load complement of second operand and set condition code */
-    (S32)regs->GR_L(r1) = -((S32)regs->GR_L(r2));
+    regs->GR_L(r1) = -((S32)regs->GR_L(r2));
 
     regs->psw.cc = (S32)regs->GR_L(r1) < 0 ? 1 :
                    (S32)regs->GR_L(r1) > 0 ? 2 : 0;
@@ -3018,7 +3018,7 @@
     RX(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load rightmost 2 bytes of register from operand address */
-    (S32)regs->GR_L(r1) = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
+    regs->GR_L(r1) = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
 }
 
 
@@ -3035,7 +3035,7 @@
     RI(inst, execflag, regs, r1, opcd, i2);
 
     /* Load operand into register */
-    (S32)regs->GR_L(r1) = (S16)i2;
+    regs->GR_L(r1) = (S16)i2;
 
 }
 #endif /*defined(FEATURE_IMMEDIATE_AND_RELATIVE)*/
@@ -3085,7 +3085,7 @@
     RR(inst, execflag, regs, r1, r2);
 
     /* Load negative value of second operand and set cc */
-    (S32)regs->GR_L(r1) = (S32)regs->GR_L(r2) > 0 ?
+    regs->GR_L(r1) = (S32)regs->GR_L(r2) > 0 ?
                             -((S32)regs->GR_L(r2)) :
                             (S32)regs->GR_L(r2);
 
@@ -3113,7 +3113,7 @@
     }
 
     /* Load positive value of second operand and set cc */
-    (S32)regs->GR_L(r1) = (S32)regs->GR_L(r2) < 0 ?
+    regs->GR_L(r1) = (S32)regs->GR_L(r2) < 0 ?
                             -((S32)regs->GR_L(r2)) :
                             (S32)regs->GR_L(r2);
 
@@ -3280,8 +3280,8 @@
           || (n <= addr2
                 && (addr1 > addr2 || addr1 <= n)))
         {
-            GR_A(r1, regs) = addr1;
-            GR_A(r2, regs) = addr2;
+            GR_A_COPY(addr1, r1, regs);
+            GR_A_COPY(addr2, r2, regs);
             regs->psw.cc =  3;
 #if 0
             logmsg (_("MVCL destructive overlap: "));
@@ -3325,7 +3325,7 @@
             addr1 &= ADDRESS_MAXWRAP(regs);
 
             /* Update the registers */
-            GR_A(r1, regs) = addr1;
+            GR_A_COPY(addr1, r1, regs);
             regs->GR_LA24(r1+1) = len1;
 
             /* The instruction can be interrupted when a CPU determined
@@ -3368,8 +3368,8 @@
 #endif /*defined(FEATURE_PER)*/
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1 + len1;
-        GR_A(r2, regs) = addr2 + len2;
+        GR_A_COPY(addr1 + len1, r1, regs);
+        GR_A_COPY(addr2 + len2, r2, regs);
         regs->GR_LA24(r1+1) = 0;
         regs->GR_LA24(r2+1) = 0;
         regs->psw.cc = cc;
@@ -3405,8 +3405,8 @@
         len2 -= 256;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r2, regs) = addr2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(addr2, r2, regs);
         regs->GR_LA24(r1+1) = len1;
         regs->GR_LA24(r2+1) = len2;
 
@@ -3448,8 +3448,8 @@
         len1--;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r2, regs) = addr2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(addr2, r2, regs);
         regs->GR_LA24(r1+1) = len1;
         regs->GR_LA24(r2+1) = len2;
 
@@ -3543,10 +3543,10 @@
         len1--;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1+1, regs) = len1;
-        GR_A(r3, regs) = addr2;
-        GR_A(r3+1, regs) = len2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len1, r1+1, regs);
+        GR_A_COPY(addr2, r3, regs);
+        GR_A_COPY(len2, r3+1, regs);
 
     } /* end for(i) */
 
@@ -3679,7 +3679,7 @@
         if (sbyte == termchar)
         {
             /* Set r1 to point to terminating character */
-            GR_A(r1, regs) = addr1;
+            GR_A_COPY(addr1, r1, regs);
 
             /* Set condition code 1 */
             regs->psw.cc = 1;
@@ -3695,8 +3695,8 @@
     } /* end for(i) */
 
     /* Set R1 and R2 to point to next character of each operand */
-    GR_A(r1, regs) = addr1;
-    GR_A(r2, regs) = addr2;
+    GR_A_COPY(addr1, r1, regs);
+    GR_A_COPY(addr2, r2, regs);
 
     /* Set condition code 3 */
     regs->psw.cc = 3;
@@ -3904,7 +3904,7 @@
     RX(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load 2 bytes from operand address */
-    (S32)n = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
+    n = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
 
     /* Multiply R1 register by n, ignore leftmost 32 bits of
        result, and place rightmost 32 bits in R1 register */
@@ -3926,7 +3926,7 @@
     RI(inst, execflag, regs, r1, opcd, i2);
 
     /* Multiply register by operand ignoring overflow  */
-    (S32)regs->GR_L(r1) *= (S16)i2;
+    regs->GR_L(r1) = (S32)regs->GR_L(r1) * (S16)i2;
 
 } /* end DEF_INST(multiply_halfword_immediate) */
 
@@ -3941,7 +3941,7 @@
     RRE(inst, execflag, regs, r1, r2);
 
     /* Multiply signed registers ignoring overflow */
-    (S32)regs->GR_L(r1) *= (S32)regs->GR_L(r2);
+    regs->GR_L(r1) = (S32)regs->GR_L(r1) * (S32)regs->GR_L(r2);
 
 } /* end DEF_INST(multiply_single_register) */
 
@@ -3962,7 +3962,7 @@
     n = ARCH_DEP(vfetch4) ( effective_addr2, b2, regs );
 
     /* Multiply signed operands ignoring overflow */
-    (S32)regs->GR_L(r1) *= (S32)n;
+    regs->GR_L(r1) = (S32)regs->GR_L(r1) * (S32)n;
 
 } /* end DEF_INST(multiply_single) */
 #endif /*defined(FEATURE_IMMEDIATE_AND_RELATIVE)*/
only in patch2:
unchanged:
--- hercules-2.17.1.orig/general2.c
+++ hercules-2.17.1/general2.c
@@ -473,7 +473,7 @@
            code 1 and load the address of the character into R1 */
         if (sbyte == termchar)
         {
-            GR_A(r1, regs) = addr2;
+            GR_A_COPY(addr2, r1, regs);
             regs->psw.cc = 1;
             return;
         }
@@ -485,7 +485,7 @@
     } /* end for(i) */
 
     /* Set R2 to point to next character of operand */
-    GR_A(r2, regs) = addr2;
+    GR_A_COPY(addr2, r2, regs);
 
     /* Return condition code 3 */
     regs->psw.cc = 3;
@@ -757,7 +757,7 @@
     n = effective_addr2 & 0x3F;
 
     /* Shift the signed value of the R1 register */
-    (S32)regs->GR_L(r1) = n > 30 ?
+    regs->GR_L(r1) = n > 30 ?
                     ((S32)regs->GR_L(r1) < 0 ? -1 : 0) :
                     (S32)regs->GR_L(r1) >> n;
 
@@ -1122,7 +1122,7 @@
     RX(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load 2 bytes from operand address */
-    (S32)n = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
+    n = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
 
     /* Subtract signed operands and set condition code */
     regs->psw.cc =
@@ -1600,8 +1600,8 @@
         len1--;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1+1, regs) = len1;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len1, r1+1, regs);
 
     } /* end for(i) */
 
only in patch2:
unchanged:
--- hercules-2.17.1.orig/control.c
+++ hercules-2.17.1/control.c
@@ -5746,7 +5746,7 @@
     PERFORM_SERIALIZATION (regs);
 
     /* Clear general register 0 */
-    GR_A(0, regs) = 0;
+    GR_A_COPY(0, 0, regs);
 
 }
 #endif /*defined(FEATURE_TEST_BLOCK)*/
only in patch2:
unchanged:
--- hercules-2.17.1.orig/service.c
+++ hercules-2.17.1/service.c
@@ -1194,7 +1194,7 @@
                     }
                 }
                 mcd_len -= obj_len;
-                (BYTE*)obj_hdr += obj_len;
+                obj_hdr = (BYTE*)obj_hdr + obj_len;
             }
     
             /* Indicate Event Processed */
only in patch2:
unchanged:
--- hercules-2.17.1.orig/cmpsc.c
+++ hercules-2.17.1/cmpsc.c
@@ -224,8 +224,8 @@
 #if !defined(ADJUSTREGS)
 #define ADJUSTREGS(r, regs, iregs, len) \
 {\
-  GR_A((r), (iregs)) = (GR_A((r), (iregs)) + (len)) & ADDRESS_MAXWRAP((regs));\
-  GR_A((r) + 1, (iregs)) -= (len);\
+  GR_A_COPY((GR_A((r), (iregs)) + (len)) & ADDRESS_MAXWRAP((regs)), (r), 
(iregs));\
+  GR_A_COPY(GR_A((r) + 1, (iregs)) - (len), (r) + 1, (iregs));\
 }
 #endif /* !defined(ADJUSTREGS) */
 
@@ -238,11 +238,11 @@
 #if !defined(COMMITREGS)
 #define COMMITREGS(regs, iregs, r1, r2) \
 {\
-  GR_A(1, (regs)) = GR_A(1, (iregs));\
-  GR_A((r1), (regs)) = GR_A((r1), (iregs));\
-  GR_A((r1) + 1, (regs)) = GR_A((r1) + 1, (iregs));\
-  GR_A((r2), (regs)) = GR_A((r2), (iregs));\
-  GR_A((r2) + 1, (regs)) = GR_A((r2) + 1, (iregs));\
+  GR_A_COPY(GR_A(1, (iregs)), 1, (regs));\
+  GR_A_COPY(GR_A((r1), (iregs)), (r1), (regs));\
+  GR_A_COPY(GR_A((r1) + 1, (iregs)), (r1) + 1, (regs));\
+  GR_A_COPY(GR_A((r2), (iregs)), (r2), (regs));\
+  GR_A_COPY(GR_A((r2) + 1, (iregs)), (r2) + 1, (regs));\
 }
 #endif /* !defined(COMMITREGS) */
 
only in patch2:
unchanged:
--- hercules-2.17.1.orig/sie.c
+++ hercules-2.17.1/sie.c
@@ -125,7 +125,7 @@
     ARCH_DEP(program_interrupt) (regs, PGM_ADDRESSING_EXCEPTION);
 
     /* Direct pointer to state descriptor block */
-    STATEBK = (void*)(regs->mainstor + effective_addr2);
+    GUESTREGS->siebk = (void*)(regs->mainstor + effective_addr2);
 
     obtain_lock(&sysblk.intlock);
 
only in patch2:
unchanged:
--- hercules-2.17.1.orig/timer.c
+++ hercules-2.17.1/timer.c
@@ -140,7 +140,7 @@
          * [2] Decrement the CPU timer for each CPU  *
          *-------------------------------------------*/
 
-        (S64)regs->ptimer -= (S64)sysblk.todclock_diff << 8;
+        regs->ptimer = (S64)regs->ptimer - (S64)sysblk.todclock_diff << 8;
 
         /* Set interrupt flag if the CPU timer is negative */
         if ((S64)regs->ptimer < 0)
@@ -159,7 +159,7 @@
         if(regs->sie_active)
         {
             /* Decrement the guest CPU timer */
-            (S64)regs->guestregs->ptimer -= (S64)sysblk.todclock_diff << 8;
+            regs->guestregs->ptimer = (S64)regs->guestregs->ptimer - 
(S64)sysblk.todclock_diff << 8;
 
             /* Set interrupt flag if the CPU timer is negative */
             if ((S64)regs->guestregs->ptimer < 0)
only in patch2:
unchanged:
--- hercules-2.17.1.orig/esame.c
+++ hercules-2.17.1/esame.c
@@ -652,7 +652,7 @@
     {
         if( (S64)dreg == -1LL )
             ovf = 1;
-        (S64)dreg = -((S64)dreg);
+        dreg = -((S64)dreg);
     }
 
     /* Store result into R1 register */
@@ -1531,8 +1531,8 @@
 
     RIL(inst, execflag, regs, r1, opcd, i2);
 
-    GR_A(r1, regs) = ((!execflag ? (regs->psw.IA - 6) : regs->ET)
-                               + 2LL*(S32)i2) & ADDRESS_MAXWRAP(regs);
+    GR_A_COPY(((!execflag ? (regs->psw.IA - 6) : regs->ET)
+                               + 2LL*(S32)i2) & ADDRESS_MAXWRAP(regs), r1, 
regs);
 
 } /* end DEF_INST(load_address_relative_long) */
 #endif /*defined(FEATURE_ESAME_N3_ESA390) || defined(FEATURE_ESAME)*/
@@ -2119,7 +2119,7 @@
     j = (r3 & 1) ? (S64)regs->GR_G(r3) : (S64)regs->GR_G(r3+1);
 
     /* Add the increment value to the R1 register */
-    (S64)regs->GR_G(r1) += i;
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) + i;
 
     /* Branch if result compares high */
     if ( (S64)regs->GR_G(r1) > j )
@@ -2160,7 +2160,7 @@
     j = (r3 & 1) ? (S64)regs->GR_G(r3) : (S64)regs->GR_G(r3+1);
 
     /* Add the increment value to the R1 register */
-    (S64)regs->GR_G(r1) += i;
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) + i;
 
     /* Branch if result compares low or equal */
     if ( (S64)regs->GR_G(r1) <= j )
@@ -2202,7 +2202,7 @@
     j = (r3 & 1) ? (S64)regs->GR_G(r3) : (S64)regs->GR_G(r3+1);
 
     /* Add the increment value to the R1 register */
-    (S64)regs->GR_G(r1) += i;
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) + i;
 
     /* Branch if result compares high */
     if ( (S64)regs->GR_G(r1) > j )
@@ -2243,7 +2243,7 @@
     j = (r3 & 1) ? (S64)regs->GR_G(r3) : (S64)regs->GR_G(r3+1);
 
     /* Add the increment value to the R1 register */
-    (S64)regs->GR_G(r1) += i;
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) + i;
 
     /* Branch if result compares low or equal */
     if ( (S64)regs->GR_G(r1) <= j )
@@ -2859,7 +2859,7 @@
     }
 
     /* Load positive value of second operand and set cc */
-    (S64)regs->GR_G(r1) = (S64)regs->GR_G(r2) < 0 ?
+    regs->GR_G(r1) = (S64)regs->GR_G(r2) < 0 ?
                             -((S64)regs->GR_G(r2)) :
                             (S64)regs->GR_G(r2);
 
@@ -2883,7 +2883,7 @@
     gpr2l = (S32)regs->GR_L(r2);
 
     /* Load positive value of second operand and set cc */
-    (S64)regs->GR_G(r1) = gpr2l < 0 ? -gpr2l : gpr2l;
+    regs->GR_G(r1) = gpr2l < 0 ? -gpr2l : gpr2l;
 
     regs->psw.cc = (S64)regs->GR_G(r1) == 0 ? 0 : 2;
 
@@ -2902,7 +2902,7 @@
     RRE(inst, execflag, regs, r1, r2);
 
     /* Load negative value of second operand and set cc */
-    (S64)regs->GR_G(r1) = (S64)regs->GR_G(r2) > 0 ?
+    regs->GR_G(r1) = (S64)regs->GR_G(r2) > 0 ?
                             -((S64)regs->GR_G(r2)) :
                             (S64)regs->GR_G(r2);
 
@@ -2926,7 +2926,7 @@
     gpr2l = (S32)regs->GR_L(r2);
 
     /* Load negative value of second operand and set cc */
-    (S64)regs->GR_G(r1) = gpr2l > 0 ? -gpr2l : gpr2l;
+    regs->GR_G(r1) = gpr2l > 0 ? -gpr2l : gpr2l;
 
     regs->psw.cc = (S64)regs->GR_G(r1) == 0 ? 0 : 1;
 
@@ -2965,7 +2965,7 @@
     RRE(inst, execflag, regs, r1, r2);
 
     /* Copy second operand and set condition code */
-    (S64)regs->GR_G(r1) = (S32)regs->GR_L(r2);
+    regs->GR_G(r1) = (S32)regs->GR_L(r2);
 
     regs->psw.cc = (S64)regs->GR_G(r1) < 0 ? 1 :
                    (S64)regs->GR_G(r1) > 0 ? 2 : 0;
@@ -2995,7 +2995,7 @@
     }
 
     /* Load complement of second operand and set condition code */
-    (S64)regs->GR_G(r1) = -((S64)regs->GR_G(r2));
+    regs->GR_G(r1) = -((S64)regs->GR_G(r2));
 
     regs->psw.cc = (S64)regs->GR_G(r1) < 0 ? 1 :
                    (S64)regs->GR_G(r1) > 0 ? 2 : 0;
@@ -3018,7 +3018,7 @@
     gpr2l = (S32)regs->GR_L(r2);
 
     /* Load complement of second operand and set condition code */
-    (S64)regs->GR_G(r1) = -gpr2l;
+    regs->GR_G(r1) = -gpr2l;
 
     regs->psw.cc = (S64)regs->GR_G(r1) < 0 ? 1 :
                    (S64)regs->GR_G(r1) > 0 ? 2 : 0;
@@ -3383,7 +3383,7 @@
     n = effective_addr2 & 0x3F;
 
     /* Copy and shift the signed value of the R3 register */
-    (S64)regs->GR_G(r1) = (n > 62) ?
+    regs->GR_G(r1) = (n > 62) ?
                     ((S64)regs->GR_G(r3) < 0 ? -1LL : 0) :
                     (S64)regs->GR_G(r3) >> n;
 
@@ -3412,7 +3412,7 @@
     n = ARCH_DEP(vfetch4) ( effective_addr2, b2, regs );
 
     /* Multiply signed operands ignoring overflow */
-    (S64)regs->GR_G(r1) *= (S32)n;
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) * (S32)n;
 
 } /* end DEF_INST(multiply_single_long_fullword) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -3435,7 +3435,7 @@
     n = ARCH_DEP(vfetch8) ( effective_addr2, b2, regs );
 
     /* Multiply signed operands ignoring overflow */
-    (S64)regs->GR_G(r1) *= (S64)n;
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) * (S64)n;
 
 } /* end DEF_INST(multiply_single_long) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -3452,7 +3452,7 @@
     RRE(inst, execflag, regs, r1, r2);
 
     /* Multiply signed registers ignoring overflow */
-    (S64)regs->GR_G(r1) *= (S32)regs->GR_L(r2);
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) * (S32)regs->GR_L(r2);
 
 } /* end DEF_INST(multiply_single_long_fullword_register) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -3469,7 +3469,7 @@
     RRE(inst, execflag, regs, r1, r2);
 
     /* Multiply signed registers ignoring overflow */
-    (S64)regs->GR_G(r1) *= (S64)regs->GR_G(r2);
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) * (S64)regs->GR_G(r2);
 
 } /* end DEF_INST(multiply_single_long_register) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -3488,7 +3488,7 @@
     RI(inst, execflag, regs, r1, opcd, i2);
 
     /* Load operand into register */
-    (S64)regs->GR_G(r1) = (S16)i2;
+    regs->GR_G(r1) = (S16)i2;
 
 } /* end DEF_INST(load_long_halfword_immediate) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -3532,7 +3532,7 @@
     RI(inst, execflag, regs, r1, opcd, i2);
 
     /* Multiply register by operand ignoring overflow  */
-    (S64)regs->GR_G(r1) *= (S16)i2;
+    regs->GR_G(r1) = (S64)regs->GR_G(r1) * (S16)i2;
 
 } /* end DEF_INST(multiply_long_halfword_immediate) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -3724,7 +3724,7 @@
     RRE(inst, execflag, regs, r1, r2);
 
     /* Copy second operand to first operand */
-    (S64)regs->GR_G(r1) = (S32)regs->GR_L(r2);
+    regs->GR_G(r1) = (S32)regs->GR_L(r2);
 
 } /* end DEF_INST(load_long_fullword_register) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -4356,7 +4356,7 @@
     RXE(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load R1 register from second operand */
-    (S64)regs->GR_G(r1) = (S32)ARCH_DEP(vfetch4) ( effective_addr2, b2, regs );
+    regs->GR_G(r1) = (S32)ARCH_DEP(vfetch4) ( effective_addr2, b2, regs );
 
 } /* end DEF_INST(load_long_fullword) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -4375,7 +4375,7 @@
     RXE(inst, execflag, regs, r1, b2, effective_addr2);
 
     /* Load R1 register from second operand */
-    (S64)regs->GR_G(r1) = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
+    regs->GR_G(r1) = (S16)ARCH_DEP(vfetch2) ( effective_addr2, b2, regs );
 
 } /* end DEF_INST(load_long_halfword) */
 #endif /*defined(FEATURE_ESAME)*/
@@ -4958,9 +4958,9 @@
         len--;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1 + 1, regs) = len;
-        GR_A(r2, regs) = addr2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len, r1 + 1, regs);
+        GR_A_COPY(addr2, r2, regs);
 
         /* Set cc0 when all values have been processed */
         regs->psw.cc = len ? 3 : 0;
@@ -5030,9 +5030,9 @@
         len--;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1 + 1, regs) = len;
-        GR_A(r2, regs) = addr2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len, r1 + 1, regs);
+        GR_A_COPY(addr2, r2, regs);
 
         /* Set cc0 when all values have been processed */
         regs->psw.cc = len ? 3 : 0;
@@ -5104,9 +5104,9 @@
         len -= 2;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1 + 1, regs) = len;
-        GR_A(r2, regs) = addr2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len, r1 + 1, regs);
+        GR_A_COPY(addr2, r2, regs);
 
         /* Set cc0 when all values have been processed */
         regs->psw.cc = len ? 3 : 0;
@@ -5177,9 +5177,9 @@
         len -= 2;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1 + 1, regs) = len;
-        GR_A(r2, regs) = addr2;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len, r1 + 1, regs);
+        GR_A_COPY(addr2, r2, regs);
 
         /* Set cc0 when all values have been processed */
         regs->psw.cc = len ? 3 : 0;
@@ -5265,10 +5265,10 @@
         len1 -= 2;
 
         /* Update the registers */
-        GR_A(r1, regs) = addr1;
-        GR_A(r1 + 1, regs) = len1;
-        GR_A(r3, regs) = addr3;
-        GR_A(r3 + 1, regs) = len3;
+        GR_A_COPY(addr1, r1, regs);
+        GR_A_COPY(len1, r1 + 1, regs);
+        GR_A_COPY(addr3, r3, regs);
+        GR_A_COPY(len3, r3 + 1, regs);
 
     } /* end for(i) */
 
@@ -5358,10 +5358,10 @@
     } /* end for(i) */
 
     /* Update the registers */
-    GR_A(r1, regs) = addr1;
-    GR_A(r1 + 1, regs) = len1;
-    GR_A(r3, regs) = addr3;
-    GR_A(r3 + 1, regs) = len3;
+    GR_A_COPY(addr1, r1, regs);
+    GR_A_COPY(len1, r1 + 1, regs);
+    GR_A_COPY(addr3, r3, regs);
+    GR_A_COPY(len3, r3 + 1, regs);
 
     regs->psw.cc = cc;
 

Christoph
-- 
[EMAIL PROTECTED] | http://www.df7cb.de/

Attachment: signature.asc
Description: Digital signature

Reply via email to