summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/kvm/lib/x86_64/handlers.S
blob: 7629819734afd7871e66c1c04940e663580fb72f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
handle_exception:
	push %r15
	push %r14
	push %r13
	push %r12
	push %r11
	push %r10
	push %r9
	push %r8

	push %rdi
	push %rsi
	push %rbp
	push %rbx
	push %rdx
	push %rcx
	push %rax
	mov %rsp, %rdi

	call route_exception

	pop %rax
	pop %rcx
	pop %rdx
	pop %rbx
	pop %rbp
	pop %rsi
	pop %rdi
	pop %r8
	pop %r9
	pop %r10
	pop %r11
	pop %r12
	pop %r13
	pop %r14
	pop %r15

	/* Discard vector and error code. */
	add $16, %rsp
	iretq

/*
 * Build the handle_exception wrappers which push the vector/error code on the
 * stack and an array of pointers to those wrappers.
 */
.pushsection .rodata
.globl idt_handlers
idt_handlers:
.popsection

.macro HANDLERS has_error from to
	vector = \from
	.rept \to - \from + 1
	.align 8

	/* Fetch current address and append it to idt_handlers. */
666 :
.pushsection .rodata
	.quad 666b
.popsection

	.if ! \has_error
	pushq $0
	.endif
	pushq $vector
	jmp handle_exception
	vector = vector + 1
	.endr
.endm

.global idt_handler_code
idt_handler_code:
	HANDLERS has_error=0 from=0  to=7
	HANDLERS has_error=1 from=8  to=8
	HANDLERS has_error=0 from=9  to=9
	HANDLERS has_error=1 from=10 to=14
	HANDLERS has_error=0 from=15 to=16
	HANDLERS has_error=1 from=17 to=17
	HANDLERS has_error=0 from=18 to=255

.section        .note.GNU-stack, "", %progbits