| /* 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 |