svn commit: r205683 - head/sys/compat/linprocfs

Petr Salinger Petr.Salinger at seznam.cz
Fri Mar 26 13:33:30 UTC 2010


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


More information about the svn-src-all mailing list