49 lines
817 B
ArmAsm
49 lines
817 B
ArmAsm
|
|
||
|
|
||
|
.section .text
|
||
|
|
||
|
.global _tls_alloc
|
||
|
.global __tls_map
|
||
|
|
||
|
.align 4
|
||
|
_tls_alloc:
|
||
|
|
||
|
pushl $tls_mutex
|
||
|
call ___mutex_lock
|
||
|
popl %eax
|
||
|
|
||
|
movl tls_map_start, %edx
|
||
|
.align 4
|
||
|
.test:
|
||
|
bsfl (%edx), %eax
|
||
|
jnz .done
|
||
|
|
||
|
add $4, %edx
|
||
|
cmpl $128+__tls_map, %edx
|
||
|
jb .test
|
||
|
|
||
|
xorl %eax, %eax
|
||
|
mov %eax, tls_mutex
|
||
|
ret
|
||
|
|
||
|
.done:
|
||
|
btrl %eax, (%edx)
|
||
|
movl %edx, tls_map_start
|
||
|
movl $0, tls_mutex
|
||
|
|
||
|
subl $__tls_map, %edx
|
||
|
leal (%eax, %edx, 8), %eax
|
||
|
shll $2, %eax
|
||
|
ret
|
||
|
|
||
|
.section .data
|
||
|
|
||
|
tls_mutex: .long(0)
|
||
|
tls_map_start: .long(__tls_map)
|
||
|
|
||
|
.section .bss
|
||
|
|
||
|
.align 16
|
||
|
|
||
|
__tls_map: .space 128
|