/* * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2006-09-15 QiuYi The first version. */ /** * @addtogroup I386 */ /*@{*/ #define ENTRY(proc)\ .align 2;\ .globl proc;\ .type proc,@function;\ proc: #define TRAPFNC(name,num)\ ENTRY(name)\ pushl $(num);\ jmp _traps;\ .data;\ .long name;\ .text #define TRAPFNC_NOEC(name,num)\ ENTRY(name)\ pushl $0;\ pushl $(num);\ jmp _traps;\ .data;\ .long name;\ .text .globl trap_func .data .align 4 .type trap_func,@object trap_func : .text /* CPU traps */ TRAPFNC_NOEC(Xdivide, 0) TRAPFNC_NOEC(Xdebug, 1) TRAPFNC_NOEC(Xnmi, 2) TRAPFNC_NOEC(Xbrkpt, 3) TRAPFNC_NOEC(Xoflow, 4) TRAPFNC_NOEC(Xbound, 5) TRAPFNC_NOEC(Xillop, 6) TRAPFNC_NOEC(Xdevice, 7) TRAPFNC (Xdblflt, 8) TRAPFNC (Xtss, 9) TRAPFNC (Xsegnp, 10) TRAPFNC (Xstack, 11) TRAPFNC (Xgpflt, 12) TRAPFNC (Xpgflt, 13) TRAPFNC_NOEC(Xfperr, 14) TRAPFNC (Xalign, 15) /* default handler -- not for any specific trap */ TRAPFNC (Xdefault, 500) .p2align 4,0x90 .globl _traps .type _traps,@function .globl rt_interrupt_enter .globl rt_interrupt_leave _traps: push %ds push %es pushal movw $0x10,%ax movw %ax,%ds movw %ax,%es pushl %esp call rt_interrupt_enter movl %esp, %eax addl $0x2c,%eax /*get trapno*/ movl (%eax),%eax pushl %eax /*push trapno*/ call rt_hw_trap_irq addl $4,%esp call rt_interrupt_leave popl %esp popal pop %es pop %ds add $8,%esp iret /*@}*/