]> git.proxmox.com Git - grub2.git/commitdiff
Redirect all divisions to grub_divmod64.
authorVladimir Serbinenko <phcoder@gmail.com>
Tue, 12 Nov 2013 23:53:53 +0000 (00:53 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Tue, 12 Nov 2013 23:53:53 +0000 (00:53 +0100)
ChangeLog
configure.ac
grub-core/kern/arm/misc.S
grub-core/kern/misc.c
include/grub/libgcc.h
include/grub/misc.h

index 6f283eb019e6e1eb1ce7b08070d62a2b8a37c0f1..1af3d4b9b6b3a27dc9ce7c1414684ba73d320ecd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-11-12  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Redirect all divisions to grub_divmod64.
+
 2013-11-12  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/term/tparm.c (tparam_internal): Use unsigned divisions.
index a0f17a2dba158216a0f1601d355f157b8a6a1c75..e59937774fef3fa63b2954391f2b31c00d0a2ab9 100644 (file)
@@ -831,7 +831,7 @@ CFLAGS="$TARGET_CFLAGS -Wl,--defsym,abort=main"
 fi
 
 # Check for libgcc symbols
-AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x __udivsi3 __umoddi3 __udivdi3 __divsi3 __modsi3 __umodsi3 __moddi3 __divdi3 __ctzdi2 __ctzsi2)
+AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x __ctzdi2 __ctzsi2)
 
 if test "x$TARGET_APPLE_CC" = x1 ; then
 CFLAGS="$TARGET_CFLAGS -nostdlib"
index 9d4c333b0693d0bfa23548015c2510e5b18cab6d..68e4828fd3650740c9de731ded25a3d2cddd2b10 100644 (file)
 
        .align  2
 
+       .macro division parent
+
+        stmfd   sp!, {lr}
+        sub     sp, sp, #12
+        mov     r2, r1
+        add     r1, sp, #4
+        str     r1, [sp, #0]
+        mov     r1, #0
+        mov     r3, #0
+        bl      \parent
+       ldr     r1, [sp, #4]
+        add     sp, sp, #12
+        ldmfd   sp!, {lr}
+        bx      lr
+       .endm
+
+FUNCTION(__aeabi_uidivmod)
+       division grub_divmod64
+
+
 /*
  * Null divide-by-zero handler
  */
index af259d4f6ed42437cd96d6fefebba94b6e3a7a2c..8b771a5d8570b4d147394720e6f2fce0eb84d20b 100644 (file)
@@ -596,6 +596,49 @@ grub_divmod64 (grub_uint64_t n, grub_uint64_t d, grub_uint64_t *r)
   return q;
 }
 
+#if defined (__arm__)
+
+grub_uint32_t
+__udivsi3 (grub_uint32_t a, grub_uint32_t b)
+{
+  return grub_divmod64 (a, b, 0);
+}
+
+grub_uint32_t
+__umodsi3 (grub_uint32_t a, grub_uint32_t b)
+{
+  grub_uint64_t ret;
+  grub_divmod64 (a, b, &ret);
+  return ret;
+}
+
+
+#endif
+
+#ifdef __arm__
+grub_uint32_t
+__aeabi_uidiv (grub_uint32_t a, grub_uint32_t b)
+  __attribute__ ((alias ("__udivsi3")));
+#endif
+
+#if defined (__ia64__)
+
+grub_uint64_t
+__udivdi3 (grub_uint64_t a, grub_uint64_t b)
+{
+  return grub_divmod64 (a, b, 0);
+}
+
+grub_uint64_t
+__umoddi3 (grub_uint64_t a, grub_uint64_t b)
+{
+  grub_uint64_t ret;
+  grub_divmod64 (a, b, &ret);
+  return ret;
+}
+
+#endif
+
 /* Convert a long long value to a string. This function avoids 64-bit
    modular arithmetic or divisions.  */
 static char *
index d101db47317f8a48ed759f80fbd558763ed69299..fdc6611a04c593c199dfa645776aeb92cdbc6230 100644 (file)
@@ -42,30 +42,6 @@ void EXPORT_FUNC (__bswapsi2) (void);
 # ifdef HAVE___BSWAPDI2
 void EXPORT_FUNC (__bswapdi2) (void);
 # endif
-# ifdef HAVE___UDIVSI3
-void EXPORT_FUNC (__udivsi3) (void);
-# endif
-# ifdef HAVE___UMODSI3
-void EXPORT_FUNC (__umodsi3) (void);
-# endif
-# ifdef HAVE___UMODDI3
-void EXPORT_FUNC (__umoddi3) (void);
-# endif
-# ifdef HAVE___UDIVDI3
-void EXPORT_FUNC (__udivdi3) (void);
-# endif
-# ifdef HAVE___MODDI3
-void EXPORT_FUNC (__moddi3) (void);
-# endif
-# ifdef HAVE___DIVDI3
-void EXPORT_FUNC (__divdi3) (void);
-# endif
-# ifdef HAVE___DIVSI3
-void EXPORT_FUNC (__divsi3) (void);
-# endif
-# ifdef HAVE___MODSI3
-void EXPORT_FUNC (__modsi3) (void);
-# endif
 # ifdef HAVE___CTZDI2
 void EXPORT_FUNC (__ctzdi2) (void);
 # endif
@@ -114,12 +90,8 @@ void EXPORT_FUNC (_savegpr_31) (void);
 #endif
 
 #if defined (__arm__)
-void EXPORT_FUNC (__aeabi_idiv) (void);
-void EXPORT_FUNC (__aeabi_idivmod) (void);
 void EXPORT_FUNC (__aeabi_lasr) (void);
 void EXPORT_FUNC (__aeabi_llsl) (void);
 void EXPORT_FUNC (__aeabi_llsr) (void);
-void EXPORT_FUNC (__aeabi_uidiv) (void);
-void EXPORT_FUNC (__aeabi_uidivmod) (void);
 void EXPORT_FUNC (__aeabi_ulcmp) (void);
 #endif
index 20331f1c176aa33a1379e9d329112041771ffe72..c62d4fbebc7722cb1ece90718ce69e3b9bbba712 100644 (file)
@@ -453,6 +453,35 @@ grub_error_load (const struct grub_error_saved *save)
   grub_errno = save->grub_errno;
 }
 
+#if defined (__arm__)
+
+grub_uint32_t
+EXPORT_FUNC (__udivsi3) (grub_uint32_t a, grub_uint32_t b);
+
+grub_uint32_t
+EXPORT_FUNC (__umodsi3) (grub_uint32_t a, grub_uint32_t b);
+
+#endif
+
+#ifdef __arm__
+grub_uint32_t
+EXPORT_FUNC (__aeabi_uidiv) (grub_uint32_t a, grub_uint32_t b);
+grub_uint32_t
+EXPORT_FUNC (__aeabi_uidivmod) (grub_uint32_t a, grub_uint32_t b);
+
+#endif
+
+#if defined (__ia64__)
+
+grub_uint64_t
+EXPORT_FUNC (__udivdi3) (grub_uint64_t a, grub_uint64_t b);
+
+grub_uint64_t
+EXPORT_FUNC (__umoddi3) (grub_uint64_t a, grub_uint64_t b);
+
+#endif
+
+
 #if BOOT_TIME_STATS
 struct grub_boot_time
 {