[parisc-linux] teaching the kernel to do division
Randolph Chung
Randolph Chung <randolph@tausq.org>
Thu, 23 Oct 2003 00:21:57 -0700
I was investigating why nanosleep() doesn't return the correct remaining
time with a 2.6 kernel... turns out the kernel doesn't seem to know
how to do division properly :-(
kernel/posix-timers.c has:
tsave->tv_sec = div_long_long_rem(left,
NSEC_PER_SEC,
&tsave->tv_nsec);
which eventually calls __div64_32() in lib/div64.c
if you test that function, you see that it does weird things. For
example, it tells me that:
28999591392 / 1000000000 = 3, remainder = 229787616
<sigh>
does anyone want to look into fixing it, and/or writing an optimized
version of that function for pa? :-) it needs to do basically this (but
be standalone)
uint32_t div64(uint64_t *n, uint32_t base)
{
uint32_t rem;
rem = *n % base;
*n = *n / base;
return rem;
}
thanks :)
randolph
--
Randolph Chung
Debian GNU/Linux Developer, hppa/ia64 ports
http://www.tausq.org/