blob: 9c36d81de7e51a89ee38ab1d902656aa02f2a558 [file] [log] [blame]
/*
* This file is part of the coreboot project.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
.section ".text._idt", "ax", @progbits
#ifdef __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:
/* 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
*/
#ifdef __x86_64__
push %rdi
push %rsi
push %rbp
/* Original stack pointer */
lea 32(%rsp), %rbp
push %rbp
push %rbx
push %rdx
push %rcx
push %rax
push %rsp /* Pointer to structure on the stack */
call x86_exception
pop %rax /* Drop the pointer */
pop %rax
pop %rcx
pop %rdx
pop %rbx
pop %rbp /* Ignore saved %rsp value */
pop %rbp
pop %rsi
pop %rdi
add $8, %rsp /* pop of the vector and error code */
#else
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 */
#endif
iret