source: trunk/hal/x86_64/core/hal_kentry.S @ 89

Last change on this file since 89 was 89, checked in by max@…, 7 years ago

Parse the IOAPIC structure in ACPI, map the IOAPIC, and enable
the keyboard interrupt. Its queue is not flushed yet.

File size: 3.8 KB
RevLine 
[25]1/*
[29]2 * hal_kentry.S - Entry points into the kernel (traps, interrupts, syscalls)
[25]3 *
[29]4 * Copyright (c) 2017 Maxime Villard
[25]5 *
6 * This file is part of ALMOS-MKH.
7 *
8 * ALMOS-MKH is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; version 2.0 of the License.
11 *
12 * ALMOS-MKH is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
[29]18 * along with ALMOS-MKH.; if not, write to the Free Software Foundation,
[25]19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
[29]22#define x86_ASM
23#include <hal_boot.h>
24#include <hal_kentry.h>
[86]25#include <hal_apic.h>
[25]26
[29]27#define TRAPENTRY(a)    \
[86]28        pushq   $(a);   \
29        jmp     alltraps;
[25]30
[29]31#define ZTRAPENTRY(a) \
[86]32        pushq   $0; \
[29]33        TRAPENTRY(a)
[25]34
[29]35        .text
36        .globl  hal_trap_entry
[86]37        .globl  hal_timer_intr
[89]38        .globl  hal_keyboard_intr
[29]39        .type   hal_trap_entry, @function
[86]40        .type   hal_timer_intr, @function
[89]41        .type   hal_keyboard_intr, @function
[25]42
[45]43        /*
44         * General exceptions.
45         */
[29]46ASM_ENTRY(x86_trap00)
47        ZTRAPENTRY(T_DIVIDE)
[25]48
[29]49ASM_ENTRY(x86_trap01)
50        ZTRAPENTRY(T_TRCTRAP)
[25]51
[29]52ASM_ENTRY(x86_trap02)
53        ZTRAPENTRY(T_NMI)
[25]54
[29]55ASM_ENTRY(x86_trap03)
56        ZTRAPENTRY(T_BPTFLT)
[25]57
[29]58ASM_ENTRY(x86_trap04)
59        ZTRAPENTRY(T_OFLOW)
[25]60
[29]61ASM_ENTRY(x86_trap05)
62        ZTRAPENTRY(T_BOUND)
[25]63
[29]64ASM_ENTRY(x86_trap06)
65        ZTRAPENTRY(T_PRIVINFLT)
[25]66
[29]67ASM_ENTRY(x86_trap07)
68        ZTRAPENTRY(T_DNA)
[25]69
[29]70ASM_ENTRY(x86_trap08)
71        TRAPENTRY(T_DOUBLEFLT)
[25]72
[29]73ASM_ENTRY(x86_trap09)
74        ZTRAPENTRY(T_FPOPFLT)
[25]75
[29]76ASM_ENTRY(x86_trap0a)
77        TRAPENTRY(T_TSSFLT)
[25]78
[29]79ASM_ENTRY(x86_trap0b)
[82]80        TRAPENTRY(T_SEGNPFLT)
[25]81
[29]82ASM_ENTRY(x86_trap0c)
[82]83        TRAPENTRY(T_STKFLT)
[25]84
[29]85ASM_ENTRY(x86_trap0d)
[82]86        TRAPENTRY(T_PROTFLT)
[25]87
[29]88ASM_ENTRY(x86_trap0e)
89        TRAPENTRY(T_PAGEFLT)
[25]90
[29]91ASM_ENTRY(x86_trap0f)
92        ZTRAPENTRY(T_ASTFLT)
[25]93
[29]94ASM_ENTRY(x86_trap10)
95        ZTRAPENTRY(T_ARITHTRAP)
[25]96
[29]97ASM_ENTRY(x86_trap11)
98        TRAPENTRY(T_ALIGNFLT)
[25]99
[29]100ASM_ENTRY(x86_trap12)
101        ZTRAPENTRY(T_MCA)
[25]102
[29]103ASM_ENTRY(x86_trap13)
104        ZTRAPENTRY(T_XMM)
[25]105
[29]106ASM_ENTRY(x86_trap14)
107ASM_ENTRY(x86_trap15)
108ASM_ENTRY(x86_trap16)
109ASM_ENTRY(x86_trap17)
110ASM_ENTRY(x86_trap18)
111ASM_ENTRY(x86_trap19)
112ASM_ENTRY(x86_trap1a)
113ASM_ENTRY(x86_trap1b)
114ASM_ENTRY(x86_trap1c)
115ASM_ENTRY(x86_trap1d)
116ASM_ENTRY(x86_trap1e)
117ASM_ENTRY(x86_trap1f)
[80]118ASM_ENTRY(x86_rsvd)
[29]119        /* 20 - 31 reserved for future exp */
120        ZTRAPENTRY(T_RESERVED)
[25]121
[45]122        /*
[89]123         * APIC interrupts.
[45]124         */
[86]125ASM_ENTRY(x86_lapic_spurious)
[45]126        ZTRAPENTRY(T_ASTFLT)
127
[86]128ASM_ENTRY(x86_lapic_timer)
129        pushq   $0
130        pushq   $T_ASTFLT
131        INTR_SAVE_REGS
132
133        movq    %rsp,%rdi
134        call    hal_timer_intr
135
136        movq    lapic_va(%rip),%rax
137        movl    $0,LAPIC_EOI(%rax)
138
139        INTR_RESTORE_REGS
140        addq    $16,%rsp
141        iretq
142
[89]143ASM_ENTRY(x86_ioapic_keyboard)
144        pushq   $0
145        pushq   $T_ASTFLT
146        INTR_SAVE_REGS
147
148        movq    %rsp,%rdi
149        call    hal_keyboard_intr
150
151        movq    lapic_va(%rip),%rax
152        movl    $0,LAPIC_EOI(%rax)
153
154        INTR_RESTORE_REGS
155        addq    $16,%rsp
156        iretq
157
[29]158/*
159 * Arguments pushed on the stack:
160 *  tf_trapno
161 *  tf_err: Dummy inserted if not defined
162 *  tf_rip
163 *  tf_cs
164 *  tf_rflags
165 *  tf_rsp
166 *  tf_ss
167 */
168alltraps:
169        movq    %rsp,%rdi
170        call    hal_trap_entry
171        /* NOTREACHED */
[25]172
[29]173        .data
174        .globl  x86_traps
[45]175        .globl  x86_intrs
[29]176        .type   x86_traps, @object
[45]177        .type   x86_intrs, @object
[25]178
[29]179        .align  64
180x86_traps:
181        .quad   x86_trap00, x86_trap01
182        .quad   x86_trap02, x86_trap03
183        .quad   x86_trap04, x86_trap05
184        .quad   x86_trap06, x86_trap07
185        .quad   x86_trap08, x86_trap09
186        .quad   x86_trap0a, x86_trap0b
187        .quad   x86_trap0c, x86_trap0d
188        .quad   x86_trap0e, x86_trap0f
189        .quad   x86_trap10, x86_trap11
190        .quad   x86_trap12, x86_trap13
191        .quad   x86_trap14, x86_trap15
192        .quad   x86_trap16, x86_trap17
193        .quad   x86_trap18, x86_trap19
194        .quad   x86_trap1a, x86_trap1b
195        .quad   x86_trap1c, x86_trap1d
196        .quad   x86_trap1e, x86_trap1f
197
[45]198x86_intrs:
[86]199        .quad   x86_lapic_spurious
200        .quad   x86_lapic_timer
[89]201        .quad   x86_ioapic_keyboard
[45]202
Note: See TracBrowser for help on using the repository browser.