Hello,

Excuse me if I mailing to wrong list.
I'm trying to find Solaris 10 kernel code which is responsive for false results 
on remainder operation. For example, 0xffff14445398aa64 % 0x000000019161719b 
calculated fine with libc (result is 0x000000014be746a6), but producing wrong 
result when calculated in 32-bit i86pc Solaris 10 kernel (result is 
0xffff1446a875f5c3). OpenSolaris 32-bit i86pc calculating same numbers 
correctly.
As I understand, actual remainder is calculated in __urem64() from 
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/common/util/i386/muldiv.s#671
 . This code was last modified in 2005 (according to history).

What I see is that __urem64() code from Solaris 10 differs from OpenSolaris:

Solaris 10# mdb -k
Loading modules: [ unix krtld genunix specfs dtrace cpu.generic uppc pcplusmp 
ufs ip hook neti sctp arp usba fctl nca lofs cpc random crypto zfs fcip 
logindmux ptm sppp nfs ]
> __urem64::dis
__urem64:                       pushl  %esi
__urem64+1:                     call   +0x12e   <0xfe831f7f>
__urem64+6:                     movl   %esi,%eax
__urem64+8:                     movl   %ecx,%edx
__urem64+0xa:                   popl   %esi
__urem64+0xb:                   ret    $0x10
>

OpenSolaris$ pfexec mdb -k
Loading modules: [ unix genunix specfs dtrace mac cpu.generic uppc pcplusmp 
rootnex scsi_vhci zfs sockfs ip hook neti sctp arp usba uhci s1394 fctl md lofs 
sd random fcip fcp cpc crypto logindmux ptm ufs sppp nsmb ipc nfs ]
> __urem64::dis
__urem64:                       subl   $0xc,%esp
__urem64+3:                     movl   %esp,%ecx
__urem64+5:                     movl   0x10(%esp),%eax
__urem64+9:                     movl   0x14(%esp),%edx
__urem64+0xd:                   pushl  %ecx
__urem64+0xe:                   pushl  0x20(%esp)
__urem64+0x12:                  pushl  0x20(%esp)
__urem64+0x16:                  call   -0x32b   <UDivRem>
__urem64+0x1b:                  movl   0xc(%esp),%eax
__urem64+0x1f:                  movl   0x10(%esp),%edx
__urem64+0x23:                  addl   $0x18,%esp
__urem64+0x26:                  ret    $0x10
>

Is it true that for some reason __urem64() code in Solaris 10 not synced with 
OpenSolaris? And only Sun support will be able to fix this.

--
Dmitry Glushenok
Jet Infosystems

_______________________________________________
opensolaris-code mailing list
opensolaris-code@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to