Make working gettimeofday() for Mac OS X.

The system call puts the time in a pair of registers, not in the
timeval structure.  Add code to move the time to the structure, so
programs see the correct time, not garbage.  This fixes our example
programs that use the time as a random seed.
This commit is contained in:
George Koehler 2016-11-23 13:25:55 -05:00
parent 98f2273d97
commit b6b707d9df
2 changed files with 21 additions and 0 deletions

View file

@ -1,7 +1,18 @@
! The system call checks the timeval pointer but doesn't store the
! time there. If the pointer wasn't NULL, then the system call
! returns the time in a pair of registers.
.sect .text .sect .text
.define _gettimeofday .define _gettimeofday
_gettimeofday: _gettimeofday:
mov eax, 116 mov eax, 116
int 0x80 int 0x80
jb .set_errno jb .set_errno
mov ebx, 4(esp) ! timeval pointer
test ebx, ebx
je 1f
mov 0(ebx), eax ! seconds
mov 4(ebx), edx ! microseconds
1:
mov eax, 0 ! return 0
ret ret

View file

@ -1,9 +1,19 @@
! The system call checks the timeval pointer but doesn't store the
! time there. If the pointer wasn't NULL, then the system call
! returns the time in a pair of registers.
.sect .text .sect .text
.define _gettimeofday .define _gettimeofday
_gettimeofday: _gettimeofday:
addi r0, r0, 116 ! gettimeofday addi r0, r0, 116 ! gettimeofday
lwz r3, 0(sp) ! timeval pointer lwz r3, 0(sp) ! timeval pointer
lwz r4, 4(sp) ! timezone pointer lwz r4, 4(sp) ! timezone pointer
or. r5, r3, r3
sc 0 sc 0
b .set_errno b .set_errno
bc 12, 2, 1f ! beq 1f
stw r3, 0(r5) ! seconds
stw r4, 4(r5) ! microseconds
1:
addi r3, r0, 0 ! return 0
bclr 20, 0, 0 bclr 20, 0, 0