Diff markup
001 /* Copyright (C) 2004 The KOS Team 001 /* Copyright (C) 2004 The KOS Team
002 Copyright (C) 1999 Free Software Foundatio 002 Copyright (C) 1999 Free Software Foundation, Inc.
003 003
004 This program is free software; you can redi 004 This program is free software; you can redistribute it and/or
005 modify it under the terms of the GNU Genera 005 modify it under the terms of the GNU General Public License
006 as published by the Free Software Foundatio 006 as published by the Free Software Foundation; either version 2
007 of the License, or (at your option) any lat 007 of the License, or (at your option) any later version.
008 008
009 This program is distributed in the hope tha 009 This program is distributed in the hope that it will be useful,
010 but WITHOUT ANY WARRANTY; without even the 010 but WITHOUT ANY WARRANTY; without even the implied warranty of
011 MERCHANTABILITY or FITNESS FOR A PARTICULAR 011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012 GNU General Public License for more details 012 GNU General Public License for more details.
013 013
014 You should have received a copy of the GNU 014 You should have received a copy of the GNU General Public License
015 along with this program; if not, write to t 015 along with this program; if not, write to the Free Software
016 Foundation, Inc., 59 Temple Place - Suite 3 016 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
017 USA. 017 USA.
018 */ 018 */
019 #define ASM_SOURCE 1 019 #define ASM_SOURCE 1
020 020
021 .file "irq_wrappers.S" 021 .file "irq_wrappers.S"
022 022
023 .text 023 .text
024 024
025 /** The address of the table of handlers (defi !! 025 /* The address of the table of handlers (defined in irq.c) */
026 .extern sos_irq_handler_array 026 .extern sos_irq_handler_array
027 027
028 /** The address of the table of wrappers (defi !! 028 /* The address of the table of wrappers (defined below, and shared
029 with irq.c */ 029 with irq.c */
030 .globl sos_irq_wrapper_array 030 .globl sos_irq_wrapper_array
031 031
032 /** The variable holding the nested level of t <<
033 .extern sos_irq_nested_level_counter <<
034 032
035 /* These pre-handlers are for IRQ (Master PIC) 033 /* These pre-handlers are for IRQ (Master PIC) */
036 .irp id, 0,1,2,3,4,5,6,7 034 .irp id, 0,1,2,3,4,5,6,7
037 035
038 .p2align 2, 0x90 036 .p2align 2, 0x90
039 037
040 sos_irq_wrapper_\id: 038 sos_irq_wrapper_\id:
041 .type sos_irq_wrapper_\id,@function 039 .type sos_irq_wrapper_\id,@function
042 040
043 /* 041 /*
044 * Backup the CPU context 042 * Backup the CPU context
045 */ 043 */
046 044
047 /* Fake error code */ 045 /* Fake error code */
048 pushl $0 046 pushl $0
049 047
050 /* Backup the actual context * 048 /* Backup the actual context */
051 pushl %ebp 049 pushl %ebp
052 movl %esp, %ebp 050 movl %esp, %ebp
053 051
054 pushl %edi 052 pushl %edi
055 pushl %esi 053 pushl %esi
056 pushl %edx 054 pushl %edx
057 pushl %ecx 055 pushl %ecx
058 pushl %ebx 056 pushl %ebx
059 pushl %eax 057 pushl %eax
060 subl $2,%esp 058 subl $2,%esp
061 pushw %ss 059 pushw %ss
062 pushw %ds 060 pushw %ds
063 pushw %es 061 pushw %es
064 pushw %fs 062 pushw %fs
065 pushw %gs 063 pushw %gs
066 064
067 /* <<
068 * Increment IRQ nested level <<
069 */ <<
070 incl sos_irq_nested_level_coun <<
071 <<
072 /* Send EOI to PIC. See Intel 065 /* Send EOI to PIC. See Intel 8259 datasheet
073 available on Kos website */ 066 available on Kos website */
074 movb $0x20, %al 067 movb $0x20, %al
075 outb %al, $0x20 068 outb %al, $0x20
076 069
077 /* 070 /*
078 * Call the handler with the I !! 071 * Call the handler with IRQ number as argument
079 * address of the stored CPU c <<
080 */ 072 */
081 pushl %esp <<
082 pushl $\id 073 pushl $\id
083 leal sos_irq_handler_array,%e 074 leal sos_irq_handler_array,%edi
084 call *\id*4(%edi) 075 call *\id*4(%edi)
085 /* Unallocate the arguments pa !! 076 addl $4, %esp
086 addl $8, %esp <<
087 <<
088 /* <<
089 * Decrement IRQ nested level <<
090 */ <<
091 cli /* Just in case we messed <<
092 subl $1, sos_irq_nested_level_ <<
093 <<
094 /* sos_irq_nested_level_counte <<
095 jnc 2f <<
096 <<
097 1: /* Yes: Print fatal error mess <<
098 pushl $msg_nested_level_overfl <<
099 call sos_display_fatal_error <<
100 addl $4, %esp ; jmp 1b <<
101 /* Never returns */ <<
102 <<
103 2: /* No: all right ! */ <<
104 077
105 /* Restore the context */ 078 /* Restore the context */
106 popw %gs 079 popw %gs
107 popw %fs 080 popw %fs
108 popw %es 081 popw %es
109 popw %ds 082 popw %ds
110 popw %ss 083 popw %ss
111 addl $2,%esp 084 addl $2,%esp
112 popl %eax 085 popl %eax
113 popl %ebx 086 popl %ebx
114 popl %ecx 087 popl %ecx
115 popl %edx 088 popl %edx
116 popl %esi 089 popl %esi
117 popl %edi 090 popl %edi
118 popl %ebp 091 popl %ebp
119 092
120 /* Remove fake error code */ 093 /* Remove fake error code */
121 addl $4, %esp 094 addl $4, %esp
122 095
123 iret 096 iret
124 .endr 097 .endr
125 098
126 099
127 /* These pre-handlers are for IRQ (Slave PIC) 100 /* These pre-handlers are for IRQ (Slave PIC) */
128 .irp id, 8,9,10,11,12,13,14,15 101 .irp id, 8,9,10,11,12,13,14,15
129 102
130 .p2align 2, 0x90 103 .p2align 2, 0x90
131 104
132 sos_irq_wrapper_\id: 105 sos_irq_wrapper_\id:
133 .type sos_irq_wrapper_\id,@function 106 .type sos_irq_wrapper_\id,@function
134 107
135 /* 108 /*
136 * Backup the CPU context 109 * Backup the CPU context
137 */ 110 */
138 111
139 /* Fake error code */ 112 /* Fake error code */
140 pushl $0 113 pushl $0
141 114
142 /* Backup the actual context * 115 /* Backup the actual context */
143 pushl %ebp 116 pushl %ebp
144 movl %esp, %ebp 117 movl %esp, %ebp
145 118
146 pushl %edi 119 pushl %edi
147 pushl %esi 120 pushl %esi
148 pushl %edx 121 pushl %edx
149 pushl %ecx 122 pushl %ecx
150 pushl %ebx 123 pushl %ebx
151 pushl %eax 124 pushl %eax
152 subl $2,%esp 125 subl $2,%esp
153 pushw %ss 126 pushw %ss
154 pushw %ds 127 pushw %ds
155 pushw %es 128 pushw %es
156 pushw %fs 129 pushw %fs
157 pushw %gs 130 pushw %gs
158 131
159 /* <<
160 * Increment IRQ nested level <<
161 */ <<
162 incl sos_irq_nested_level_coun <<
163 <<
164 /* Send EOI to PIC. See Intel 132 /* Send EOI to PIC. See Intel 8259 datasheet
165 available on Kos website */ 133 available on Kos website */
166 movb $0x20, %al 134 movb $0x20, %al
167 outb %al, $0xa0 135 outb %al, $0xa0
168 outb %al, $0x20 136 outb %al, $0x20
169 137
170 /* 138 /*
171 * Call the handler with the I !! 139 * Call the handler with IRQ number as argument
172 * address of the stored CPU c <<
173 */ 140 */
174 pushl %esp <<
175 pushl $\id 141 pushl $\id
176 leal sos_irq_handler_array,%e 142 leal sos_irq_handler_array,%edi
177 call *\id*4(%edi) 143 call *\id*4(%edi)
178 /* Unallocate the arguments pa !! 144 addl $4, %esp
179 addl $8, %esp <<
180 <<
181 /* <<
182 * Decrement IRQ nested level <<
183 */ <<
184 cli /* Just in case we messed <<
185 subl $1, sos_irq_nested_level_ <<
186 <<
187 /* sos_irq_nested_level_counte <<
188 jnc 2f <<
189 <<
190 1: /* Yes: Print fatal error mess <<
191 pushl $msg_nested_level_overfl <<
192 call sos_display_fatal_error <<
193 addl $4, %esp ; jmp 1b <<
194 /* Never returns */ <<
195 <<
196 2: /* No: all right ! */ <<
197 145
198 /* Restore the context */ 146 /* Restore the context */
199 popw %gs 147 popw %gs
200 popw %fs 148 popw %fs
201 popw %es 149 popw %es
202 popw %ds 150 popw %ds
203 popw %ss 151 popw %ss
204 addl $2,%esp 152 addl $2,%esp
205 popl %eax 153 popl %eax
206 popl %ebx 154 popl %ebx
207 popl %ecx 155 popl %ecx
208 popl %edx 156 popl %edx
209 popl %esi 157 popl %esi
210 popl %edi 158 popl %edi
211 popl %ebp 159 popl %ebp
212 160
213 /* Remove fake error code */ 161 /* Remove fake error code */
214 addl $4, %esp 162 addl $4, %esp
215 163
216 iret 164 iret
217 .endr 165 .endr
218 166
219 .section ".rodata" <<
220 msg_nested_level_overflow: <<
221 .string "irq_wrappers.S: IRQ Nested le <<
222 <<
223 /* Build the sos_irq_wrapper_array, shared wit 167 /* Build the sos_irq_wrapper_array, shared with irq.c */
>> 168 .section ".rodata"
224 .p2align 5, 0x0 169 .p2align 5, 0x0
225 sos_irq_wrapper_array: 170 sos_irq_wrapper_array:
226 .irp id, 0,1,2,3,4,5,6,7,8,9,10,11,12, 171 .irp id, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
227 .long (sos_irq_wrapper_\id) 172 .long (sos_irq_wrapper_\id)
228 .endr 173 .endr