Rev 1016 | Rev 1100 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1016 | Rev 1021 | ||
---|---|---|---|
Line 76... | Line 76... | ||
76 | # |
76 | # |
77 | # The handlers setup data segment registers |
77 | # The handlers setup data segment registers |
78 | # and call exc_dispatch(). |
78 | # and call exc_dispatch(). |
79 | # |
79 | # |
80 | .macro handler i n |
80 | .macro handler i n |
81 | push %eax |
- | |
82 | 81 | ||
83 | /* |
82 | /* |
- | 83 | * This macro distinguishes between two versions of ia32 exceptions. |
|
84 | * Test if this is interrupt with error word or not. |
84 | * One version has error word and the other does not have it. |
- | 85 | * The latter version fakes the error word on the stack so that the |
|
85 | * Be careful about width of the shift. |
86 | * handlers and istate_t can be the same for both types. |
86 | */ |
87 | */ |
87 | .iflt \i-32 |
- | |
88 | movl $(1<<\i), %eax |
- | |
89 | .else |
- | |
90 | movl $0, %eax |
- | |
91 | .endif |
- | |
92 | andl $ERROR_WORD_INTERRUPT_LIST, %eax |
- | |
93 | movl (%esp), %eax |
- | |
94 | 88 | ||
- | 89 | .iflt \i-32 |
|
- | 90 | .if (1 << \i) & ERROR_WORD_INTERRUPT_LIST |
|
95 | /* |
91 | /* |
96 | * If this interrupt/exception stores error word, |
- | |
97 | * we need to pop EAX. |
92 | * Version with error word. |
98 | * If this interrupt doesn't store error word, we emulate it |
- | |
99 | * for the sake of consistent istate structure. In that case |
- | |
100 | * we merely leave the EAX on the stack. |
93 | * Just take space equal to subl $4, %esp. |
101 | */ |
94 | */ |
102 | jz 0f |
95 | nop |
103 | 96 | nop |
|
104 | /* |
97 | nop |
- | 98 | .else |
|
- | 99 | /* |
|
105 | * This exception stores error word. |
100 | * Version without error word, |
106 | * Remove EAX from the stack. |
101 | */ |
- | 102 | subl $4, %esp |
|
- | 103 | .endif |
|
107 | */ |
104 | .else |
- | 105 | /* |
|
- | 106 | * Version without error word, |
|
- | 107 | */ |
|
108 | addl $4, %esp |
108 | subl $4, %esp |
- | 109 | .endif |
|
109 | 110 | ||
110 | 0: |
- | |
111 | pusha |
111 | pusha |
112 | movl %esp, %ebp |
112 | movl %esp, %ebp |
113 | push %ds |
113 | push %ds |
114 | push %es |
114 | push %es |
115 | push %fs |
115 | push %fs |
Line 136... | Line 136... | ||
136 | and $0xffffbfff,%eax |
136 | and $0xffffbfff,%eax |
137 | push %eax |
137 | push %eax |
138 | popfl |
138 | popfl |
139 | 139 | ||
140 | popa |
140 | popa |
141 | addl $4,%esp # Skip error word, whether real or fake. |
141 | addl $4,%esp # Skip error word, no matter whether real or fake. |
142 | iret |
142 | iret |
143 | 143 | ||
144 | .if (\n-\i)-1 |
144 | .if (\n-\i)-1 |
145 | handler "(\i+1)",\n |
145 | handler "(\i+1)",\n |
146 | .endif |
146 | .endif |