104 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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);
 | 
						|
}
 | 
						|
 | 
						|
/*@}*/
 |