Browse Source

Ok, bad idea. didn't work.
-Erik

Eric Andersen 22 years ago
parent
commit
6cfdc9dd64
2 changed files with 56 additions and 2 deletions
  1. 28 1
      ldso/ldso/arm/dl-sysdep.h
  2. 28 1
      ldso/ldso/arm/ld_sysdep.h

+ 28 - 1
ldso/ldso/arm/dl-sysdep.h

@@ -89,7 +89,34 @@
 struct elf_resolve;
 unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
-#define do_rem(result, n, base)	    result = (n % base)
+static inline unsigned long arm_modulus(unsigned long m, unsigned long p) {
+	unsigned long i,t,inc;
+        i=p; t=0;
+        while(!(i&(1<<31))) {
+                i<<=1;
+                t++;
+        }
+        t--;
+        for(inc=t;inc>2;inc--) {
+                i=p<<inc;
+                if(i&(1<<31))
+                        break;
+                while(m>=i) {
+                        m-=i;
+                        i<<=1;
+                        if(i&(1<<31))
+                                break;
+                        if(i<p)
+                                break;
+                }
+        }
+        while(m>=p) {
+                m-=p;
+        }
+        return m;
+}
+
+#define do_rem(result, n, base)  result=arm_modulus(n,base);
 
 /* 4096 bytes alignment */
 #define PAGE_ALIGN 0xfffff000

+ 28 - 1
ldso/ldso/arm/ld_sysdep.h

@@ -89,7 +89,34 @@
 struct elf_resolve;
 unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
-#define do_rem(result, n, base)	    result = (n % base)
+static inline unsigned long arm_modulus(unsigned long m, unsigned long p) {
+	unsigned long i,t,inc;
+        i=p; t=0;
+        while(!(i&(1<<31))) {
+                i<<=1;
+                t++;
+        }
+        t--;
+        for(inc=t;inc>2;inc--) {
+                i=p<<inc;
+                if(i&(1<<31))
+                        break;
+                while(m>=i) {
+                        m-=i;
+                        i<<=1;
+                        if(i&(1<<31))
+                                break;
+                        if(i<p)
+                                break;
+                }
+        }
+        while(m>=p) {
+                m-=p;
+        }
+        return m;
+}
+
+#define do_rem(result, n, base)  result=arm_modulus(n,base);
 
 /* 4096 bytes alignment */
 #define PAGE_ALIGN 0xfffff000