SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

Diff markup

Differences between /hwcore/exception_wrappers.S (Article 6) and /hwcore/exception_wrappers.S (Article 9.5)


001 /* Copyright (C) 2004  The KOS Team               001 /* Copyright (C) 2004  The KOS Team
002    Copyright (C) 1999  Free Software Foundatio << 
003                                                   002 
004    This program is free software; you can redi    003    This program is free software; you can redistribute it and/or
005    modify it under the terms of the GNU Genera    004    modify it under the terms of the GNU General Public License
006    as published by the Free Software Foundatio    005    as published by the Free Software Foundation; either version 2
007    of the License, or (at your option) any lat    006    of the License, or (at your option) any later version.
008                                                   007    
009    This program is distributed in the hope tha    008    This program is distributed in the hope that it will be useful,
010    but WITHOUT ANY WARRANTY; without even the     009    but WITHOUT ANY WARRANTY; without even the implied warranty of
011    MERCHANTABILITY or FITNESS FOR A PARTICULAR    010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012    GNU General Public License for more details    011    GNU General Public License for more details.
013                                                   012    
014    You should have received a copy of the GNU     013    You should have received a copy of the GNU General Public License
015    along with this program; if not, write to t    014    along with this program; if not, write to the Free Software
016    Foundation, Inc., 59 Temple Place - Suite 3    015    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
017    USA.                                           016    USA. 
018 */                                                017 */
019 #include "exception.h"                            018 #include "exception.h"
                                                   >> 019 
                                                   >> 020 #include "segment.h"
020                                                   021          
021 .file "exception_wrappers.S"                      022 .file "exception_wrappers.S"
022                                                   023 
023 .text                                             024 .text
024                                                   025 
025 /* The address of the table of handlers (defin    026 /* The address of the table of handlers (defined in exception.c) */
026 .extern sos_exception_handler_array               027 .extern sos_exception_handler_array
027                                                   028 
028 /* The address of the table of wrappers (defin    029 /* The address of the table of wrappers (defined below, and shared
029    with exception.c */                            030    with exception.c */
030 .globl sos_exception_wrapper_array                031 .globl sos_exception_wrapper_array
031                                                   032 
032                                                !! 033 /** Update the kernel TSS in case we are switching to a thread in user
                                                   >> 034         mode in order to come back into the correct kernel stack */
                                                   >> 035 .extern sos_cpu_context_update_kernel_tss
                                                   >> 036 
                                                   >> 037 /* The address of the function to call to set back the user thread's
                                                   >> 038    MMU configuration upon return to user context */
                                                   >> 039 .extern sos_thread_prepare_exception_switch_back
                                                   >> 040 
033 /**                                               041 /**
034  * For exceptions with/without error code, ref    042  * For exceptions with/without error code, refer to Intel x86 doc vol 3,
035  * section 5.12                                   043  * section 5.12
036  */                                               044  */
037                                                   045 
038 /* These wrappers are for exceptions without e    046 /* These wrappers are for exceptions without error code */
039 .irp id,                              \           047 .irp id,                              \
040          SOS_EXCEPT_DIVIDE_ERROR,                 048          SOS_EXCEPT_DIVIDE_ERROR,                \
041          SOS_EXCEPT_DEBUG,                        049          SOS_EXCEPT_DEBUG,                       \
042          SOS_EXCEPT_NMI_INTERRUPT,                050          SOS_EXCEPT_NMI_INTERRUPT,               \
043          SOS_EXCEPT_BREAKPOINT,                   051          SOS_EXCEPT_BREAKPOINT,                  \
044          SOS_EXCEPT_OVERFLOW,                     052          SOS_EXCEPT_OVERFLOW,                    \
045          SOS_EXCEPT_BOUND_RANGE_EXCEDEED,         053          SOS_EXCEPT_BOUND_RANGE_EXCEDEED,        \
046          SOS_EXCEPT_INVALID_OPCODE,               054          SOS_EXCEPT_INVALID_OPCODE,              \
047          SOS_EXCEPT_DEVICE_NOT_AVAILABLE,         055          SOS_EXCEPT_DEVICE_NOT_AVAILABLE,        \
048          SOS_EXCEPT_COPROCESSOR_SEGMENT_OVERRU    056          SOS_EXCEPT_COPROCESSOR_SEGMENT_OVERRUN, \
049          SOS_EXCEPT_INTEL_RESERVED_1,             057          SOS_EXCEPT_INTEL_RESERVED_1,            \
050          SOS_EXCEPT_FLOATING_POINT_ERROR,         058          SOS_EXCEPT_FLOATING_POINT_ERROR,        \
051          SOS_EXCEPT_MACHINE_CHECK,                059          SOS_EXCEPT_MACHINE_CHECK,               \
052          SOS_EXCEPT_INTEL_RESERVED_2,             060          SOS_EXCEPT_INTEL_RESERVED_2,            \
053          SOS_EXCEPT_INTEL_RESERVED_3,             061          SOS_EXCEPT_INTEL_RESERVED_3,            \
054          SOS_EXCEPT_INTEL_RESERVED_4,             062          SOS_EXCEPT_INTEL_RESERVED_4,            \
055          SOS_EXCEPT_INTEL_RESERVED_5,             063          SOS_EXCEPT_INTEL_RESERVED_5,            \
056          SOS_EXCEPT_INTEL_RESERVED_6,             064          SOS_EXCEPT_INTEL_RESERVED_6,            \
057          SOS_EXCEPT_INTEL_RESERVED_7,             065          SOS_EXCEPT_INTEL_RESERVED_7,            \
058          SOS_EXCEPT_INTEL_RESERVED_8,             066          SOS_EXCEPT_INTEL_RESERVED_8,            \
059          SOS_EXCEPT_INTEL_RESERVED_9,             067          SOS_EXCEPT_INTEL_RESERVED_9,            \
060          SOS_EXCEPT_INTEL_RESERVED_10,            068          SOS_EXCEPT_INTEL_RESERVED_10,           \
061          SOS_EXCEPT_INTEL_RESERVED_11,            069          SOS_EXCEPT_INTEL_RESERVED_11,           \
062          SOS_EXCEPT_INTEL_RESERVED_12,            070          SOS_EXCEPT_INTEL_RESERVED_12,           \
063          SOS_EXCEPT_INTEL_RESERVED_13,            071          SOS_EXCEPT_INTEL_RESERVED_13,           \
064          SOS_EXCEPT_INTEL_RESERVED_14             072          SOS_EXCEPT_INTEL_RESERVED_14
065                                                   073  
066         .p2align 2, 0x90                          074         .p2align 2, 0x90
067         sos_exception_wrapper_\id:                075         sos_exception_wrapper_\id:
068         .type sos_exception_wrapper_\id,@funct    076         .type sos_exception_wrapper_\id,@function
069                                                   077  
070                 /* Fake error code */             078                 /* Fake error code */
071                 pushl $0                          079                 pushl $0
072                 /* Backup the context */          080                 /* Backup the context */
073                 pushl %ebp                        081                 pushl %ebp
074                 movl %esp, %ebp                   082                 movl %esp, %ebp
075                                                   083  
076                 pushl %edi                        084                 pushl %edi
077                 pushl %esi                        085                 pushl %esi
078                 pushl %edx                        086                 pushl %edx
079                 pushl %ecx                        087                 pushl %ecx
080                 pushl %ebx                        088                 pushl %ebx
081                 pushl %eax                        089                 pushl %eax
082                 subl  $2,%esp                     090                 subl  $2,%esp
083                 pushw %ss                         091                 pushw %ss
084                 pushw %ds                         092                 pushw %ds
085                 pushw %es                         093                 pushw %es
086                 pushw %fs                         094                 pushw %fs
087                 pushw %gs                         095                 pushw %gs
088                                                   096  
                                                   >> 097                 /* Set correct kernel segment descriptors' value */
                                                   >> 098                 movw $SOS_BUILD_SEGMENT_REG_VALUE(0, 0, SOS_SEG_KDATA), %di
                                                   >> 099                 pushw %di ; popw %ds
                                                   >> 100                 pushw %di ; popw %es
                                                   >> 101                 pushw %di ; popw %fs
                                                   >> 102                 pushw %di ; popw %gs
                                                   >> 103 
089                 /*                                104                 /*
090                  * Call the handler with the e    105                  * Call the handler with the exception number and the
091                  * address of the stored CPU c    106                  * address of the stored CPU context as arguments
092                  */                               107                  */
093                 pushl %esp                        108                 pushl %esp
094                 pushl $\id                        109                 pushl $\id
095                 leal  sos_exception_handler_ar    110                 leal  sos_exception_handler_array,%edi
096                 call  *\id*4(%edi)                111                 call  *\id*4(%edi)
097                 /* Unallocate the arguments pa    112                 /* Unallocate the arguments passed to the handler */
098                 addl  $8, %esp                    113                 addl  $8, %esp
099                                                   114 
                                                   >> 115                 /* Reconfigure the MMU if needed */
                                                   >> 116                 pushl %esp /* cpu_ctxt */
                                                   >> 117                 call sos_thread_prepare_exception_switch_back
                                                   >> 118                 addl  $4, %esp /* Unallocate the stack */
                                                   >> 119 
                                                   >> 120                 /* Prepare kernel TSS in case we are switching to a
                                                   >> 121                    user thread: we make sure that we will come back
                                                   >> 122                    into the kernel at a correct stack location */
                                                   >> 123                 pushl %esp /* Pass the location of the context we are
                                                   >> 124                               restoring to the function */
                                                   >> 125                 call sos_cpu_context_update_kernel_tss
                                                   >> 126                 addl $4, %esp
                                                   >> 127 
100                 /* Restore the context */         128                 /* Restore the context */
101                 popw  %gs                         129                 popw  %gs
102                 popw  %fs                         130                 popw  %fs
103                 popw  %es                         131                 popw  %es
104                 popw  %ds                         132                 popw  %ds
105                 popw  %ss                         133                 popw  %ss
106                 addl  $2,%esp                     134                 addl  $2,%esp
107                 popl  %eax                        135                 popl  %eax
108                 popl  %ebx                        136                 popl  %ebx
109                 popl  %ecx                        137                 popl  %ecx
110                 popl  %edx                        138                 popl  %edx
111                 popl  %esi                        139                 popl  %esi
112                 popl  %edi                        140                 popl  %edi
113                                                   141  
114                 popl  %ebp                        142                 popl  %ebp
115                 /* Remove fake error code */      143                 /* Remove fake error code */
116                 addl $4, %esp                     144                 addl $4, %esp
117                 iret                              145                 iret
118 .endr                                             146 .endr 
119                                                   147  
120         /* These wrappers are for exceptions w    148         /* These wrappers are for exceptions with error code */
121 .irp id,                              \           149 .irp id,                              \
122         SOS_EXCEPT_INVALID_TSS,                   150         SOS_EXCEPT_INVALID_TSS,                  \
123         SOS_EXCEPT_SEGMENT_NOT_PRESENT,           151         SOS_EXCEPT_SEGMENT_NOT_PRESENT,          \
124         SOS_EXCEPT_STACK_SEGMENT_FAULT,           152         SOS_EXCEPT_STACK_SEGMENT_FAULT,          \
125         SOS_EXCEPT_GENERAL_PROTECTION,            153         SOS_EXCEPT_GENERAL_PROTECTION,           \
126         SOS_EXCEPT_PAGE_FAULT,                    154         SOS_EXCEPT_PAGE_FAULT,                   \
127         SOS_EXCEPT_ALIGNEMENT_CHECK               155         SOS_EXCEPT_ALIGNEMENT_CHECK
128                                                   156  
129         .p2align 2, 0x90                          157         .p2align 2, 0x90
130         sos_exception_wrapper_\id:                158         sos_exception_wrapper_\id:
131         .type sos_exception_wrapper_\id,@funct    159         .type sos_exception_wrapper_\id,@function
132                                                   160  
133                 /* ret eflags */                  161                 /* ret eflags */
134                 /* ret cs */                      162                 /* ret cs */
135                 /* ret eip */                     163                 /* ret eip */
136                 /* Error code */                  164                 /* Error code */
137                                                   165  
138                 /* Backup the context */          166                 /* Backup the context */
139                 pushl %ebp                        167                 pushl %ebp
140                 movl %esp, %ebp                   168                 movl %esp, %ebp
141                                                   169  
142                 pushl %edi                        170                 pushl %edi
143                 pushl %esi                        171                 pushl %esi
144                 pushl %edx                        172                 pushl %edx
145                 pushl %ecx                        173                 pushl %ecx
146                 pushl %ebx                        174                 pushl %ebx
147                 pushl %eax                        175                 pushl %eax
148                 subl  $2,%esp                     176                 subl  $2,%esp
149                 pushw %ss                         177                 pushw %ss
150                 pushw %ds                         178                 pushw %ds
151                 pushw %es                         179                 pushw %es
152                 pushw %fs                         180                 pushw %fs
153                 pushw %gs                         181                 pushw %gs
154                                                   182 
                                                   >> 183                 /* Set correct kernel segment descriptors' value */
                                                   >> 184                 movw $SOS_BUILD_SEGMENT_REG_VALUE(0, 0, SOS_SEG_KDATA), %di
                                                   >> 185                 pushw %di ; popw %ds
                                                   >> 186                 pushw %di ; popw %es
                                                   >> 187                 pushw %di ; popw %fs
                                                   >> 188                 pushw %di ; popw %gs
                                                   >> 189 
155                 /*                                190                 /*
156                  * Call the handler with the e    191                  * Call the handler with the exception number and the
157                  * address of the stored CPU c    192                  * address of the stored CPU context as arguments
158                  */                               193                  */
159                 pushl %esp                        194                 pushl %esp
160                 pushl $\id                        195                 pushl $\id
161                 leal  sos_exception_handler_ar    196                 leal  sos_exception_handler_array,%edi
162                 call  *\id*4(%edi)                197                 call  *\id*4(%edi)
163                 /* Unallocate the arguments pa    198                 /* Unallocate the arguments passed to the handler */
164                 addl  $8, %esp                    199                 addl  $8, %esp
                                                   >> 200 
                                                   >> 201                 /* Reconfigure the MMU if needed */
                                                   >> 202                 pushl %esp /* cpu_ctxt */
                                                   >> 203                 call sos_thread_prepare_exception_switch_back
                                                   >> 204                 addl  $4, %esp /* Unallocate the stack */
                                                   >> 205 
                                                   >> 206                 /* Prepare kernel TSS in case we are switching to a
                                                   >> 207                    user thread: we make sure that we will come back
                                                   >> 208                    into the kernel at a correct stack location */
                                                   >> 209                 pushl %esp /* Pass the location of the context we are
                                                   >> 210                               restoring to the function */
                                                   >> 211                 call sos_cpu_context_update_kernel_tss
                                                   >> 212                 addl $4, %esp
165                                                   213 
166                 /* Restore the context */         214                 /* Restore the context */
167                 popw  %gs                         215                 popw  %gs
168                 popw  %fs                         216                 popw  %fs
169                 popw  %es                         217                 popw  %es
170                 popw  %ds                         218                 popw  %ds
171                 popw  %ss                         219                 popw  %ss
172                 addl  $2,%esp                     220                 addl  $2,%esp
173                 popl  %eax                        221                 popl  %eax
174                 popl  %ebx                        222                 popl  %ebx
175                 popl  %ecx                        223                 popl  %ecx
176                 popl  %edx                        224                 popl  %edx
177                 popl  %esi                        225                 popl  %esi
178                 popl  %edi                        226                 popl  %edi
179                 popl  %ebp                        227                 popl  %ebp
180                                                   228  
181                 /* Error code isn't compatible    229                 /* Error code isn't compatible with iretd */
182                 addl $4, %esp                     230                 addl $4, %esp
183                                                   231  
184                 iret                              232                 iret
185 .endr                                             233 .endr
186                                                   234 
187                                                   235 
188 /* Double fault handler not supported. We must    236 /* Double fault handler not supported. We must define it since we
189    define an entry for it in the sos_exception    237    define an entry for it in the sos_exception_wrapper_array. It
190    simply uses an alternate stack to display a    238    simply uses an alternate stack to display a message and stop the
191    system. qemu won't handle it correctly (see    239    system. qemu won't handle it correctly (see comment in qemu's
192    sources). */                                   240    sources). */
193 #define ALTERNATE_DOUBLE_FAULT_STACK_SIZE 512     241 #define ALTERNATE_DOUBLE_FAULT_STACK_SIZE 512
194 .irp id, SOS_EXCEPT_DOUBLE_FAULT                  242 .irp id, SOS_EXCEPT_DOUBLE_FAULT
195 .p2align 2, 0x90                                  243 .p2align 2, 0x90
196 sos_exception_wrapper_\id:                        244 sos_exception_wrapper_\id:
197 .type sos_exception_wrapper_\id,@function         245 .type sos_exception_wrapper_\id,@function
198 1:      cli /* Not necessary */                   246 1:      cli /* Not necessary */
199         movl $double_fault_alternate_stack, %e    247         movl $double_fault_alternate_stack, %eax
200         addl $ALTERNATE_DOUBLE_FAULT_STACK_SIZ    248         addl $ALTERNATE_DOUBLE_FAULT_STACK_SIZE, %eax
201         movl %eax, %esp                           249         movl %eax, %esp
202         pushl $msg_double_fault_not_supported     250         pushl $msg_double_fault_not_supported
203         call sos_display_fatal_error ; jmp 1b     251         call sos_display_fatal_error ; jmp 1b /* Not necessary */
204 .endr                                             252 .endr
205                                                   253 
206 .section ".rodata"                                254 .section ".rodata"
207 msg_double_fault_not_supported:                   255 msg_double_fault_not_supported:
208         .string "exception_wrappers.S: Double     256         .string "exception_wrappers.S: Double fault detected ! NOT SUPPORTED yet. System Halted."
209                                                   257 
210 /* Build the sos_irq_wrapper_array, shared wit    258 /* Build the sos_irq_wrapper_array, shared with interrupt.c */
211 .p2align 5, 0x0                                   259 .p2align 5, 0x0
212 sos_exception_wrapper_array:                      260 sos_exception_wrapper_array:
213         .irp id, 0,1,2,3,4,5,6,7,8,9,10,11,12,    261         .irp id, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, \
214                  16,17,18,19,20,21,22,23,24,25    262                  16,17,18,19,20,21,22,23,24,25,26,27,29,30,31
215           .long (sos_exception_wrapper_\id)       263           .long (sos_exception_wrapper_\id)
216         .endr                                     264         .endr
217                                                   265 
218 /* Alternate stack for double fault handler */    266 /* Alternate stack for double fault handler */
219 .bss                                              267 .bss
220 .p2align 2, 0x0                                   268 .p2align 2, 0x0
221 .size double_fault_alternate_stack, ALTERNATE_    269 .size double_fault_alternate_stack, ALTERNATE_DOUBLE_FAULT_STACK_SIZE
222 double_fault_alternate_stack:                     270 double_fault_alternate_stack:
223         .fill ALTERNATE_DOUBLE_FAULT_STACK_SIZ    271         .fill ALTERNATE_DOUBLE_FAULT_STACK_SIZE, 1, 0x0
                                                      

source navigation ] diff markup ] identifier search ] general search ]