summaryrefslogtreecommitdiff
path: root/arch/i386/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/kernel')
-rw-r--r--arch/i386/kernel/jump_userspace.s29
1 files changed, 29 insertions, 0 deletions
diff --git a/arch/i386/kernel/jump_userspace.s b/arch/i386/kernel/jump_userspace.s
new file mode 100644
index 0000000..fe69880
--- /dev/null
+++ b/arch/i386/kernel/jump_userspace.s
@@ -0,0 +1,29 @@
+.global jump_userspace
+.type jump_userspace, @function
+jump_userspace:
+ movw $0x23, %ax
+ movw %ax, %ds
+ movw %ax, %es
+ movw %ax, %fs
+ movw %ax, %gs
+
+ movl %esp, %eax
+ pushl $0x23
+ pushl %eax
+ pushf
+ push $0x1B
+ pushl $start_init
+
+ pushl %esp
+ call set_kernel_esp
+ addl $4, %esp
+
+ movl $0x0004, %eax
+ orl $0x0002, %eax
+ pushl %eax
+ call init_page_dir
+ addl $4, %esp
+
+ movl %eax, %cr3
+
+ iret