blob: fe3d7598bb425310b27393e1e65f360079e9dc67 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <asm.h>
#include <arch/x86/descriptor.h>
// x86_uspace_entry(uintptr_t arg1, uintptr_t arg2, uintptr_t sp, uintptr_t pc, uint64_t rflags)
FUNCTION(x86_uspace_entry)
/* push a fake 64bit interrupt stack frame and iret to it */
push_value $USER_DATA_SELECTOR // ss
push_value %rdx // sp
push_value %r8 // rflags
push_value $USER_CODE_64_SELECTOR // cs
push_value %rcx // pc
ALL_CFI_UNDEFINED
// Clear registers
xorl %eax, %eax /* set %rax = 0 */
xorl %ebx, %ebx
xorl %ecx, %ecx
xorl %edx, %edx
// Don't clear rdi or rsi, since they have the user arguments.
xorl %ebp, %ebp
xorl %r8d, %r8d
xorl %r9d, %r9d
xorl %r10d, %r10d
xorl %r11d, %r11d
xorl %r12d, %r12d
xorl %r13d, %r13d
xorl %r14d, %r14d
xorl %r15d, %r15d
// We do not need to clear extended register state, since the kernel only
// uses the general purpose registers, and the extended state is initialized
// to a cleared state.
swapgs
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
iretq
END_FUNCTION(x86_uspace_entry)