#include <asm_defs.h>
#include <arch/x86/descriptors.h>
#include "asm_offsets.h"
#include "syscall_numbers.h"
.text
FUNCTION(x86_fnsave):
movl 4(%esp), %eax
fnsave (%eax)
ret
FUNCTION_END(x86_fnsave)
FUNCTION(x86_fxsave):
movl 4(%esp), %eax
fxsave (%eax)
ret
FUNCTION_END(x86_fxsave)
FUNCTION(x86_frstor):
movl 4(%esp), %eax
frstor (%eax)
ret
FUNCTION_END(x86_frstor)
FUNCTION(x86_fxrstor):
movl 4(%esp), %eax
fxrstor (%eax)
ret
FUNCTION_END(x86_fxrstor)
FUNCTION(x86_noop_swap):
nop
ret
FUNCTION_END(x86_noop_swap)
FUNCTION(x86_fnsave_swap):
movl 4(%esp),%eax
fnsave (%eax)
movl 8(%esp),%eax
frstor (%eax)
ret
FUNCTION_END(x86_fnsave_swap)
FUNCTION(x86_fxsave_swap):
movl 4(%esp),%eax
fxsave (%eax)
movl 8(%esp),%eax
fxrstor (%eax)
ret
FUNCTION_END(x86_fxsave_swap)
FUNCTION(x86_get_stack_frame):
movl %ebp, %eax
ret
FUNCTION_END(x86_get_stack_frame)
FUNCTION(x86_context_switch):
pusha
movl 36(%esp),%eax
movl %esp,(%eax)
pushl %ss
popl %edx
movl %edx,4(%eax)
movl 40(%esp),%eax
lss (%eax),%esp
popa
ret
FUNCTION_END(x86_context_switch)
FUNCTION(x86_swap_pgdir):
movl 4(%esp),%eax
movl %eax,%cr3
ret
FUNCTION_END(x86_swap_pgdir)
.align 4
FUNCTION(x86_userspace_thread_exit):
pushl %eax
sub $4, %esp
movl $1, %ecx
lea (%esp), %edx
movl $SYSCALL_EXIT_THREAD, %eax
int $99
.align 4
FUNCTION_END(x86_userspace_thread_exit)
SYMBOL(x86_end_userspace_thread_exit):
null_idt_descr:
.word 0
.word 0,0
FUNCTION(x86_reboot):
lidt null_idt_descr
int $0
done:
jmp done
FUNCTION_END(x86_reboot)
FUNCTION(_arch_cpu_user_memcpy):
pushl %esi
pushl %edi
movl 12(%esp),%edi
movl 16(%esp),%esi
movl 20(%esp),%ecx
movl 24(%esp),%edx
movl (%edx),%eax
movl $.L_user_memcpy_error, (%edx)
cld
shrl $2,%ecx
rep
movsl
movl 20(%esp),%ecx
andl $3,%ecx
rep
movsb
movl %eax,(%edx)
xor %eax,%eax
popl %edi
popl %esi
ret
.L_user_memcpy_error:
movl %eax,(%edx)
movl $-1,%eax
popl %edi
popl %esi
ret
FUNCTION_END(_arch_cpu_user_memcpy)
FUNCTION(_arch_cpu_user_memset):
pushl %esi
pushl %edi
movl 12(%esp),%edi
movb 16(%esp),%al
movl 20(%esp),%ecx
movl 24(%esp),%edx
movl (%edx),%esi
movl $.L_user_memset_error, (%edx)
rep
stosb
movl %esi,(%edx)
xor %eax,%eax
popl %edi
popl %esi
ret
.L_user_memset_error:
movl %esi,(%edx)
movl $-1,%eax
popl %edi
popl %esi
ret
FUNCTION_END(_arch_cpu_user_memset)
FUNCTION(_arch_cpu_user_strlcpy):
pushl %esi
pushl %edi
pushl %ebx
movl 16(%esp),%edi
movl 20(%esp),%esi
movl 24(%esp),%ecx
movl 28(%esp),%edx
movl (%edx),%ebx
movl $.L_user_strlcpy_error, (%edx)
cmp $0,%ecx
je .L_user_strlcpy_source_count
dec %ecx
jnz .L_user_strlcpy_copy_begin
movb $0,(%edi)
jmp .L_user_strlcpy_source_count
.L_user_strlcpy_copy_begin:
cld
.L_user_strlcpy_copy_loop:
lodsb
stosb
test %al,%al
jz .L_user_strlcpy_source_done
loop .L_user_strlcpy_copy_loop
movb $0,(%edi)
dec %esi
.L_user_strlcpy_source_count:
not %ecx
# %ecx was 0 and is now max
xor %al,%al
movl %esi,%edi
repnz
scasb
movl %edi,%esi
.L_user_strlcpy_source_done:
movl %esi,%eax
subl 20(%esp),%eax
dec %eax
movl %ebx,(%edx)
popl %ebx
popl %edi
popl %esi
ret
.L_user_strlcpy_error:
movl %ebx,(%edx)
movl $-1,%eax
popl %ebx
popl %edi
popl %esi
ret
FUNCTION_END(_arch_cpu_user_strlcpy)
FUNCTION(arch_debug_call_with_fault_handler):
push %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
lea 1f, %edx
movl %edx, CPU_ENT_fault_handler(%eax)
movl %ebp, CPU_ENT_fault_handler_stack_pointer(%eax)
movl 20(%ebp), %eax
push %eax
movl 16(%ebp), %eax
call *%eax
movl %ebp, %esp
pop %ebp
ret
1:
movl %ebp, %esp
pushl $1
movl 12(%ebp), %eax
pushl %eax
call longjmp
FUNCTION_END(arch_debug_call_with_fault_handler)