summaryrefslogtreecommitdiff
path: root/kernel/src/sys/userspace_asm.S
blob: 1bb19a39c7a6df470e23f4fb59584a5a022821ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.text

.extern begin_userspace
.extern syscall_handler

.set IA32_EFER, 0xc0000080
.set STAR_MSR, 0xc0000081
.set LSTAR_MSR, 0xc0000082

.global jump_userspace
jump_userspace:
	mov $0x1b, %ax
	mov %ax, %ds
	mov %ax, %es
	mov %ax, %fs
	mov %ax, %gs

	mov $LSTAR_MSR, %rcx
	movabs $__syscall, %rax
	shr $32, %rax
	mov %eax, %edx
	movabs $__syscall, %rax
	wrmsr
	mov $IA32_EFER, %rcx
	rdmsr
	or $1, %eax
	wrmsr
	mov $STAR_MSR, %rcx
	rdmsr
	mov $0x00130008, %edx
	wrmsr

	movabs $begin_userspace, %rcx
	mov $0x202, %r11
	sysretq