xref: /linux/tools/testing/selftests/kvm/lib/x86_64/handlers.S (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
129faeb96SAaron Lewishandle_exception:
229faeb96SAaron Lewis	push %r15
329faeb96SAaron Lewis	push %r14
429faeb96SAaron Lewis	push %r13
529faeb96SAaron Lewis	push %r12
629faeb96SAaron Lewis	push %r11
729faeb96SAaron Lewis	push %r10
829faeb96SAaron Lewis	push %r9
929faeb96SAaron Lewis	push %r8
1029faeb96SAaron Lewis
1129faeb96SAaron Lewis	push %rdi
1229faeb96SAaron Lewis	push %rsi
1329faeb96SAaron Lewis	push %rbp
1429faeb96SAaron Lewis	push %rbx
1529faeb96SAaron Lewis	push %rdx
1629faeb96SAaron Lewis	push %rcx
1729faeb96SAaron Lewis	push %rax
1829faeb96SAaron Lewis	mov %rsp, %rdi
1929faeb96SAaron Lewis
2029faeb96SAaron Lewis	call route_exception
2129faeb96SAaron Lewis
2229faeb96SAaron Lewis	pop %rax
2329faeb96SAaron Lewis	pop %rcx
2429faeb96SAaron Lewis	pop %rdx
2529faeb96SAaron Lewis	pop %rbx
2629faeb96SAaron Lewis	pop %rbp
2729faeb96SAaron Lewis	pop %rsi
2829faeb96SAaron Lewis	pop %rdi
2929faeb96SAaron Lewis	pop %r8
3029faeb96SAaron Lewis	pop %r9
3129faeb96SAaron Lewis	pop %r10
3229faeb96SAaron Lewis	pop %r11
3329faeb96SAaron Lewis	pop %r12
3429faeb96SAaron Lewis	pop %r13
3529faeb96SAaron Lewis	pop %r14
3629faeb96SAaron Lewis	pop %r15
3729faeb96SAaron Lewis
3829faeb96SAaron Lewis	/* Discard vector and error code. */
3929faeb96SAaron Lewis	add $16, %rsp
4029faeb96SAaron Lewis	iretq
4129faeb96SAaron Lewis
4229faeb96SAaron Lewis/*
4329faeb96SAaron Lewis * Build the handle_exception wrappers which push the vector/error code on the
4429faeb96SAaron Lewis * stack and an array of pointers to those wrappers.
4529faeb96SAaron Lewis */
4629faeb96SAaron Lewis.pushsection .rodata
4729faeb96SAaron Lewis.globl idt_handlers
4829faeb96SAaron Lewisidt_handlers:
4929faeb96SAaron Lewis.popsection
5029faeb96SAaron Lewis
5129faeb96SAaron Lewis.macro HANDLERS has_error from to
5229faeb96SAaron Lewis	vector = \from
5329faeb96SAaron Lewis	.rept \to - \from + 1
5429faeb96SAaron Lewis	.align 8
5529faeb96SAaron Lewis
5629faeb96SAaron Lewis	/* Fetch current address and append it to idt_handlers. */
57*5f443e42SBill Wendling666 :
5829faeb96SAaron Lewis.pushsection .rodata
59*5f443e42SBill Wendling	.quad 666b
6029faeb96SAaron Lewis.popsection
6129faeb96SAaron Lewis
6229faeb96SAaron Lewis	.if ! \has_error
6329faeb96SAaron Lewis	pushq $0
6429faeb96SAaron Lewis	.endif
6529faeb96SAaron Lewis	pushq $vector
6629faeb96SAaron Lewis	jmp handle_exception
6729faeb96SAaron Lewis	vector = vector + 1
6829faeb96SAaron Lewis	.endr
6929faeb96SAaron Lewis.endm
7029faeb96SAaron Lewis
7129faeb96SAaron Lewis.global idt_handler_code
7229faeb96SAaron Lewisidt_handler_code:
7329faeb96SAaron Lewis	HANDLERS has_error=0 from=0  to=7
7429faeb96SAaron Lewis	HANDLERS has_error=1 from=8  to=8
7529faeb96SAaron Lewis	HANDLERS has_error=0 from=9  to=9
7629faeb96SAaron Lewis	HANDLERS has_error=1 from=10 to=14
7729faeb96SAaron Lewis	HANDLERS has_error=0 from=15 to=16
7829faeb96SAaron Lewis	HANDLERS has_error=1 from=17 to=17
7929faeb96SAaron Lewis	HANDLERS has_error=0 from=18 to=255
8029faeb96SAaron Lewis
8129faeb96SAaron Lewis.section        .note.GNU-stack, "", %progbits
82