summaryrefslogtreecommitdiff
path: root/src/as/boot.s
diff options
context:
space:
mode:
authorAleksa Vučković <aleksav013@gmail.com>2021-10-25 00:36:33 +0200
committerAleksa Vučković <aleksav013@gmail.com>2021-10-25 00:36:33 +0200
commit20dd72e40dc2728d3c5335d860e4b8ab8da14fcc (patch)
treedabdfdf736c45f9632fa1388d2144b1de7a438b0 /src/as/boot.s
parent0bca634f7e70b05239f46f3bd40bb37468d67957 (diff)
Changing build system to recursive make
Diffstat (limited to 'src/as/boot.s')
-rw-r--r--src/as/boot.s82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/as/boot.s b/src/as/boot.s
new file mode 100644
index 0000000..6fe5ab8
--- /dev/null
+++ b/src/as/boot.s
@@ -0,0 +1,82 @@
+.set ALIGN, 1<<0
+.set MEMINFO, 1<<1
+.set FLAGS, ALIGN | MEMINFO
+.set MAGIC, 0x1BADB002
+.set CHECKSUM, -(MAGIC + FLAGS)
+
+.section .multiboot
+.align 4
+.long MAGIC
+.long FLAGS
+.long CHECKSUM
+
+.global _start
+.global load_gdt
+.global load_idt
+.global enable_interrupts
+.global keyboard_handler
+.global ioport_in
+.global ioport_out
+
+.extern init_gdt_table
+.extern handle_keyboard_interrupt
+.extern kernel_main
+
+load_gdt:
+ movl 4(%esp), %edx
+ lgdt (%edx)
+ ret
+
+load_idt:
+ movl 4(%esp), %edx
+ lidt (%edx)
+ sti
+ ret
+
+keyboard_handler:
+ pushal
+ cld
+ call handle_keyboard_interrupt
+ popal
+ iretl
+
+ioport_in:
+ movl 4(%esp),%edx
+ in %dx,%al
+ ret
+
+ioport_out:
+ movl 4(%esp),%edx
+ movl 8(%esp),%eax
+ outb %al,%dx
+ ret
+
+.set CODE_SEGMENT, 0x08
+.set DATA_SEGMENT, 0x10
+
+.section .bss
+.align 16
+stack_bottom:
+.skip 16384
+stack_top:
+
+.section .text
+.type _start, @function
+_start:
+ call init_gdt_table
+ ljmp $CODE_SEGMENT, $code
+
+code:
+ movw $DATA_SEGMENT, %ax
+ movw %ax, %ds
+ movw %ax, %es
+ movw %ax, %fs
+ movw %ax, %gs
+ movw %ax, %ss
+ movl $stack_top, %esp
+ cli
+ call _init
+ call kernel_main
+ hlt
+
+.size _start, . - _start