1 #------------------------------------------------------------------------------
3 #* Copyright 2006 - 2010, Intel Corporation
4 #* All rights reserved. This program and the accompanying materials
5 #* are licensed and made available under the terms and conditions of the BSD License
6 #* which accompanies this distribution. The full text of the license may be found at
7 #* http://opensource.org/licenses/bsd-license.php
9 #* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 #* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #------------------------------------------------------------------------------
18 #PUBLIC SystemTimerHandler
19 #PUBLIC SystemExceptionHandler
20 #EXTERNDEF mExceptionCodeSize:DWORD
22 #EXTERN TimerHandler: NEAR
23 #EXTERN ExceptionHandler: NEAR
24 #EXTERN mTimerVector: DWORD
27 ASM_GLOBAL ASM_PFX(mExceptionCodeSize)
28 ASM_PFX(mExceptionCodeSize): .long 9
31 ASM_GLOBAL ASM_PFX(InitDescriptor)
33 ASM_PFX(InitDescriptor):
34 movq $GDT_BASE,%rax # EAX=PHYSICAL address of gdt
35 movq %rax, gdtr + 2 # Put address of gdt into the gdtr
40 movq $IDT_BASE,%rax # EAX=PHYSICAL address of idt
41 movq %rax, idtr + 2 # Put address of idt into the idtr
46 # InstallInterruptHandler (
48 # VOID (*Handler)(VOID)
50 ASM_GLOBAL ASM_PFX(InstallInterruptHandler)
51 ASM_PFX(InstallInterruptHandler):
52 # Vector:DWORD @ 4(%esp)
53 # Handler:DWORD @ 8(%esp)
56 cli # turn off interrupts
57 subq $0x10, %rsp # open some space on the stack
60 sidt (%rbx) # get fword address of IDT
61 movq 2(%rbx), %rbx # move offset of IDT into RBX
62 addq $0x10, %rsp # correct stack
63 movq %rcx, %rax # Get vector number
64 shlq $4, %rax # multiply by 16 to get offset
65 addq %rax, %rbx # add to IDT base to get entry
66 movq %rdx, %rax # load new address into IDT entry
67 movw %ax, (%rbx) # write bits 15..0 of offset
68 shrq $16, %rax # use ax to copy 31..16 to descriptors
69 movw %ax, 6(%rbx) # write bits 31..16 of offset
70 shrq $16, %rax # use eax to copy 63..32 to descriptors
71 movl %eax, 8(%rbx) # write bits 63..32 of offset
72 popfq # restore flags (possible enabling interrupts)
76 .macro JmpCommonIdtEntry
77 # jmp commonIdtEntry - this must be hand coded to keep the assembler from
78 # using a 8 bit reletive jump when the entries are
79 # within 255 bytes of the common entry. This must
80 # be done to maintain the consistency of the size
82 .byte 0xe9 # jmp 16 bit reletive
83 .long commonIdtEntry - . - 4 # offset to jump to
87 ASM_GLOBAL ASM_PFX(SystemExceptionHandler)
88 ASM_PFX(SystemExceptionHandler):
90 push $0x0 # push error code place holder on the stack
93 # db 0e9h # jmp 16 bit reletive
94 # dd commonIdtEntry - $ - 4 # offset to jump to
97 push $0x0 # push error code place holder on the stack
102 push $0x0 # push error code place holder on the stack
107 push $0x0 # push error code place holder on the stack
112 push $0x0 # push error code place holder on the stack
117 push $0x0 # push error code place holder on the stack
122 push $0x0 # push error code place holder on the stack
127 push $0x0 # push error code place holder on the stack
132 # Double fault causes an error code to be pushed so no phony push necessary
139 push $0x0 # push error code place holder on the stack
144 # Invalid TSS causes an error code to be pushed so no phony push necessary
151 # Segment Not Present causes an error code to be pushed so no phony push necessary
158 # Stack fault causes an error code to be pushed so no phony push necessary
165 # GP fault causes an error code to be pushed so no phony push necessary
172 # Page fault causes an error code to be pushed so no phony push necessary
179 push $0x0 # push error code place holder on the stack
184 push $0x0 # push error code place holder on the stack
189 # Alignment check causes an error code to be pushed so no phony push necessary
196 push $0x0 # push error code place holder on the stack
201 push $0x0 # push error code place holder on the stack
206 # The following segment repeats (32 - 20) times:
207 # macro .rept isn't used here because Apple GAS compiler doesn't support it.
209 push $0x0 # push error code place holder on the stack
210 # push xxh # push vector number
212 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
215 push $0x0 # push error code place holder on the stack
216 # push xxh # push vector number
218 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
221 push $0x0 # push error code place holder on the stack
222 # push xxh # push vector number
224 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
227 push $0x0 # push error code place holder on the stack
228 # push xxh # push vector number
230 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
233 push $0x0 # push error code place holder on the stack
234 # push xxh # push vector number
236 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
239 push $0x0 # push error code place holder on the stack
240 # push xxh # push vector number
242 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
245 push $0x0 # push error code place holder on the stack
246 # push xxh # push vector number
248 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
251 push $0x0 # push error code place holder on the stack
252 # push xxh # push vector number
254 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
257 push $0x0 # push error code place holder on the stack
258 # push xxh # push vector number
260 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
263 push $0x0 # push error code place holder on the stack
264 # push xxh # push vector number
266 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
269 push $0x0 # push error code place holder on the stack
270 # push xxh # push vector number
272 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
275 push $0x0 # push error code place holder on the stack
276 # push xxh # push vector number
278 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
282 ASM_GLOBAL ASM_PFX(SystemTimerHandler)
283 ASM_PFX(SystemTimerHandler):
285 push $ASM_PFX(mTimerVector)
289 # +---------------------+
291 # +---------------------+
293 # +---------------------+
295 # +---------------------+
297 # +---------------------+
299 # +---------------------+
301 # +---------------------+ <-- EBP
308 # Since here the stack pointer is 16-byte aligned, so
309 # EFI_FX_SAVE_STATE_X64 of EFI_SYSTEM_CONTEXT_x64
313 ## UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax#
314 ## UINT64 R8, R9, R10, R11, R12, R13, R14, R15#
332 ## UINT64 Gs, Fs, Es, Ds, Cs, Ss# insure high 16 bits of each is zero
333 movzx 7*8(%rbp), %rax
335 movzx 4*8(%rbp), %rax
349 ## UINT64 Gdtr[2], Idtr[2]#
365 ## UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8#
381 ## UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7#
385 ## clear Dr7 while executing debugger itself
392 ## insure all status bits in dr6 are clear...
406 ## FX_SAVE_STATE_X64 FxSaveState#
411 ## UINT64 ExceptionData#
414 ## call into exception handler
415 ## Prepare parameter and call
419 # Per X64 calling convention, allocate maximum parameter stack space
420 # and make sure RSP is 16-byte aligned
425 call ASM_PFX(TimerHandler)
428 call ASM_PFX(ExceptionHandler)
433 ## UINT64 ExceptionData#
436 ## FX_SAVE_STATE_X64 FxSaveState#
442 ## UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7#
451 ## skip restore of dr6. We cleared dr6 during the context save.
456 ## UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8#
459 addq $8, %rsp # not for Cr1
473 ## UINT64 Gdtr[2], Idtr[2]#
474 ## Best not let anyone mess with these particular registers...
480 ## UINT64 Gs, Fs, Es, Ds, Cs, Ss#
482 # mov gs, rax # not for gs
484 # mov fs, rax # not for fs
485 # (X64 will not use fs and gs, so we do not restore it)
490 pop 4*8(%rbp) # for cs
491 pop 7*8(%rbp) # for ss
493 ## UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax#
494 ## UINT64 R8, R9, R10, R11, R12, R13, R14, R15#
497 addq $8, %rsp # not for rbp
498 pop 6*8(%rbp) # for rsp
518 ##############################################################################
520 ##############################################################################
524 gdtr: .short GDT_END - GDT_BASE - 1 # GDT limit
525 .quad 0 # (GDT base gets set above)
526 ##############################################################################
527 # global descriptor table (GDT)
528 ##############################################################################
530 .p2align 4 # make GDT 16-byte align
534 NULL_SEL = .-GDT_BASE # Selector [0x0]
535 .short 0 # limit 15:0
539 .byte 0 # limit 19:16, flags
542 # linear data segment descriptor
543 LINEAR_SEL = .-GDT_BASE # Selector [0x8]
544 .short 0x0FFFF # limit 0xFFFFF
547 .byte 0x092 # present, ring 0, data, expand-up, writable
548 .byte 0x0CF # page-granular, 32-bit
551 # linear code segment descriptor
552 LINEAR_CODE_SEL = .-GDT_BASE # Selector [0x10]
553 .short 0x0FFFF # limit 0xFFFFF
556 .byte 0x09A # present, ring 0, code, expand-up, writable
557 .byte 0x0CF # page-granular, 32-bit
560 # system data segment descriptor
561 SYS_DATA_SEL = .-GDT_BASE # Selector [0x18]
562 .short 0x0FFFF # limit 0xFFFFF
565 .byte 0x092 # present, ring 0, data, expand-up, writable
566 .byte 0x0CF # page-granular, 32-bit
569 # system code segment descriptor
570 SYS_CODE_SEL = .-GDT_BASE # Selector [0x20]
571 .short 0x0FFFF # limit 0xFFFFF
574 .byte 0x09A # present, ring 0, code, expand-up, writable
575 .byte 0x0CF # page-granular, 32-bit
578 # spare segment descriptor
579 SPARE3_SEL = .-GDT_BASE # Selector [0x28]
587 # system data segment descriptor
588 SYS_DATA64_SEL = .-GDT_BASE # Selector [0x30]
589 .short 0x0FFFF # limit 0xFFFFF
592 .byte 0x092 # present, ring 0, data, expand-up, writable
593 .byte 0x0CF # page-granular, 32-bit
596 # system code segment descriptor
597 SYS_CODE64_SEL = .-GDT_BASE # Selector [0x38]
598 .short 0x0FFFF # limit 0xFFFFF
601 .byte 0x09A # present, ring 0, code, expand-up, writable
602 .byte 0x0AF # page-granular, 64-bit
605 # spare segment descriptor
606 SPARE4_SEL = .-GDT_BASE # Selector [0x40]
616 idtr: .short IDT_END - IDT_BASE - 1 # IDT limit
617 .quad 0 # (IDT base gets set above)
618 ##############################################################################
619 # interrupt descriptor table (IDT)
621 # Note: The hardware IRQ's specified in this table are the normal PC/AT IRQ
622 # mappings. This implementation only uses the system timer and all other
623 # IRQs will remain masked. The descriptors for vectors 33+ are provided
625 ##############################################################################
627 .p2align 3 # make IDT 8-byte align
630 # divide by zero (INT 0)
631 DIV_ZERO_SEL = .-IDT_BASE
632 .short 0 # offset 15:0
633 .short SYS_CODE64_SEL # selector 15:0
634 .byte 0 # 0 for interrupt gate
635 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
636 .short 0 # offset 31:16
637 .long 0 # offset 63:32
638 .long 0 # for reserved
640 # debug exception (INT 1)
641 DEBUG_EXCEPT_SEL = .-IDT_BASE
642 .short 0 # offset 15:0
643 .short SYS_CODE64_SEL # selector 15:0
644 .byte 0 # 0 for interrupt gate
645 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
646 .short 0 # offset 31:16
647 .long 0 # offset 63:32
648 .long 0 # for reserved
652 .short 0 # offset 15:0
653 .short SYS_CODE64_SEL # selector 15:0
654 .byte 0 # 0 for interrupt gate
655 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
656 .short 0 # offset 31:16
657 .long 0 # offset 63:32
658 .long 0 # for reserved
660 # soft breakpoint (INT 3)
661 BREAKPOINT_SEL = .-IDT_BASE
662 .short 0 # offset 15:0
663 .short SYS_CODE64_SEL # selector 15:0
664 .byte 0 # 0 for interrupt gate
665 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
666 .short 0 # offset 31:16
667 .long 0 # offset 63:32
668 .long 0 # for reserved
671 OVERFLOW_SEL = .-IDT_BASE
672 .short 0 # offset 15:0
673 .short SYS_CODE64_SEL # selector 15:0
674 .byte 0 # 0 for interrupt gate
675 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
676 .short 0 # offset 31:16
677 .long 0 # offset 63:32
678 .long 0 # for reserved
680 # bounds check (INT 5)
681 BOUNDS_CHECK_SEL = .-IDT_BASE
682 .short 0 # offset 15:0
683 .short SYS_CODE64_SEL # selector 15:0
684 .byte 0 # 0 for interrupt gate
685 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
686 .short 0 # offset 31:16
687 .long 0 # offset 63:32
688 .long 0 # for reserved
690 # invalid opcode (INT 6)
691 INVALID_OPCODE_SEL = .-IDT_BASE
692 .short 0 # offset 15:0
693 .short SYS_CODE64_SEL # selector 15:0
694 .byte 0 # 0 for interrupt gate
695 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
696 .short 0 # offset 31:16
697 .long 0 # offset 63:32
698 .long 0 # for reserved
700 # device not available (INT 7)
701 DEV_NOT_AVAIL_SEL = .-IDT_BASE
702 .short 0 # offset 15:0
703 .short SYS_CODE64_SEL # selector 15:0
704 .byte 0 # 0 for interrupt gate
705 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
706 .short 0 # offset 31:16
707 .long 0 # offset 63:32
708 .long 0 # for reserved
710 # double fault (INT 8)
711 DOUBLE_FAULT_SEL = .-IDT_BASE
712 .short 0 # offset 15:0
713 .short SYS_CODE64_SEL # selector 15:0
714 .byte 0 # 0 for interrupt gate
715 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
716 .short 0 # offset 31:16
717 .long 0 # offset 63:32
718 .long 0 # for reserved
720 # Coprocessor segment overrun - reserved (INT 9)
721 RSVD_INTR_SEL1 = .-IDT_BASE
722 .short 0 # offset 15:0
723 .short SYS_CODE64_SEL # selector 15:0
724 .byte 0 # 0 for interrupt gate
725 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
726 .short 0 # offset 31:16
727 .long 0 # offset 63:32
728 .long 0 # for reserved
730 # invalid TSS (INT 0ah)
731 INVALID_TSS_SEL = .-IDT_BASE
732 .short 0 # offset 15:0
733 .short SYS_CODE64_SEL # selector 15:0
734 .byte 0 # 0 for interrupt gate
735 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
736 .short 0 # offset 31:16
737 .long 0 # offset 63:32
738 .long 0 # for reserved
740 # segment not present (INT 0bh)
741 SEG_NOT_PRESENT_SEL = .-IDT_BASE
742 .short 0 # offset 15:0
743 .short SYS_CODE64_SEL # selector 15:0
744 .byte 0 # 0 for interrupt gate
745 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
746 .short 0 # offset 31:16
747 .long 0 # offset 63:32
748 .long 0 # for reserved
750 # stack fault (INT 0ch)
751 STACK_FAULT_SEL = .-IDT_BASE
752 .short 0 # offset 15:0
753 .short SYS_CODE64_SEL # selector 15:0
754 .byte 0 # 0 for interrupt gate
755 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
756 .short 0 # offset 31:16
757 .long 0 # offset 63:32
758 .long 0 # for reserved
760 # general protection (INT 0dh)
761 GP_FAULT_SEL = .-IDT_BASE
762 .short 0 # offset 15:0
763 .short SYS_CODE64_SEL # selector 15:0
764 .byte 0 # 0 for interrupt gate
765 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
766 .short 0 # offset 31:16
767 .long 0 # offset 63:32
768 .long 0 # for reserved
770 # page fault (INT 0eh)
771 PAGE_FAULT_SEL = .-IDT_BASE
772 .short 0 # offset 15:0
773 .short SYS_CODE64_SEL # selector 15:0
774 .byte 0 # 0 for interrupt gate
775 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
776 .short 0 # offset 31:16
777 .long 0 # offset 63:32
778 .long 0 # for reserved
780 # Intel reserved - do not use (INT 0fh)
781 RSVD_INTR_SEL2 = .-IDT_BASE
782 .short 0 # offset 15:0
783 .short SYS_CODE64_SEL # selector 15:0
784 .byte 0 # 0 for interrupt gate
785 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
786 .short 0 # offset 31:16
787 .long 0 # offset 63:32
788 .long 0 # for reserved
790 # floating point error (INT 0x10)
791 FLT_POINT_ERR_SEL = .-IDT_BASE
792 .short 0 # offset 15:0
793 .short SYS_CODE64_SEL # selector 15:0
794 .byte 0 # 0 for interrupt gate
795 .byte 0x0e | 0x80 # type = 386 interrupt gate, present
796 .short 0 # offset 31:16
797 .long 0 # offset 63:32
798 .long 0 # for reserved
800 # alignment check (INT 0x11)
801 ALIGNMENT_CHECK_SEL = .-IDT_BASE
802 .short 0 # offset 15:0
803 .short SYS_CODE64_SEL # selector 15:0
804 .byte 0 # 0 for interrupt gate
805 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
806 .short 0 # offset 31:16
807 .long 0 # offset 63:32
808 .long 0 # for reserved
810 # machine check (INT 0x12)
811 MACHINE_CHECK_SEL = .-IDT_BASE
812 .short 0 # offset 15:0
813 .short SYS_CODE64_SEL # selector 15:0
814 .byte 0 # 0 for interrupt gate
815 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
816 .short 0 # offset 31:16
817 .long 0 # offset 63:32
818 .long 0 # for reserved
820 # SIMD floating-point exception (INT 0x13)
821 SIMD_EXCEPTION_SEL = .-IDT_BASE
822 .short 0 # offset 15:0
823 .short SYS_CODE64_SEL # selector 15:0
824 .byte 0 # 0 for interrupt gate
825 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
826 .short 0 # offset 31:16
827 .long 0 # offset 63:32
828 .long 0 # for reserved
830 # The following segment repeats (32 - 20) times:
831 # macro .rept isn't used here because Apple GAS compiler doesn't support it.
833 .short 0 # offset 15:0
834 .short SYS_CODE_SEL # selector 15:0
835 .byte 0 # 0 for interrupt gate
836 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
837 .short 0 # offset 31:16
838 .long 0 # offset 63:32
839 .long 0 # for reserved
841 .short 0 # offset 15:0
842 .short SYS_CODE_SEL # selector 15:0
843 .byte 0 # 0 for interrupt gate
844 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
845 .short 0 # offset 31:16
846 .long 0 # offset 63:32
847 .long 0 # for reserved
849 .short 0 # offset 15:0
850 .short SYS_CODE_SEL # selector 15:0
851 .byte 0 # 0 for interrupt gate
852 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
853 .short 0 # offset 31:16
854 .long 0 # offset 63:32
855 .long 0 # for reserved
857 .short 0 # offset 15:0
858 .short SYS_CODE_SEL # selector 15:0
859 .byte 0 # 0 for interrupt gate
860 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
861 .short 0 # offset 31:16
862 .long 0 # offset 63:32
863 .long 0 # for reserved
865 .short 0 # offset 15:0
866 .short SYS_CODE_SEL # selector 15:0
867 .byte 0 # 0 for interrupt gate
868 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
869 .short 0 # offset 31:16
870 .long 0 # offset 63:32
871 .long 0 # for reserved
873 .short 0 # offset 15:0
874 .short SYS_CODE_SEL # selector 15:0
875 .byte 0 # 0 for interrupt gate
876 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
877 .short 0 # offset 31:16
878 .long 0 # offset 63:32
879 .long 0 # for reserved
881 .short 0 # offset 15:0
882 .short SYS_CODE_SEL # selector 15:0
883 .byte 0 # 0 for interrupt gate
884 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
885 .short 0 # offset 31:16
886 .long 0 # offset 63:32
887 .long 0 # for reserved
889 .short 0 # offset 15:0
890 .short SYS_CODE_SEL # selector 15:0
891 .byte 0 # 0 for interrupt gate
892 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
893 .short 0 # offset 31:16
894 .long 0 # offset 63:32
895 .long 0 # for reserved
897 .short 0 # offset 15:0
898 .short SYS_CODE_SEL # selector 15:0
899 .byte 0 # 0 for interrupt gate
900 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
901 .short 0 # offset 31:16
902 .long 0 # offset 63:32
903 .long 0 # for reserved
905 .short 0 # offset 15:0
906 .short SYS_CODE_SEL # selector 15:0
907 .byte 0 # 0 for interrupt gate
908 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
909 .short 0 # offset 31:16
910 .long 0 # offset 63:32
911 .long 0 # for reserved
913 .short 0 # offset 15:0
914 .short SYS_CODE_SEL # selector 15:0
915 .byte 0 # 0 for interrupt gate
916 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
917 .short 0 # offset 31:16
918 .long 0 # offset 63:32
919 .long 0 # for reserved
921 .short 0 # offset 15:0
922 .short SYS_CODE_SEL # selector 15:0
923 .byte 0 # 0 for interrupt gate
924 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
925 .short 0 # offset 31:16
926 .long 0 # offset 63:32
927 .long 0 # for reserved
930 # 72 unspecified descriptors
933 # IRQ 0 (System timer) - (INT 0x68)
934 IRQ0_SEL = .-IDT_BASE
935 .short 0 # offset 15:0
936 .short SYS_CODE64_SEL # selector 15:0
937 .byte 0 # 0 for interrupt gate
938 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
939 .short 0 # offset 31:16
940 .long 0 # offset 63:32
941 .long 0 # 0 for reserved
943 # IRQ 1 (8042 Keyboard controller) - (INT 0x69)
944 IRQ1_SEL = .-IDT_BASE
945 .short 0 # offset 15:0
946 .short SYS_CODE64_SEL # selector 15:0
947 .byte 0 # 0 for interrupt gate
948 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
949 .short 0 # offset 31:16
950 .long 0 # offset 63:32
951 .long 0 # for reserved
953 # Reserved - IRQ 2 redirect (IRQ 2) - DO NOT USE!!! - (INT 6ah)
954 IRQ2_SEL = .-IDT_BASE
955 .short 0 # offset 15:0
956 .short SYS_CODE64_SEL # selector 15:0
957 .byte 0 # 0 for interrupt gate
958 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
959 .short 0 # offset 31:16
960 .long 0 # offset 63:32
961 .long 0 # for reserved
963 # IRQ 3 (COM 2) - (INT 6bh)
964 IRQ3_SEL = .-IDT_BASE
965 .short 0 # offset 15:0
966 .short SYS_CODE64_SEL # selector 15:0
967 .byte 0 # 0 for interrupt gate
968 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
969 .short 0 # offset 31:16
970 .long 0 # offset 63:32
971 .long 0 # for reserved
973 # IRQ 4 (COM 1) - (INT 6ch)
974 IRQ4_SEL = .-IDT_BASE
975 .short 0 # offset 15:0
976 .short SYS_CODE64_SEL # selector 15:0
977 .byte 0 # 0 for interrupt gate
978 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
979 .short 0 # offset 31:16
980 .long 0 # offset 63:32
981 .long 0 # for reserved
983 # IRQ 5 (LPT 2) - (INT 6dh)
984 IRQ5_SEL = .-IDT_BASE
985 .short 0 # offset 15:0
986 .short SYS_CODE64_SEL # selector 15:0
987 .byte 0 # 0 for interrupt gate
988 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
989 .short 0 # offset 31:16
990 .long 0 # offset 63:32
991 .long 0 # for reserved
993 # IRQ 6 (Floppy controller) - (INT 6eh)
994 IRQ6_SEL = .-IDT_BASE
995 .short 0 # offset 15:0
996 .short SYS_CODE64_SEL # selector 15:0
997 .byte 0 # 0 for interrupt gate
998 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
999 .short 0 # offset 31:16
1000 .long 0 # offset 63:32
1001 .long 0 # for reserved
1003 # IRQ 7 (LPT 1) - (INT 6fh)
1004 IRQ7_SEL = .-IDT_BASE
1005 .short 0 # offset 15:0
1006 .short SYS_CODE64_SEL # selector 15:0
1007 .byte 0 # 0 for interrupt gate
1008 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1009 .short 0 # offset 31:16
1010 .long 0 # offset 63:32
1011 .long 0 # for reserved
1013 # IRQ 8 (RTC Alarm) - (INT 0x70)
1014 IRQ8_SEL = .-IDT_BASE
1015 .short 0 # offset 15:0
1016 .short SYS_CODE64_SEL # selector 15:0
1017 .byte 0 # 0 for interrupt gate
1018 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1019 .short 0 # offset 31:16
1020 .long 0 # offset 63:32
1021 .long 0 # for reserved
1023 # IRQ 9 - (INT 0x71)
1024 IRQ9_SEL = .-IDT_BASE
1025 .short 0 # offset 15:0
1026 .short SYS_CODE64_SEL # selector 15:0
1027 .byte 0 # 0 for interrupt gate
1028 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1029 .short 0 # offset 31:16
1030 .long 0 # offset 63:32
1031 .long 0 # for reserved
1033 # IRQ 10 - (INT 0x72)
1034 IRQ10_SEL = .-IDT_BASE
1035 .short 0 # offset 15:0
1036 .short SYS_CODE64_SEL # selector 15:0
1037 .byte 0 # 0 for interrupt gate
1038 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1039 .short 0 # offset 31:16
1040 .long 0 # offset 63:32
1041 .long 0 # for reserved
1043 # IRQ 11 - (INT 0x73)
1044 IRQ11_SEL = .-IDT_BASE
1045 .short 0 # offset 15:0
1046 .short SYS_CODE64_SEL # selector 15:0
1047 .byte 0 # 0 for interrupt gate
1048 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1049 .short 0 # offset 31:16
1050 .long 0 # offset 63:32
1051 .long 0 # for reserved
1053 # IRQ 12 (PS/2 mouse) - (INT 0x74)
1054 IRQ12_SEL = .-IDT_BASE
1055 .short 0 # offset 15:0
1056 .short SYS_CODE64_SEL # selector 15:0
1057 .byte 0 # 0 for interrupt gate
1058 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1059 .short 0 # offset 31:16
1060 .long 0 # offset 63:32
1061 .long 0 # for reserved
1063 # IRQ 13 (Floating point error) - (INT 0x75)
1064 IRQ13_SEL = .-IDT_BASE
1065 .short 0 # offset 15:0
1066 .short SYS_CODE64_SEL # selector 15:0
1067 .byte 0 # 0 for interrupt gate
1068 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1069 .short 0 # offset 31:16
1070 .long 0 # offset 63:32
1071 .long 0 # for reserved
1073 # IRQ 14 (Secondary IDE) - (INT 0x76)
1074 IRQ14_SEL = .-IDT_BASE
1075 .short 0 # offset 15:0
1076 .short SYS_CODE64_SEL # selector 15:0
1077 .byte 0 # 0 for interrupt gate
1078 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1079 .short 0 # offset 31:16
1080 .long 0 # offset 63:32
1081 .long 0 # for reserved
1083 # IRQ 15 (Primary IDE) - (INT 0x77)
1084 IRQ15_SEL = .-IDT_BASE
1085 .short 0 # offset 15:0
1086 .short SYS_CODE64_SEL # selector 15:0
1087 .byte 0 # 0 for interrupt gate
1088 .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present
1089 .short 0 # offset 31:16
1090 .long 0 # offset 63:32
1091 .long 0 # for reserved