Explicitly truncate the second operand of do_div() to 32 bits to guard
against bogus code calling it with a 64-bit divisor.

Based on commit ea077b1b96e073eac5c3c5590529e964767fc5f7 ("m68k: Truncate
base in do_div()")

While it doesn't really hurt on little-endian mn10300, unlike on m68k,
mn10300 was the only remaining architecture not doing this.

Signed-off-by: Geert Uytterhoeven <ge...@linux-m68k.org>
---
Compile-tested only.

 arch/mn10300/include/asm/div64.h |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/arch/mn10300/include/asm/div64.h b/arch/mn10300/include/asm/div64.h
index 503efab..ff69f34 100644
--- a/arch/mn10300/include/asm/div64.h
+++ b/arch/mn10300/include/asm/div64.h
@@ -36,12 +36,13 @@ extern void ____unhandled_size_in_do_div___(void);
 #define do_div(n, base)                                                        
\
 ({                                                                     \
        unsigned __rem = 0;                                             \
+       unsigned __base = (base);                                       \
        if (sizeof(n) <= 4) {                                           \
                asm("mov        %1,mdr  \n"                             \
                    "divu       %2,%0   \n"                             \
                    "mov        mdr,%1  \n"                             \
                    : "+r"(n), "=d"(__rem)                              \
-                   : "r"(base), "1"(__rem)                             \
+                   : "r"(__base), "1"(__rem)                           \
                    : CLOBBER_MDR_CC                                    \
                    );                                                  \
        } else if (sizeof(n) <= 8) {                                    \
@@ -52,14 +53,14 @@ extern void ____unhandled_size_in_do_div___(void);
                __quot.l = n;                                           \
                asm("mov        %0,mdr  \n"     /* MDR = 0 */           \
                    "divu       %3,%1   \n"                             \
-                   /* __quot.MSL = __div.MSL / base, */                \
-                   /* MDR = MDR:__div.MSL % base */                    \
+                   /* __quot.MSL = __div.MSL / __base, */              \
+                   /* MDR = MDR:__div.MSL % __base */                  \
                    "divu       %3,%2   \n"                             \
-                   /* __quot.LSL = MDR:__div.LSL / base, */            \
-                   /* MDR = MDR:__div.LSL % base */                    \
+                   /* __quot.LSL = MDR:__div.LSL / __base, */          \
+                   /* MDR = MDR:__div.LSL % __base */                  \
                    "mov        mdr,%0  \n"                             \
                    : "=d"(__rem), "=r"(__quot.w[1]), "=r"(__quot.w[0]) \
-                   : "r"(base), "0"(__rem), "1"(__quot.w[1]),          \
+                   : "r"(__base), "0"(__rem), "1"(__quot.w[1]),        \
                      "2"(__quot.w[0])                                  \
                    : CLOBBER_MDR_CC                                    \
                    );                                                  \
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to