Exemple #1
0
void init_gdtidt(void)
{
	struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
	struct GATE_DESCRIPTOR    *idt = (struct GATE_DESCRIPTOR    *) ADR_IDT;
	int i;
	
	/* initialize GDT */
	for (i = 0; i < 8192; i++) {
		set_segmdesc(gdt + i, 0, 0, 0);
	}
	set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, 0x4092); // it represents all the memory that CPU can manage. limit = 4G 
														   // 0x4092   0100 0000 10010010 -> 32-bit mode, system special, read and write, not execute
	set_segmdesc(gdt + 2, 0x0007ffff, 0x00280000, 0x409a); // 512K, from  0x00280000, prepared for bootpack.hrb
														   // 0x409a -> 32-bit mode, system special(ring0), execute and read, not write
	load_gdtr(0xffff, ADR_GDT); // with the help of assembly
	
	/* initialize IDT */
	for (i = 0; i < 256; i++) {
		set_gatedesc(idt + i, 0, 0, 0);
	}
	
	load_idtr(0x7ff, ADR_IDT); // with the help of assembly
	
	/* setting IDT */
	set_gatedesc(idt + 0x21, (int) asm_inthandler21, 2 * 8, AR_INTGATE32);
	set_gatedesc(idt + 0x2c, (int) asm_inthandler2c, 2 * 8, AR_INTGATE32);
	set_gatedesc(idt + 0x27, (int) asm_inthandler27, 2 * 8, AR_INTGATE32);
	
	return;
}
Exemple #2
0
void init_gdtidt(void){
	struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *)0x00270000;
	struct GATE_DESCRIPTOR *idt= (struct GATE_DESCRIPTOR*)0x0026f800;
	int i;

	//gdt initialize
	for(i=0; i<8192; i++){
		set_segmdesc(gdt+i, 0, 0, 0);
	}
	set_segmdesc(gdt+1, 0xffffffff, 0x00000000, 0x4092);
	set_segmdesc(gdt+2, 0x000fffff, 0x00000000, 0x409a);
	set_segmdesc(gdt+3, 0x000fffff, 0x00280000, 0x409a);
	
	load_gdtr(0xfff, 0x00270000);//??or 0xfff?


	//idt initialize
	for(i=0; i<256; i++){
		set_gatedesc(idt+i, 0, 0, 0);
	}

	for(i=0; i<256; i++){
		set_gatedesc(idt+i, (int)asm_inthandler21, 3*8, 0x008e);
	}
	set_gatedesc(idt+0x21, (int)asm_inthandler21-0x280000, 3*8, 0x008e);
	set_gatedesc(idt+0x2c, (int)asm_inthandler2c, 2*8, AR_INTGATE32);

	load_idtr(0x7ff, 0x0026f800);

	return;
}
Exemple #3
0
//初始化GDT、IDT
void init_gdtidt(void)
{
	struct SEGMENT_DESCRIPTOR *gdt=(struct SEGMENT_DESCRIPTOR *)0x00270000;
	struct GATE_DESCRIPTOR *idt=(struct GATE_DESCRIPTOR *)0x0026f800;
	int i;
	
	/*GDT的初始化*/
	for(i=0;i<8192;i++){
		set_segmdesc(gdt+i,0,0,0);
	}
	set_segmdesc(gdt+1,0xffffffff,0x00000000,AR_DATA32_RW);
	set_segmdesc(gdt + 2, LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER);
	load_gdtr(LIMIT_GDT, ADR_GDT);
	
	/*IDT的初始化*/
	for(i=0;i<256;i++){
		set_gatedesc(idt+i,0,0,0);
	}
	load_idtr(LIMIT_IDT, ADR_IDT);
	
	/*IDT的设定*/
	set_gatedesc(idt+0x21,(int)asm_inthandler21,2*8,AR_INTGATE32);
	set_gatedesc(idt + 0x27, (int) asm_inthandler27, 2 * 8, AR_INTGATE32);
	set_gatedesc(idt+0x2c,(int)asm_inthandler2c,2*8,AR_INTGATE32);
	
	return ;
}
Exemple #4
0
void init_pic(void)
{
	/*
	IRR:インタラプトリクエストレジスタ 
		.IRQピンの状態を表す。ポートを読んだときに、IRRになるかISRになるかは、OCW3で選択する。
		.1になっているビットは、現在要求が来ている(もしくは処理中の)割り込み。
	ISR:インサービスレジスタ 
		.現在処理中の割り込みがどれであるかを示す。ポートを読んだときに、IRRになるかISRになるかは、OCW3で選択する。
		.1になっているビットは、現在処理中の割り込み。処理中というのは、CPUに対してINT命令を発行したが、EOI(割り込み終了命令)を受け取っていない割り込み。
	IMR:インタラプトマスクレジスタ 
		.これが1になっている割り込みは、IRRが1になっていても、反応しない。 
	*/

	io_out8(PIC0_IMR, 0xff);	/*割り込み全部無視(マスタ)*/
	io_out8(PIC1_IMR, 0xff);	/*割り込み全部無視(スレーブ)*/

	io_out8(PIC0_ICW1, 0x11);	/*エッジトリガモードに設定(マスタ)*/
	io_out8(PIC0_ICW2, 0x20);	/*割り込み番号を、20~27に設定。(マスタ)*/
	io_out8(PIC0_ICW3, 1 << 2);	/*00000100 つまり、スレーブはIRQ2につながってますよということ。*/
	io_out8(PIC0_ICW4, 0x01);	/*ノンバッファモード(マスタ)*/

	io_out8(PIC1_ICW1, 0x11);	/*エッジトリガモードに設定(スレーブ)*/
	io_out8(PIC1_ICW2, 0x28);	/*割り込み番号を、28~2fに設定。(スレーブ)*/
	io_out8(PIC1_ICW3, 2);	/*自分はマスタのIRQ2番につながってますということ。*/
	io_out8(PIC1_ICW4, 0x01);	/*ノンバッファモード(スレーブ)*/

	io_out8(PIC0_IMR, 0xfb);	/*11111011つまり、IRQ2番(スレーブ)だけ許可。あとは無視。(マスタ)*/	
	io_out8(PIC1_IMR, 0xff);	/*11111111つまり、全て無視*/

	set_gatedesc(system.io.interrupt.idt+0x27, (int)asm_inthandler27, 2 * 8, AR_INTGATE32);
	io_out8(PIC0_IMR, io_in8(PIC0_IMR) & 0x7f);	/*IRQ-07対策*/

	return;
}
Exemple #5
0
void init_pit(void)
{
	int i;
	UI_Timer *watch;
	for(i = 0; i < MAX_TIMER; i++) {
		system.ui.timer.ctrl.timer[i].flags = initialized;
	}
	watch = timer_alloc();
	watch->timeout = 0xffffffff;
	watch->flags = inuse;
	watch->next_timer = 0;
	system.ui.timer.ctrl.timers = watch;
	system.ui.timer.ctrl.next_count = 0xffffffff;
	io_out8(PIT_CTRL, 0x34);
	io_out8(PIT_CNT0, 0x9c);
	io_out8(PIT_CNT0, 0x2e);
	set_gatedesc(system.io.interrupt.idt + 0x20, (int) asm_inthandler20, 2 * 8, AR_INTGATE32);
	io_out8(PIC0_IMR, io_in8(PIC0_IMR) & 0xfe);
	system.ui.timer.ctrl.count = 0;
	return;
}
Exemple #6
0
//初始化GDT、IDT
void init_gdtidt(void)
{
	struct SEGMENT_DESCRIPTOR *gdt=(struct SEGMENT_DESCRIPTOR *)0x00270000;
	struct GATE_DESCRIPTOR *idt=(struct GATE_DESCRIPTOR *)0x0026f800;
	int i;
	
	/*GDT的初始化*/
	for(i=0;i<8192;i++){
		set_segmdesc(gdt+i,0,0,0);
	}
	set_segmdesc(gdt+1,0xffffffff,0x00000000,0x4092);
	set_segmdesc(gdt+2,0x0007ffff,0x00280000,0x409a);
	load_gdtr(0xffff,0x00270000);
	
	/*IDT的初始化*/
	for(i=0;i<256;i++){
		set_gatedesc(idt+i,0,0,0);
	}
	load_idtr(0x7ff,0x0026800);
	
	return ;
}
Exemple #7
0
void init_gdtidt(void)
{
    gdt = (struct SEGMENT_DESCRIPTOR *)memory_allocate(
            (sizeof(struct SEGMENT_DESCRIPTOR) * NUM_GDT));
/*     struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *)GDT_ADDR; */
/*     struct GATE_DISCRIPTOR *idt = (struct GATE_DISCRIPTOR *) IDT_ADDR; */
    idt = (struct GATE_DISCRIPTOR*)memory_allocate(
            (sizeof(struct GATE_DISCRIPTOR) * NUM_IDT));

    printf(TEXT_MODE_SCREEN_RIGHT, "idt: 0x%x", idt);
    printf(TEXT_MODE_SCREEN_RIGHT, "gdt: 0x%x", gdt);

    if(idt == NULL){
        return;
    }
    int i;

    //init GDT
    for(i = 0; i < NUM_GDT; i++){
        set_segmdesc(gdt + i, 0, 0, 0, 0, 0, 0, 0);
    }
    set_segmdesc(
            gdt + CODE_SEGMENT_NUM, 0xffffffff, 0x00000000, 0, SEG_TYPE_CODE_XRC,
            DESC_TYPE_SEGMENT, PRIVILEGE_LEVEL_OS, PRESENT);

    set_segmdesc(
            gdt + DATA_SEGMENT_NUM, 0xffffffff, 0x00000000, 0, SEG_TYPE_DATE_REW,
            DESC_TYPE_SEGMENT, PRIVILEGE_LEVEL_OS, PRESENT);


/*     load_gdtr(0xffff, (uintptr_t)gdt); */
    load_gdtr(sizeof(struct SEGMENT_DESCRIPTOR)*4, (uintptr_t)gdt);

    //init IDT
    for(int i = 0; i < NUM_IDT; i++){
        set_gatedesc(idt + i, (uintptr_t)io_hlt, 0, 0, 0, 0, 0);
    /*         set_gatedesc( */
/*             idt + 0x20, (uintptr_t)asm_timer_inthandler, 1*8, GATE_TYPE_32BIT_INT, 0, */
/*             PRIVILEGE_LEVEL_OS, PRESENT); */
    }


/*     for(int i = 0; i < 14; i++){ */
/*         set_gatedesc( */
/*             idt + i, (uintptr_t)asm_fault_inthandler2, 1*8, GATE_TYPE_32BIT_INT, 0, */
/*             PRIVILEGE_LEVEL_OS, PRESENT); */
/*     } */
/*     for(int i = 14; i < 20; i++){ */
/*         set_gatedesc( */
/*             idt + i, (uintptr_t)asm_fault_inthandler, 1*8, GATE_TYPE_32BIT_INT, 0, */
/*             PRIVILEGE_LEVEL_OS, PRESENT); */
/*     } */

    set_gatedesc(
            idt + 13, (uintptr_t)asm_fault_inthandler2, CODE_SEGMENT_NUM*8,
            GATE_TYPE_32BIT_INT, 0, PRIVILEGE_LEVEL_OS, PRESENT);

    set_gatedesc(
            idt + 8, (uintptr_t)asm_fault_inthandler, CODE_SEGMENT_NUM*8,
            GATE_TYPE_32BIT_INT, 0, PRIVILEGE_LEVEL_OS, PRESENT);

/*     load_idtr(IDT_LIMIT, (uintptr_t)idt); */
    load_idtr(sizeof(struct GATE_DISCRIPTOR) * NUM_IDT, (uintptr_t)idt);

    set_gatedesc(
            idt + 0x20, (uintptr_t)asm_timer_inthandler, CODE_SEGMENT_NUM*8,
            GATE_TYPE_32BIT_INT, 0, PRIVILEGE_LEVEL_OS, PRESENT);

    set_gatedesc(
            idt + 0x21, (uintptr_t)asm_inthandler21, CODE_SEGMENT_NUM*8,
            GATE_TYPE_32BIT_INT, 0, PRIVILEGE_LEVEL_OS, PRESENT);

    return;
}