192 lines
3 KiB
ArmAsm
192 lines
3 KiB
ArmAsm
|
/*
|
||
|
* 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
|
||
|
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
|
||
|
.word 0x9090
|
||
|
|
||
|
vec9:
|
||
|
push $0 /* error code */
|
||
|
push $9 /* vector */
|
||
|
jmp int_hand
|
||
|
|
||
|
vec10:
|
||
|
/* error code */
|
||
|
push $10 /* vector */
|
||
|
jmp int_hand
|
||
|
.word 0x9090
|
||
|
|
||
|
vec11:
|
||
|
/* error code */
|
||
|
push $11 /* vector */
|
||
|
jmp int_hand
|
||
|
.word 0x9090
|
||
|
|
||
|
vec12:
|
||
|
/* error code */
|
||
|
push $12 /* vector */
|
||
|
jmp int_hand
|
||
|
.word 0x9090
|
||
|
|
||
|
vec13:
|
||
|
/* error code */
|
||
|
push $13 /* vector */
|
||
|
jmp int_hand
|
||
|
.word 0x9090
|
||
|
|
||
|
vec14:
|
||
|
/* error code */
|
||
|
push $14 /* vector */
|
||
|
jmp int_hand
|
||
|
.word 0x9090
|
||
|
|
||
|
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
|
||
|
.word 0x9090
|
||
|
|
||
|
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
|
||
|
|
||
|
pushl %esp /* Pointer to structure on the stack */
|
||
|
call x86_exception
|
||
|
pop %eax /* Drop the pointer */
|
||
|
|
||
|
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
|