--- head/sys/compat/linprocfs/linprocfs.c (r205682)
+++ head/sys/compat/linprocfs/linprocfs.c (r205683)
@@ -110,13 +110,36 @@ __FBSDID("$FreeBSD$");
 /*
  * Various conversion macros
  */
+
+/* The LINUX_USER_HZ is assumed 100 for now */
+
+#if defined(__i386__) && defined(__GNUCLIKE_ASM)
+/* we need intermediate result as 64 bit, otherwise it overflows too early */
+#define DO64_MULDIV(v,m,d)       \
+({                              \
+   unsigned long rv0;           \
+   unsigned long rv1;           \
+   __asm__ __volatile__(        \
+                "mull %1\n\t"   \
+                "divl %2\n\t"   \
+                :"=a" (rv0), "=d" (rv1) \
+                :"r" (d), "0" (v), "1" (m) \
+                :"cc" ); \
+  rv0; \
+})

Why it is impossible to express the calculation in C ?

You forgot to CC the submitter... CCed.

What do you have in mind, (unsinged long)((uint64_t)v * (uint64_t)m / (uint64_t)d)? Conditionally on the architecture or not?

Or just on all architectures this:

#define T2J(x) (unsigned long)(((x) * 100ULL) / (stathz ? stathz : hz)) /* 
ticks to jiffies */

Petr
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to