--- 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]"