[Prev][Next][Index][Thread]

How make an interrupt gate?



hi every body,
	I want to put a interrupt gate in IDT, I dont like using
	oskit stub for it. I did it, 
	but in interrupt hadnler after asm("iret"), i got a trap_dump
	because of trap 13(#GPF).
	whats the problem?
regards,
--taghi
---------------------------------------- here is my source.
#include <stdio.h>
#include <oskit/machine/base_cpu.h>
#include <oskit/x86/pmode.h>
#include <oskit/x86/base_gdt.h>
#include <oskit/x86/proc_reg.h>
#include <oskit/x86/base_idt.h>
#include <oskit/debug.h>
#include <oskit/x86/pio.h>
#include <oskit/x86/pc/pit.h>
#include <oskit/x86/eflags.h>
#include <oskit/x86/pc/base_irq.h>
#include <oskit/x86/base_trap.h>
#include <oskit/x86/trap.h>
#include <oskit/clientos.h>
	
CODE32
void delay(void) {
	unsigned int i,j, k;
	for (i = 0; i < 30000; ++i)
		for (j = 0; j < 500; ++j)
			k = k +1;
}
/*
	interrupt hadnler.
*/
void timer(void)
{
	printf("in interrupt timer. \n");
	outb(0x20, 0x20);
/* &&&&&&&&&&&& I got a trap dump after running this instruction */B
	asm ("iret");
}

void main (void) {
	
	oskit_clientos_init();

	osenv_intr_disable();
	base_gdt_init();
	base_gdt_load();
	base_idt_load();
	base_irq_init();

	fill_descriptor(&base_gdt[USER_CS / 8],
			0x00000000, 0xffffffff,
			ACC_PL_U | ACC_CODE_R, SZ_32);
	fill_descriptor(&base_gdt[USER_DS / 8],
			0x00000000, 0xffffffff,
			ACC_PL_U | ACC_DATA_W, SZ_32);

	fill_gate(&base_idt[32+ 0], (unsigned)timer, KERNEL_CS, 
		ACC_INTR_GATE | ACC_PL_K, 0);

	pit_init(100);

	osenv_irq_enable(0);
	osenv_intr_enable();   
	while (1) {
		delay();	
		printf("Main program \n");
	}
	return;
}
	


Follow-Ups: