xref: /nrf52832-nimble/rt-thread/libcpu/ia32/trapisr_gcc.S (revision 104654410c56c573564690304ae786df310c91fc)
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