[OpenBIOS] [RFC 3/3] SPARC32/64: Mimic Sun's OBP behaviour if a divide by zero occurs.
Blue Swirl
blauwirbel at gmail.com
Sat Jan 12 22:51:26 CET 2013
On Sat, Jan 12, 2013 at 2:18 PM, Segher Boessenkool
<segher at kernel.crashing.org> wrote:
>> Actually this got me thinking, since you're right in that integer division
>> should require a manual trap. This took me into OpenBIOS's bundled version
>> of libgcc and __udivmoddi4.c:
>>
>> __uint128_t __udivmodti4(__uint128_t num, __uint128_t den, __uint128_t
>> *rem_p)
>> {
>> __uint128_t quot = 0, qbit = 1;
>>
>> if ( den == 0 ) {
>> __divide_error();
>> return 0; /* If trap returns... */
>> }
>
>
> [It seems you showed __udivmodti4 instead -- but the code is much the same].
>
> That's not libgcc code: it is x86 Linux kernel code or klibc or something
> like that. Libgcc forces a single-precision divide by zero when the double-
> precision routine divides by zero, so there can be no problem there.
Some software archeology follows.
The function __udivmoddi4() was added by me in r4 as
arch/sparc32/libgcc/__udivmoddi4.c in 2006. Then I moved the file with
r61 to its current location in ./libgcc, with R62 copied this to
__udivmodti4.c and changed 64 bit types to 128 bits.
This and files __divdi3.c, __udivdi3.c and __umoddi3.c seem to
originate from klibc indeed. With
2f6cd4633e623c29bbcb793eff76c8c08c2c0f9c H. Peter Anvin added the
files to klibc/arch/i386/libgcc/ in 2002, they have been moved since
to usr/klibc/libgcc/ and reformatted. Before reformatting to kernel
style, the files were identical to our version except for a header
change.
Some klibc files like these are also used by Syslinux, iPXE and gPXE,
but they may actually be newer than OpenBIOS r4. So I think I used
klibc directly.
As specified by usr/klibc/LICENSE, klibc is a mix of GPLv2only, BSD
and MIT licensed files, the default being MIT unless files originate
from BSD or Linux. I think these files are therefore MIT licensed.
GPLv2only and BSD would be OK for OpenBIOS too.
Files ashldi3.c and ashrdi3.c are from GCC 2.95.2 libgcc which was
GPLv2+ at that time (way before GPLv3 switch). GPLv2+ is also fine for
OpenBIOS.
The license situation could be clarified by copying the LICENSE from
klibc to OpenBIOS.
>> A quick grep of the source shows that __divide_error() is manually set to
>> the unexpected exception trap handler in start.S:
>>
>> _GLOBAL(__divide_error):
>> trap_error:
>> mflr r3
>> LOAD_REG_FUNC(r4, unexpected_excep)
>> mtctr r4
>> bctr
>>
>> Heh. So actually all we need to do is provide an empty function for
>> __divide_error() and we magically get the behaviour we want. Revised patch
>> to follow shortly.
>
>
> Or not have a __divide_error at all, which makes it clearer the intent
> is to have the double precision divide have the same behaviour as single
> precision on whatever hardware it runs on. Your patch should work though
> :-)
>
>
> Segher
>
>
>
> --
> OpenBIOS http://openbios.org/
> Mailinglist: http://lists.openbios.org/mailman/listinfo
> Free your System - May the Forth be with you
More information about the OpenBIOS
mailing list