Subversion Repositories HelenOS-historic

Rev

Rev 717 | Rev 803 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 717 Rev 799
Line 32... Line 32...
32
 
32
 
33
	
33
	
34
#define ERROR_WORD_INTERRUPT_LIST 0x00027D00
34
#define ERROR_WORD_INTERRUPT_LIST 0x00027D00
35
 
35
 
36
#include <arch/pm.h>
36
#include <arch/pm.h>
-
 
37
#include <arch/context_offset.h>
37
	
38
	
38
.text
39
.text
39
.global interrupt_handlers
40
.global interrupt_handlers
40
.global panic_printf
41
.global panic_printf
41
 
42
 
Line 101... Line 102...
101
	movq $0xc0000080, %rcx
102
	movq $0xc0000080, %rcx
102
	rdmsr
103
	rdmsr
103
	ret 		
104
	ret 		
104
 
105
 
105
# Push all general purpose registers on stack except %rbp, %rsp
106
# Push all general purpose registers on stack except %rbp, %rsp
106
.macro push_all_gpr
107
.macro save_all_gpr
-
 
108
	movq %rbp, IOFFSET_RBP(%rsp)
107
	pushq %rax 
109
	movq %rax, IOFFSET_RAX(%rsp)
108
	pushq %rbx
110
	movq %rbx, IOFFSET_RBX(%rsp)
109
	pushq %rcx
111
	movq %rcx, IOFFSET_RCX(%rsp)
110
	pushq %rdx
112
	movq %rdx, IOFFSET_RDX(%rsp)
111
	pushq %rsi
113
	movq %rsi, IOFFSET_RSI(%rsp)
112
	pushq %rdi
114
	movq %rdi, IOFFSET_RDI(%rsp)
113
	pushq %r8
115
	movq %r8, IOFFSET_R8(%rsp)
114
	pushq %r9
116
	movq %r9, IOFFSET_R9(%rsp)
115
	pushq %r10
117
	movq %r10, IOFFSET_R10(%rsp)
116
	pushq %r11
118
	movq %r11, IOFFSET_R11(%rsp)
117
	pushq %r12
119
	movq %r12, IOFFSET_R12(%rsp)
118
	pushq %r13
120
	movq %r13, IOFFSET_R13(%rsp)
119
	pushq %r14
121
	movq %r14, IOFFSET_R14(%rsp)
120
	pushq %r15
122
	movq %r15, IOFFSET_R15(%rsp)
121
.endm
123
.endm
122
 
124
 
123
.macro pop_all_gpr
125
.macro restore_all_gpr
124
	popq %r15
126
	movq IOFFSET_RBP(%rsp), %rbp
125
	popq %r14
127
	movq IOFFSET_RAX(%rsp), %rax
126
	popq %r13
128
	movq IOFFSET_RBX(%rsp), %rbx
127
	popq %r12
129
	movq IOFFSET_RCX(%rsp), %rcx
128
	popq %r11
130
	movq IOFFSET_RDX(%rsp), %rdx
129
	popq %r10
131
	movq IOFFSET_RSI(%rsp), %rsi
130
	popq %r9
132
	movq IOFFSET_RDI(%rsp), %rdi
131
	popq %r8
133
	movq IOFFSET_R8(%rsp), %r8
132
	popq %rdi
134
	movq IOFFSET_R9(%rsp), %r9
-
 
135
	movq IOFFSET_R10(%rsp), %r10
133
	popq %rsi
136
	movq IOFFSET_R11(%rsp), %r11
134
	popq %rdx
137
	movq IOFFSET_R12(%rsp), %r12
135
	popq %rcx
138
	movq IOFFSET_R13(%rsp), %r13
136
	popq %rbx
139
	movq IOFFSET_R14(%rsp), %r14
137
	popq %rax
140
	movq IOFFSET_R15(%rsp), %r15
138
.endm
141
.endm
139
	
142
	
140
## Declare interrupt handlers
143
## Declare interrupt handlers
141
#
144
#
142
# Declare interrupt handlers for n interrupt
145
# Declare interrupt handlers for n interrupt
Line 144... Line 147...
144
#
147
#
145
# The handlers setup data segment registers
148
# The handlers setup data segment registers
146
# and call exc_dispatch().
149
# and call exc_dispatch().
147
#
150
#
148
.macro handler i n
151
.macro handler i n
149
	pushq %rbp
-
 
150
	movq %rsp,%rbp
152
	subq $IREGISTER_SPACE, %rsp
151
	
-
 
152
	push_all_gpr
153
	save_all_gpr
153
 
154
 
154
	movq $(\i),%rdi   # %rdi - first parameter
155
	movq $(\i),%rdi   # %rdi - first parameter
155
	movq %rbp, %rsi
-
 
156
	addq $8, %rsi     # %rsi - second parameter - original stack
156
	movq %rsp, %rsi   # %rsi - pointer to interrupt_context
157
	call exc_dispatch 	# exc_dispatch(i, stack)
157
	call exc_dispatch 	# exc_dispatch(i, stack)
158
 
158
 
159
# Test if this is interrupt with error word or not
159
# Test if this is interrupt with error word or not
160
	mov $\i,%cl;
160
	mov $\i,%cl;
161
	movl $1,%eax;
161
	movl $1,%eax;
Line 166... Line 166...
166
	and $ERROR_WORD_INTERRUPT_LIST,%eax;
166
	and $ERROR_WORD_INTERRUPT_LIST,%eax;
167
	jz 0f;
167
	jz 0f;
168
 
168
 
169
 
169
 
170
# Return with error word
170
# Return with error word
171
	pop_all_gpr
171
	restore_all_gpr
172
	
-
 
173
	popq %rbp;
172
	# $8 = Skip error word
174
	addq $8,%rsp;    # Skip error word
173
	addq $IREGISTER_SPACE + 0x8, %rsp
175
	iretq
174
	iretq
176
 
175
 
177
0:
176
0:
178
# Return with no error word
177
# Return with no error word
179
	pop_all_gpr
178
	restore_all_gpr
180
	
-
 
181
	popq %rbp
179
	addq $IREGISTER_SPACE, %rsp
182
	iretq
180
	iretq
183
 
181
 
184
	.if (\n-\i)-1
182
	.if (\n-\i)-1
185
	handler "(\i+1)",\n
183
	handler "(\i+1)",\n
186
	.endif
184
	.endif