Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8a883670 authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

[S390] Bogomips calculation for 64 bit.



The bogomips calculation triggered via reading from /proc/cpuinfo
can return incorrect values if the qrnnd assembly is called with a
pointer in %r2 with any of the upper 32 bits set.
Fix this by using 64 bit division / remainder operation provided by
gcc instead of calling the assembly.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 285f6722
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@

EXTRA_AFLAGS := -traditional

lib-y += delay.o string.o uaccess_std.o uaccess_pt.o qrnnd.o
obj-$(CONFIG_32BIT) += div64.o
lib-y += delay.o string.o uaccess_std.o uaccess_pt.o
obj-$(CONFIG_32BIT) += div64.o qrnnd.o
lib-$(CONFIG_64BIT) += uaccess_mvcos.o
lib-$(CONFIG_SMP) += spinlock.o
+3 −3
Original line number Diff line number Diff line
@@ -27,9 +27,9 @@
   

#define _FP_W_TYPE_SIZE		32
#define _FP_W_TYPE		unsigned long
#define _FP_WS_TYPE		signed long
#define _FP_I_TYPE		long
#define _FP_W_TYPE		unsigned int
#define _FP_WS_TYPE		signed int
#define _FP_I_TYPE		int

#define _FP_MUL_MEAT_S(R,X,Y)					\
  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+11 −0
Original line number Diff line number Diff line
@@ -51,6 +51,16 @@
	wl = __wl;					\
})

#ifdef __s390x__
#define udiv_qrnnd(q, r, n1, n0, d)			\
  do { unsigned long __n;				\
       unsigned int __r, __d;				\
    __n = ((unsigned long)(n1) << 32) + n0;		\
    __d = (d);						\
    (q) = __n / __d;					\
    (r) = __n % __d;					\
  } while (0)
#else
#define udiv_qrnnd(q, r, n1, n0, d)			\
  do { unsigned int __r;				\
    (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));		\
@@ -58,6 +68,7 @@
  } while (0)
extern unsigned long __udiv_qrnnd (unsigned int *, unsigned int,
				   unsigned int , unsigned int);
#endif

#define UDIV_NEEDS_NORMALIZATION 0