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 4) and /hwcore/exception_wrappers.S (Article 6.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"
020                                                   019          
021 .file "exception_wrappers.S"                      020 .file "exception_wrappers.S"
022                                                   021 
023 .text                                             022 .text
024                                                   023 
025 /* The address of the table of handlers (defin    024 /* The address of the table of handlers (defined in exception.c) */
026 .extern sos_exception_handler_array               025 .extern sos_exception_handler_array
027                                                   026 
028 /* The address of the table of wrappers (defin    027 /* The address of the table of wrappers (defined below, and shared
029    with exception.c */                            028    with exception.c */
030 .globl sos_exception_wrapper_array                029 .globl sos_exception_wrapper_array
031                                                   030 
032                                                << 
033 /**                                               031 /**
034  * For exceptions with/without error code, ref    032  * For exceptions with/without error code, refer to Intel x86 doc vol 3,
035  * section 5.12                                   033  * section 5.12
036  */                                               034  */
037                                                   035 
038 /* These wrappers are for exceptions without e    036 /* These wrappers are for exceptions without error code */
039 .irp id,                              \           037 .irp id,                              \
040          SOS_EXCEPT_DIVIDE_ERROR,                 038          SOS_EXCEPT_DIVIDE_ERROR,                \
041          SOS_EXCEPT_DEBUG,                        039          SOS_EXCEPT_DEBUG,                       \
042          SOS_EXCEPT_NMI_INTERRUPT,                040          SOS_EXCEPT_NMI_INTERRUPT,               \
043          SOS_EXCEPT_BREAKPOINT,                   041          SOS_EXCEPT_BREAKPOINT,                  \
044          SOS_EXCEPT_OVERFLOW,                     042          SOS_EXCEPT_OVERFLOW,                    \
045          SOS_EXCEPT_BOUND_RANGE_EXCEDEED,         043          SOS_EXCEPT_BOUND_RANGE_EXCEDEED,        \
046          SOS_EXCEPT_INVALID_OPCODE,               044          SOS_EXCEPT_INVALID_OPCODE,              \
047          SOS_EXCEPT_DEVICE_NOT_AVAILABLE,         045          SOS_EXCEPT_DEVICE_NOT_AVAILABLE,        \
048          SOS_EXCEPT_COPROCESSOR_SEGMENT_OVERRU    046          SOS_EXCEPT_COPROCESSOR_SEGMENT_OVERRUN, \
049          SOS_EXCEPT_INTEL_RESERVED_1,             047          SOS_EXCEPT_INTEL_RESERVED_1,            \
050          SOS_EXCEPT_FLOATING_POINT_ERROR,         048          SOS_EXCEPT_FLOATING_POINT_ERROR,        \
051          SOS_EXCEPT_MACHINE_CHECK,                049          SOS_EXCEPT_MACHINE_CHECK,               \
052          SOS_EXCEPT_INTEL_RESERVED_2,             050          SOS_EXCEPT_INTEL_RESERVED_2,            \
053          SOS_EXCEPT_INTEL_RESERVED_3,             051          SOS_EXCEPT_INTEL_RESERVED_3,            \
054          SOS_EXCEPT_INTEL_RESERVED_4,             052          SOS_EXCEPT_INTEL_RESERVED_4,            \
055          SOS_EXCEPT_INTEL_RESERVED_5,             053          SOS_EXCEPT_INTEL_RESERVED_5,            \
056          SOS_EXCEPT_INTEL_RESERVED_6,             054          SOS_EXCEPT_INTEL_RESERVED_6,            \
057          SOS_EXCEPT_INTEL_RESERVED_7,             055          SOS_EXCEPT_INTEL_RESERVED_7,            \
058          SOS_EXCEPT_INTEL_RESERVED_8,             056          SOS_EXCEPT_INTEL_RESERVED_8,            \
059          SOS_EXCEPT_INTEL_RESERVED_9,             057          SOS_EXCEPT_INTEL_RESERVED_9,            \
060          SOS_EXCEPT_INTEL_RESERVED_10,            058          SOS_EXCEPT_INTEL_RESERVED_10,           \
061          SOS_EXCEPT_INTEL_RESERVED_11,            059          SOS_EXCEPT_INTEL_RESERVED_11,           \
062          SOS_EXCEPT_INTEL_RESERVED_12,            060          SOS_EXCEPT_INTEL_RESERVED_12,           \
063          SOS_EXCEPT_INTEL_RESERVED_13,            061          SOS_EXCEPT_INTEL_RESERVED_13,           \
064          SOS_EXCEPT_INTEL_RESERVED_14             062          SOS_EXCEPT_INTEL_RESERVED_14
065                                                   063  
066         .p2align 2, 0x90                          064         .p2align 2, 0x90
067         sos_exception_wrapper_\id:                065         sos_exception_wrapper_\id:
068         .type sos_exception_wrapper_\id,@funct    066         .type sos_exception_wrapper_\id,@function
069                                                   067  
070                 /* Fake error code */             068                 /* Fake error code */
071                 pushl $0                          069                 pushl $0
072                 /* Backup the context */          070                 /* Backup the context */
073                 pushl %ebp                        071                 pushl %ebp
074                 movl %esp, %ebp                   072                 movl %esp, %ebp
075                                                   073  
076                 pushl %edi                        074                 pushl %edi
077                 pushl %esi                        075                 pushl %esi
078                 pushl %edx                        076                 pushl %edx
079                 pushl %ecx                        077                 pushl %ecx
080                 pushl %ebx                        078                 pushl %ebx
081                 pushl %eax                        079                 pushl %eax
082                 subl  $2,%esp                     080                 subl  $2,%esp
083                 pushw %ss                         081                 pushw %ss
084                 pushw %ds                         082                 pushw %ds
085                 pushw %es                         083                 pushw %es
086                 pushw %fs                         084                 pushw %fs
087                 pushw %gs                         085                 pushw %gs
088                                                   086  
089                 /* Call the handler with excep !! 087                 /*
090                  * argument */                 !! 088                  * Call the handler with the exception number and the
                                                   >> 089                  * address of the stored CPU context as arguments
                                                   >> 090                  */
                                                   >> 091                 pushl %esp
091                 pushl $\id                        092                 pushl $\id
092                 leal  sos_exception_handler_ar    093                 leal  sos_exception_handler_array,%edi
093                 call  *\id*4(%edi)                094                 call  *\id*4(%edi)
094                 addl  $4, %esp                 !! 095                 /* Unallocate the arguments passed to the handler */
                                                   >> 096                 addl  $8, %esp
095                                                   097 
096                 /* Restore the context */         098                 /* Restore the context */
097                 popw  %gs                         099                 popw  %gs
098                 popw  %fs                         100                 popw  %fs
099                 popw  %es                         101                 popw  %es
100                 popw  %ds                         102                 popw  %ds
101                 popw  %ss                         103                 popw  %ss
102                 addl  $2,%esp                     104                 addl  $2,%esp
103                 popl  %eax                        105                 popl  %eax
104                 popl  %ebx                        106                 popl  %ebx
105                 popl  %ecx                        107                 popl  %ecx
106                 popl  %edx                        108                 popl  %edx
107                 popl  %esi                        109                 popl  %esi
108                 popl  %edi                        110                 popl  %edi
109                                                   111  
110                 popl  %ebp                        112                 popl  %ebp
111                 /* Remove fake error code */      113                 /* Remove fake error code */
112                 addl $4, %esp                     114                 addl $4, %esp
113                 iret                              115                 iret
114 .endr                                             116 .endr 
115                                                   117  
116         /* These wrappers are for exceptions w    118         /* These wrappers are for exceptions with error code */
117 .irp id,                              \           119 .irp id,                              \
118         SOS_EXCEPT_INVALID_TSS,                   120         SOS_EXCEPT_INVALID_TSS,                  \
119         SOS_EXCEPT_SEGMENT_NOT_PRESENT,           121         SOS_EXCEPT_SEGMENT_NOT_PRESENT,          \
120         SOS_EXCEPT_STACK_SEGMENT_FAULT,           122         SOS_EXCEPT_STACK_SEGMENT_FAULT,          \
121         SOS_EXCEPT_GENERAL_PROTECTION,            123         SOS_EXCEPT_GENERAL_PROTECTION,           \
122         SOS_EXCEPT_PAGE_FAULT,                    124         SOS_EXCEPT_PAGE_FAULT,                   \
123         SOS_EXCEPT_ALIGNEMENT_CHECK               125         SOS_EXCEPT_ALIGNEMENT_CHECK
124                                                   126  
125         .p2align 2, 0x90                          127         .p2align 2, 0x90
126         sos_exception_wrapper_\id:                128         sos_exception_wrapper_\id:
127         .type sos_exception_wrapper_\id,@funct    129         .type sos_exception_wrapper_\id,@function
128                                                   130  
129                 /* ret eflags */                  131                 /* ret eflags */
130                 /* ret cs */                      132                 /* ret cs */
131                 /* ret eip */                     133                 /* ret eip */
132                 /* Error code */                  134                 /* Error code */
133                                                   135  
134                 /* Backup the context */          136                 /* Backup the context */
135                 pushl %ebp                        137                 pushl %ebp
136                 movl %esp, %ebp                   138                 movl %esp, %ebp
137                                                   139  
138                 pushl %edi                        140                 pushl %edi
139                 pushl %esi                        141                 pushl %esi
140                 pushl %edx                        142                 pushl %edx
141                 pushl %ecx                        143                 pushl %ecx
142                 pushl %ebx                        144                 pushl %ebx
143                 pushl %eax                        145                 pushl %eax
144                 subl  $2,%esp                     146                 subl  $2,%esp
145                 pushw %ss                         147                 pushw %ss
146                 pushw %ds                         148                 pushw %ds
147                 pushw %es                         149                 pushw %es
148                 pushw %fs                         150                 pushw %fs
149                 pushw %gs                         151                 pushw %gs
150                                                   152 
151                 /* Call the handler with excep !! 153                 /*
152                  * argument */                 !! 154                  * Call the handler with the exception number and the
                                                   >> 155                  * address of the stored CPU context as arguments
                                                   >> 156                  */
                                                   >> 157                 pushl %esp
153                 pushl $\id                        158                 pushl $\id
154                 leal  sos_exception_handler_ar    159                 leal  sos_exception_handler_array,%edi
155                 call  *\id*4(%edi)                160                 call  *\id*4(%edi)
156                 addl  $4, %esp                 !! 161                 /* Unallocate the arguments passed to the handler */
                                                   >> 162                 addl  $8, %esp
157                                                   163 
158                 /* Restore the context */         164                 /* Restore the context */
159                 popw  %gs                         165                 popw  %gs
160                 popw  %fs                         166                 popw  %fs
161                 popw  %es                         167                 popw  %es
162                 popw  %ds                         168                 popw  %ds
163                 popw  %ss                         169                 popw  %ss
164                 addl  $2,%esp                     170                 addl  $2,%esp
165                 popl  %eax                        171                 popl  %eax
166                 popl  %ebx                        172                 popl  %ebx
167                 popl  %ecx                        173                 popl  %ecx
168                 popl  %edx                        174                 popl  %edx
169                 popl  %esi                        175                 popl  %esi
170                 popl  %edi                        176                 popl  %edi
171                 popl  %ebp                        177                 popl  %ebp
172                                                   178  
173                 /* Error code isn't compatible    179                 /* Error code isn't compatible with iretd */
174                 addl $4, %esp                     180                 addl $4, %esp
175                                                   181  
176                 iret                              182                 iret
177 .endr                                             183 .endr
178                                                   184 
179                                                   185 
180 /* Double fault handler not supported. We must    186 /* Double fault handler not supported. We must define it since we
181    define an entry for it in the sos_exception !! 187    define an entry for it in the sos_exception_wrapper_array. It
                                                   >> 188    simply uses an alternate stack to display a message and stop the
                                                   >> 189    system. qemu won't handle it correctly (see comment in qemu's
                                                   >> 190    sources). */
                                                   >> 191 #define ALTERNATE_DOUBLE_FAULT_STACK_SIZE 512
182 .irp id, SOS_EXCEPT_DOUBLE_FAULT                  192 .irp id, SOS_EXCEPT_DOUBLE_FAULT
183 .p2align 2, 0x90                                  193 .p2align 2, 0x90
184 sos_exception_wrapper_\id:                        194 sos_exception_wrapper_\id:
185 .type sos_exception_wrapper_\id,@function         195 .type sos_exception_wrapper_\id,@function
186 1:      hlt                                    !! 196 1:      cli /* Not necessary */
187         jmp 1b /* Machine halting */           !! 197         movl $double_fault_alternate_stack, %eax
                                                   >> 198         addl $ALTERNATE_DOUBLE_FAULT_STACK_SIZE, %eax
                                                   >> 199         movl %eax, %esp
                                                   >> 200         pushl $msg_double_fault_not_supported
                                                   >> 201         call sos_display_fatal_error ; jmp 1b /* Not necessary */
188 .endr                                             202 .endr
189                                                   203 
190 /* Build the sos_irq_wrapper_array, shared wit << 
191 .section ".rodata"                                204 .section ".rodata"
                                                   >> 205 msg_double_fault_not_supported:
                                                   >> 206         .string "exception_wrappers.S: Double fault detected ! NOT SUPPORTED yet. System Halted."
                                                   >> 207 
                                                   >> 208 /* Build the sos_irq_wrapper_array, shared with interrupt.c */
192 .p2align 5, 0x0                                   209 .p2align 5, 0x0
193 sos_exception_wrapper_array:                      210 sos_exception_wrapper_array:
194         .irp id, 0,1,2,3,4,5,6,7,8,9,10,11,12,    211         .irp id, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, \
195                  16,17,18,19,20,21,22,23,24,25    212                  16,17,18,19,20,21,22,23,24,25,26,27,29,30,31
196           .long (sos_exception_wrapper_\id)       213           .long (sos_exception_wrapper_\id)
197         .endr                                     214         .endr
                                                   >> 215 
                                                   >> 216 /* Alternate stack for double fault handler */
                                                   >> 217 .bss
                                                   >> 218 .p2align 2, 0x0
                                                   >> 219 .size double_fault_alternate_stack, ALTERNATE_DOUBLE_FAULT_STACK_SIZE
                                                   >> 220 double_fault_alternate_stack:
                                                   >> 221         .fill ALTERNATE_DOUBLE_FAULT_STACK_SIZE, 1, 0x0
                                                      

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