blob: 99d6e95ec55951d735587a39eae94d1c4c118228 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
.section ".text._idt", "ax", @progbits
#if ENV_X86_64
.code64
#else
.code32
#endif
.global vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9
.global vec10, vec11, vec12, vec13, vec14, vec15, vec16, vec17, vec18, vec19
vec0:
push $0 /* error code */
push $0 /* vector */
jmp int_hand
vec1:
push $0 /* error code */
push $1 /* vector */
jmp int_hand
vec2:
push $0 /* error code */
push $2 /* vector */
jmp int_hand
vec3:
push $0 /* error code */
push $3 /* vector */
jmp int_hand
vec4:
push $0 /* error code */
push $4 /* vector */
jmp int_hand
vec5:
push $0 /* error code */
push $5 /* vector */
jmp int_hand
vec6:
push $0 /* error code */
push $6 /* vector */
jmp int_hand
vec7:
push $0 /* error code */
push $7 /* vector */
jmp int_hand
vec8:
/* error code */
push $8 /* vector */
jmp int_hand
vec9:
push $0 /* error code */
push $9 /* vector */
jmp int_hand
vec10:
/* error code */
push $10 /* vector */
jmp int_hand
vec11:
/* error code */
push $11 /* vector */
jmp int_hand
vec12:
/* error code */
push $12 /* vector */
jmp int_hand
vec13:
/* error code */
push $13 /* vector */
jmp int_hand
vec14:
/* error code */
push $14 /* vector */
jmp int_hand
vec15:
push $0 /* error code */
push $15 /* vector */
jmp int_hand
vec16:
push $0 /* error code */
push $16 /* vector */
jmp int_hand
vec17:
/* error code */
push $17 /* vector */
jmp int_hand
vec18:
push $0 /* error code */
push $18 /* vector */
jmp int_hand
vec19:
push $0 /* error code */
push $19 /* vector */
jmp int_hand
.global int_hand
int_hand:
#if ENV_X86_64
/* At this point, on x86-64, on the stack there is:
* 0(%rsp) vector
* 8(%rsp) error code
* 16(%rsp) rip
* 24(%rsp) cs
* 32(%rsp) rflags
* 40(%rsp) rsp
* 48(%rsp) ss
*/
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
/* Pass pointer to struct as first argument */
mov %rsp, %rdi
/* Back up stack pointer */
mov %rsp, %rbp
/* Align stack to 16 bytes. */
and $(~0xf), %rsp
call x86_exception
/* Restore stack pointer from backup */
mov %rbp, %rsp
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
add $16, %rsp /* pop of the vector and error code */
iretq
#else
/* At this point, on x86-32, on the stack there is:
* 0(%esp) vector
* 4(%esp) error code
* 8(%esp) eip
* 12(%esp) cs
* 16(%esp) eflags
*/
pushl %edi
pushl %esi
pushl %ebp
/* Original stack pointer */
leal 32(%esp), %ebp
pushl %ebp
pushl %ebx
pushl %edx
pushl %ecx
pushl %eax
/* Save pointer to eregs structure */
movl %esp, %ebp
/* Align stack to 16 bytes. */
andl $0xfffffff0, %esp
/* Save original stack pointer while keeping stack alignment. This
value is also the eregs argument x86_exception(). */
sub $12, %esp
pushl %ebp /* Pointer to structure on the stack */
call x86_exception
pop %esp /* Unwind the stack alignment and argument passing. */
popl %eax
popl %ecx
popl %edx
popl %ebx
popl %ebp /* Ignore saved %esp value */
popl %ebp
popl %esi
popl %edi
addl $8, %esp /* pop of the vector and error code */
iret
#endif