1*10465441SEvalZero/* 2*10465441SEvalZero * File : trapisr_gcc.S 3*10465441SEvalZero * This file is part of RT-Thread RTOS 4*10465441SEvalZero * COPYRIGHT (C) 2006, RT-Thread Development Team 5*10465441SEvalZero * 6*10465441SEvalZero * The license and distribution terms for this file may be 7*10465441SEvalZero * found in the file LICENSE in this distribution or at 8*10465441SEvalZero * http://www.rt-thread.org/license/LICENSE 9*10465441SEvalZero * 10*10465441SEvalZero * Change Logs: 11*10465441SEvalZero * Date Author Notes 12*10465441SEvalZero * 2006-09-15 QiuYi The first version. 13*10465441SEvalZero */ 14*10465441SEvalZero 15*10465441SEvalZero/** 16*10465441SEvalZero * @addtogroup I386 17*10465441SEvalZero */ 18*10465441SEvalZero/*@{*/ 19*10465441SEvalZero 20*10465441SEvalZero#define ENTRY(proc)\ 21*10465441SEvalZero .align 2;\ 22*10465441SEvalZero .globl proc;\ 23*10465441SEvalZero .type proc,@function;\ 24*10465441SEvalZero proc: 25*10465441SEvalZero#define TRAPFNC(name,num)\ 26*10465441SEvalZero ENTRY(name)\ 27*10465441SEvalZero pushl $(num);\ 28*10465441SEvalZero jmp _traps;\ 29*10465441SEvalZero .data;\ 30*10465441SEvalZero .long name;\ 31*10465441SEvalZero .text 32*10465441SEvalZero#define TRAPFNC_NOEC(name,num)\ 33*10465441SEvalZero ENTRY(name)\ 34*10465441SEvalZero pushl $0;\ 35*10465441SEvalZero pushl $(num);\ 36*10465441SEvalZero jmp _traps;\ 37*10465441SEvalZero .data;\ 38*10465441SEvalZero .long name;\ 39*10465441SEvalZero .text 40*10465441SEvalZero 41*10465441SEvalZero.globl trap_func 42*10465441SEvalZero .data 43*10465441SEvalZero .align 4 44*10465441SEvalZero .type trap_func,@object 45*10465441SEvalZero trap_func : 46*10465441SEvalZero.text 47*10465441SEvalZero 48*10465441SEvalZero/* CPU traps */ 49*10465441SEvalZeroTRAPFNC_NOEC(Xdivide, 0) 50*10465441SEvalZeroTRAPFNC_NOEC(Xdebug, 1) 51*10465441SEvalZeroTRAPFNC_NOEC(Xnmi, 2) 52*10465441SEvalZeroTRAPFNC_NOEC(Xbrkpt, 3) 53*10465441SEvalZeroTRAPFNC_NOEC(Xoflow, 4) 54*10465441SEvalZeroTRAPFNC_NOEC(Xbound, 5) 55*10465441SEvalZeroTRAPFNC_NOEC(Xillop, 6) 56*10465441SEvalZeroTRAPFNC_NOEC(Xdevice, 7) 57*10465441SEvalZeroTRAPFNC (Xdblflt, 8) 58*10465441SEvalZeroTRAPFNC (Xtss, 9) 59*10465441SEvalZeroTRAPFNC (Xsegnp, 10) 60*10465441SEvalZeroTRAPFNC (Xstack, 11) 61*10465441SEvalZeroTRAPFNC (Xgpflt, 12) 62*10465441SEvalZeroTRAPFNC (Xpgflt, 13) 63*10465441SEvalZeroTRAPFNC_NOEC(Xfperr, 14) 64*10465441SEvalZeroTRAPFNC (Xalign, 15) 65*10465441SEvalZero 66*10465441SEvalZero/* default handler -- not for any specific trap */ 67*10465441SEvalZeroTRAPFNC (Xdefault, 500) 68*10465441SEvalZero 69*10465441SEvalZero.p2align 4,0x90 70*10465441SEvalZero.globl _traps 71*10465441SEvalZero.type _traps,@function 72*10465441SEvalZero.globl rt_interrupt_enter 73*10465441SEvalZero.globl rt_interrupt_leave 74*10465441SEvalZero 75*10465441SEvalZero_traps: 76*10465441SEvalZero push %ds 77*10465441SEvalZero push %es 78*10465441SEvalZero pushal 79*10465441SEvalZero movw $0x10,%ax 80*10465441SEvalZero movw %ax,%ds 81*10465441SEvalZero movw %ax,%es 82*10465441SEvalZero pushl %esp 83*10465441SEvalZero call rt_interrupt_enter 84*10465441SEvalZero movl %esp, %eax 85*10465441SEvalZero addl $0x2c,%eax /*get trapno*/ 86*10465441SEvalZero movl (%eax),%eax 87*10465441SEvalZero pushl %eax /*push trapno*/ 88*10465441SEvalZero call rt_hw_trap_irq 89*10465441SEvalZero addl $4,%esp 90*10465441SEvalZero call rt_interrupt_leave 91*10465441SEvalZero popl %esp 92*10465441SEvalZero popal 93*10465441SEvalZero pop %es 94*10465441SEvalZero pop %ds 95*10465441SEvalZero add $8,%esp 96*10465441SEvalZero iret 97*10465441SEvalZero 98*10465441SEvalZero/*@}*/ 99