55 lines
1021 B
ArmAsm
55 lines
1021 B
ArmAsm
# bool safe_user_memcpy(void*, const void*, size_t)
|
|
.global safe_user_memcpy
|
|
.global safe_user_memcpy_end
|
|
.global safe_user_memcpy_fault
|
|
safe_user_memcpy:
|
|
xorl %eax, %eax
|
|
xchgl 4(%esp), %edi
|
|
xchgl 8(%esp), %esi
|
|
movl 12(%esp), %ecx
|
|
movl %edi, %edx
|
|
rep movsb
|
|
movl 4(%esp), %edi
|
|
movl 8(%esp), %esi
|
|
incl %eax
|
|
safe_user_memcpy_fault:
|
|
ret
|
|
safe_user_memcpy_end:
|
|
|
|
# bool safe_user_strncpy(void*, const void*, size_t)
|
|
.global safe_user_strncpy
|
|
.global safe_user_strncpy_end
|
|
.global safe_user_strncpy_fault
|
|
safe_user_strncpy:
|
|
xchgl 4(%esp), %edi
|
|
xchgl 8(%esp), %esi
|
|
movl 12(%esp), %ecx
|
|
|
|
testl %ecx, %ecx
|
|
jz safe_user_strncpy_fault
|
|
|
|
.safe_user_strncpy_loop:
|
|
movb (%esi), %al
|
|
movb %al, (%edi)
|
|
testb %al, %al
|
|
jz .safe_user_strncpy_done
|
|
|
|
incl %edi
|
|
incl %esi
|
|
decl %ecx
|
|
jnz .safe_user_strncpy_loop
|
|
|
|
safe_user_strncpy_fault:
|
|
xorl %eax, %eax
|
|
jmp .safe_user_strncpy_return
|
|
|
|
.safe_user_strncpy_done:
|
|
movl $1, %eax
|
|
|
|
.safe_user_strncpy_return:
|
|
movl 4(%esp), %edi
|
|
movl 8(%esp), %esi
|
|
ret
|
|
|
|
safe_user_strncpy_end:
|