xref: /nrf52832-nimble/rt-thread/libcpu/ia32/trap.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * File      : trap.c
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://openlab.rt-thread.com/license/LICENSE
9*10465441SEvalZero  *
10*10465441SEvalZero  * Change Logs:
11*10465441SEvalZero  * Date           Author       Notes
12*10465441SEvalZero  */
13*10465441SEvalZero 
14*10465441SEvalZero #include <rtthread.h>
15*10465441SEvalZero #include <rthw.h>
16*10465441SEvalZero 
17*10465441SEvalZero #include <bsp.h>
18*10465441SEvalZero 
19*10465441SEvalZero /* Interrupt descriptor table.  (Must be built at run time because
20*10465441SEvalZero  * shifted function addresses can't be represented in relocation records.)
21*10465441SEvalZero  */
22*10465441SEvalZero struct Gatedesc idt[256] = { {0}, };
23*10465441SEvalZero struct Pseudodesc idt_pd =
24*10465441SEvalZero {
25*10465441SEvalZero 	0, sizeof(idt) - 1, (unsigned long) idt,
26*10465441SEvalZero };
27*10465441SEvalZero 
28*10465441SEvalZero /* exception and interrupt handler table */
29*10465441SEvalZero extern rt_isr_handler_t isr_table[];
30*10465441SEvalZero extern rt_isr_handler_t trap_func[];
31*10465441SEvalZero extern rt_isr_handler_t hdinterrupt_func[];
32*10465441SEvalZero 
33*10465441SEvalZero /**
34*10465441SEvalZero  * @addtogroup I386
35*10465441SEvalZero  */
36*10465441SEvalZero /*@{*/
37*10465441SEvalZero 
38*10465441SEvalZero /**
39*10465441SEvalZero  * this function initializes the interrupt descript table
40*10465441SEvalZero  *
41*10465441SEvalZero  */
rt_hw_idt_init(void)42*10465441SEvalZero void rt_hw_idt_init(void)
43*10465441SEvalZero {
44*10465441SEvalZero 	extern void Xdefault;
45*10465441SEvalZero 	int i, j, func;
46*10465441SEvalZero 
47*10465441SEvalZero 	// install a default handler
48*10465441SEvalZero 	for (i = 0; i < sizeof(idt)/sizeof(idt[0]); i++)
49*10465441SEvalZero 		SETGATE(idt[i], 0, GD_KT, &Xdefault, 0);
50*10465441SEvalZero 
51*10465441SEvalZero 	/*install trap handler*/
52*10465441SEvalZero 	for(i = 0; i < 16; i++)
53*10465441SEvalZero 	{
54*10465441SEvalZero 		func = (int)trap_func[i];
55*10465441SEvalZero 		SETGATE(idt[i], 0, GD_KT, func, 0);
56*10465441SEvalZero 	}
57*10465441SEvalZero 
58*10465441SEvalZero 	func = (int)trap_func[3];
59*10465441SEvalZero 	SETGATE(idt[3], 0, GD_KT, func, 3);
60*10465441SEvalZero 
61*10465441SEvalZero 	i = 0;
62*10465441SEvalZero 
63*10465441SEvalZero 	/*install exteral interrupt handler*/
64*10465441SEvalZero 	for(j = IRQ_OFFSET; j < IRQ_OFFSET + MAX_HANDLERS; j++)
65*10465441SEvalZero 	{
66*10465441SEvalZero 		func = (int)hdinterrupt_func[i];
67*10465441SEvalZero 		SETGATE(idt[j], 0, GD_KT, func, 0);
68*10465441SEvalZero 		i++;
69*10465441SEvalZero 	}
70*10465441SEvalZero 
71*10465441SEvalZero 	// Load the IDT
72*10465441SEvalZero 	asm volatile("lidt idt_pd + 2");
73*10465441SEvalZero }
74*10465441SEvalZero 
75*10465441SEvalZero /**
76*10465441SEvalZero  * this function will deal with all kinds of kernel trap
77*10465441SEvalZero  *
78*10465441SEvalZero  *@param trapno the trap number
79*10465441SEvalZero  *
80*10465441SEvalZero  */
rt_hw_trap_irq(int trapno)81*10465441SEvalZero void rt_hw_trap_irq(int trapno)
82*10465441SEvalZero {
83*10465441SEvalZero 	switch(trapno)
84*10465441SEvalZero 	{
85*10465441SEvalZero 		case T_DIVIDE:
86*10465441SEvalZero 			rt_kprintf("Divide error interrupt\n");
87*10465441SEvalZero 			RT_ASSERT(0);
88*10465441SEvalZero 		case T_PGFLT:
89*10465441SEvalZero 			rt_kprintf("Page fault interrupt\n");
90*10465441SEvalZero 			RT_ASSERT(0);
91*10465441SEvalZero 		case T_GPFLT:
92*10465441SEvalZero 			rt_kprintf("General protection interrupt\n");
93*10465441SEvalZero 			RT_ASSERT(0);
94*10465441SEvalZero 		case T_DEFAULT:
95*10465441SEvalZero 			rt_hw_interrupt_handle(T_DEFAULT);
96*10465441SEvalZero 			return;
97*10465441SEvalZero 	}
98*10465441SEvalZero 
99*10465441SEvalZero 	/*kernel bug if run here*/
100*10465441SEvalZero 	RT_ASSERT(0);
101*10465441SEvalZero }
102*10465441SEvalZero 
103*10465441SEvalZero /*@}*/
104