aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86/gdt_init.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86/gdt_init.S')
-rw-r--r--src/arch/x86/gdt_init.S43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/arch/x86/gdt_init.S b/src/arch/x86/gdt_init.S
new file mode 100644
index 0000000000..6aa2a79b48
--- /dev/null
+++ b/src/arch/x86/gdt_init.S
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+.code32
+.section ".text._gdt_", "ax", @progbits
+
+ .globl gdt_init
+gdt_init:
+ lgdt %cs:gdtptr
+ ret
+
+.previous
+ .align 4
+.globl gdtptr
+gdt:
+gdtptr:
+ .word gdt_end - gdt -1 /* compute the table limit */
+ .long gdt /* we know the offset */
+ .word 0
+
+ /* selgdt 0x08, flat code segment */
+ .word 0xffff, 0x0000
+ .byte 0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, So we get 4Gbytes
+ for limit */
+
+ /* selgdt 0x10,flat data segment */
+ .word 0xffff, 0x0000
+ .byte 0x00, 0x93, 0xcf, 0x00
+
+ /* selgdt 0x18, flat code segment (64-bit) */
+ .word 0xffff, 0x0000
+ .byte 0x00, 0x9b, 0xaf, 0x00
+
+gdt_end: