| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | 
							- /*
 
-  * File      : trap.c
 
-  * This file is part of RT-Thread RTOS
 
-  * COPYRIGHT (C) 2006, RT-Thread Development Team
 
-  *
 
-  * The license and distribution terms for this file may be
 
-  * found in the file LICENSE in this distribution or at
 
-  * http://openlab.rt-thread.com/license/LICENSE
 
-  *
 
-  * Change Logs:
 
-  * Date           Author       Notes
 
-  */
 
- #include <rtthread.h>
 
- #include <rthw.h>
 
- #include <bsp.h>
 
- /* Interrupt descriptor table.  (Must be built at run time because
 
-  * shifted function addresses can't be represented in relocation records.)
 
-  */
 
- struct Gatedesc idt[256] = { {0}, };
 
- struct Pseudodesc idt_pd =
 
- {
 
- 	0, sizeof(idt) - 1, (unsigned long) idt,
 
- };
 
- /* exception and interrupt handler table */
 
- extern rt_isr_handler_t isr_table[];
 
- extern rt_isr_handler_t trap_func[];
 
- extern rt_isr_handler_t hdinterrupt_func[];
 
- /**
 
-  * @addtogroup I386
 
-  */
 
- /*@{*/
 
- /**
 
-  * this function initializes the interrupt descript table
 
-  *
 
-  */
 
- void rt_hw_idt_init(void)
 
- {	
 
- 	extern void Xdefault;
 
- 	int i, j, func;
 
- 	// install a default handler
 
- 	for (i = 0; i < sizeof(idt)/sizeof(idt[0]); i++)
 
- 		SETGATE(idt[i], 0, GD_KT, &Xdefault, 0);
 
- 	/*install trap handler*/
 
- 	for(i = 0; i < 16; i++)
 
- 	{
 
- 		func = (int)trap_func[i];
 
- 		SETGATE(idt[i], 0, GD_KT, func, 0);
 
- 	}
 
- 	func = (int)trap_func[3];
 
- 	SETGATE(idt[3], 0, GD_KT, func, 3);
 
- 	i = 0;
 
- 	
 
- 	/*install exteral interrupt handler*/
 
- 	for(j = IRQ_OFFSET; j < IRQ_OFFSET + MAX_HANDLERS; j++)
 
- 	{	
 
- 		func = (int)hdinterrupt_func[i];
 
- 		SETGATE(idt[j], 0, GD_KT, func, 0);
 
- 		i++;
 
- 	}
 
- 	
 
- 	// Load the IDT
 
- 	asm volatile("lidt idt_pd + 2");
 
- }
 
- /**
 
-  * this function will deal with all kinds of kernel trap
 
-  *
 
-  *@param trapno the trap number
 
-  *
 
-  */
 
- void rt_hw_trap_irq(int trapno)
 
- {
 
- 	switch(trapno)
 
- 	{
 
- 		case T_DIVIDE:
 
- 			rt_kprintf("Divide error interrupt\n");
 
- 			RT_ASSERT(0);
 
- 		case T_PGFLT:
 
- 			rt_kprintf("Page fault interrupt\n");
 
- 			RT_ASSERT(0);
 
- 		case T_GPFLT:
 
- 			rt_kprintf("General protection interrupt\n");
 
- 			RT_ASSERT(0);
 
- 		case T_DEFAULT:
 
- 			rt_hw_interrupt_handle(T_DEFAULT);
 
- 			return;
 
- 	}
 
- 	/*kernel bug if run here*/
 
- 	RT_ASSERT(0);
 
- }
 
- /*@}*/
 
 
  |