summaryrefslogtreecommitdiff
path: root/libcpu/ia32/trapisr_gcc.S
blob: 82887ecda316b551192712faf79232d000ee9b95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 * Copyright (c) 2006-2021, 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

/*@}*/