.code64 .extern printk .extern apic_ack .macro CALL_PRINTK msg mov \msg, %rdi mov $0, %eax # Required for variadic functions mov $printk,%rcx call *(%rcx) .endm .macro SAVE_REGS push %r8 push %r9 push %r10 push %r11 push %r12 push %r13 push %r14 push %r15 push %rax push %rbx push %rcx push %rdx push %rbp push %rsi push %rdi push %rax mov $0x10, %ax mov %ax, %ds pop %rax .endm .macro RESTORE_REGS pop %rdi pop %rsi pop %rbp pop %rdx pop %rcx pop %rbx pop %rax pop %r15 pop %r14 pop %r13 pop %r12 pop %r11 pop %r10 pop %r9 pop %r8 .endm .globl INT_DEFAULT INT_DEFAULT: SAVE_REGS RESTORE_REGS iretq .globl INT_0 INT_0: CALL_PRINTK $MSG_INT_0 INT_0_INFINITE: jmp INT_0_INFINITE iretq .globl INT_10 INT_10: CALL_PRINTK $MSG_INT_10 INT_10_INFINITE: jmp INT_10_INFINITE iretq .globl INT_14 INT_14: CALL_PRINTK $MSG_INT_14 INT_14_INFINITE: jmp INT_14_INFINITE iretq .globl INT_KBD INT_KBD: SAVE_REGS CALL_PRINTK $MSG_INT_KBD call apic_ack RESTORE_REGS iretq .globl INT_CLK .extern clock INT_CLK: SAVE_REGS call clock call apic_ack RESTORE_REGS iretq .globl INT_SYSCALL .extern syscall INT_SYSCALL: SAVE_REGS call syscall RESTORE_REGS iretq MSG_INT_0: .asciz "Zero Division error!" MSG_INT_10: .asciz "Invalid TSS!" MSG_INT_14: .asciz "Page fault!" MSG_INT_KBD: .asciz "Key press!" MSG: .asciz "Called :)\n"