示例#1
0
文件: init.c 项目: SoildFaker/kernel
void init_desc(void)
{
    // IDT entries
    ISR_ENTRY(0); ISR_ENTRY(1); ISR_ENTRY(2); ISR_ENTRY(3); ISR_ENTRY(4); ISR_ENTRY(5);
    ISR_ENTRY(6); ISR_ENTRY(7); ISR_ENTRY(8); ISR_ENTRY(9); ISR_ENTRY(10); ISR_ENTRY(11);
    ISR_ENTRY(12); ISR_ENTRY(13); ISR_ENTRY(14); ISR_ENTRY(15); ISR_ENTRY(16); ISR_ENTRY(17);
    ISR_ENTRY(18); ISR_ENTRY(19); ISR_ENTRY(20); ISR_ENTRY(21); ISR_ENTRY(22); ISR_ENTRY(23);
    ISR_ENTRY(24); ISR_ENTRY(25); ISR_ENTRY(26); ISR_ENTRY(27); ISR_ENTRY(28); ISR_ENTRY(29);
    ISR_ENTRY(30); ISR_ENTRY(31); 
    SYSG((u32)isr128, this_cpu.idt[0x80]);// SYStem Call goes here
    ISR_ENTRY(255);
    IRQ_ENTRY(0); IRQ_ENTRY(1); IRQ_ENTRY(2); IRQ_ENTRY(3); IRQ_ENTRY(4); IRQ_ENTRY(5);
    IRQ_ENTRY(6); IRQ_ENTRY(7); IRQ_ENTRY(8); IRQ_ENTRY(9); IRQ_ENTRY(10); IRQ_ENTRY(11);
    IRQ_ENTRY(12); IRQ_ENTRY(13); IRQ_ENTRY(14); IRQ_ENTRY(15);

    write_tss(&this_cpu.gdt[GDT_TSS_ENTRY], __KERNEL_DS, 0x0);

    this_cpu.idt_ptr.limit = IDT_ENTRY_NUM * sizeof(struct idt_desc_struct);
    this_cpu.idt_ptr.base = (u32)&(this_cpu.idt);
    gdt_flush((u32)&(this_cpu.gdt_ptr));
    init_8259A();
    irq_enable(2);
    memset((u8 *)&interrupt_handlers , 0, sizeof(interrupt_handlers));
    idt_flush((u32)&(this_cpu.idt_ptr));
    tss_flush();
}
示例#2
0
文件: gdt.c 项目: Champii/microkernel
void                      init_gdt()
{
  gdt_desc.limit = (sizeof(struct s_gdt_entry) * 6) - 1;
  gdt_desc.base = (unsigned int)&gdt;

  /* Null segment */
  init_segment(0, 0, 0, 0, 0);

  /*Ring 0*/
  /* Code segment */
  init_segment(1, BASE, LIMIT, 0xC, 0x9A);
  /* Data segment */
  init_segment(2, BASE, LIMIT, 0xC, 0x92);

  /*Ring 3*/
  /* Code segment */
  init_segment(3, BASE, LIMIT, 0xC, 0xFA);
  /* Data segment */
  init_segment(4, BASE, LIMIT, 0xC, 0xF2);

  /*TSS*/
  write_tss(5, 0x10, 0);

  flush_gdt();
  flush_tss();
}
示例#3
0
void init_gdt()
{
	gdt_ptr.size = (sizeof(gdt_entry_t) * 6) - 1;
	gdt_ptr.base = (u32int)&gdt_entries;

	gdt_set(0, 0, 0, 0, 0);					// Null segment
	gdt_set(1, 0, 0xFFFFFFFF, 0x9A, 0xCF);	// Code segment
	gdt_set(2, 0, 0xFFFFFFFF, 0x92, 0xCF);	// Data segment
	gdt_set(3, 0, 0xFFFFFFFF, 0xFA, 0xCF);	// User mode code segment
	gdt_set(4, 0, 0xFFFFFFFF, 0xF2, 0xCF);	// User mode data segment
	write_tss(5, 0x10, 0x0);

	gdt_flush((u32int)&gdt_ptr);
	tss_flush();
}
示例#4
0
static void init_gdt(){
	gdt_ptr.limit = (sizeof(gdt_entry_t) * 7) - 1;
	gdt_ptr.base = (unsigned int) &gdt_entries;

	gdt_set_gate(0, 0, 0, 0, 0);
	gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF);
	gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF);
	gdt_set_gate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF);
	gdt_set_gate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF);
	write_tss(5, 0x10, stack_hold);
	gdt_set_gate(6, 0, 0xFFFFF, 0x92, 0x0);
	gdt_set_gate(7, 0, 0xFFFFF, 0x9A, 0x0);

	gdt_flush((unsigned int) &gdt_ptr);
	flush_tss();
}
示例#5
0
文件: gdt.c 项目: s1mme/OrbitOS
void gdt_install(void)
{
	gdtpointer.limit = (sizeof(struct gdt_entry) * NUM_OF_GDT) - 1;
	gdtpointer.base = (u32)&gdt;
	
	gdt_set_gate(0,0,0,0,0);
	
	gdt_set_gate(1,0,0xffffffff,0x9a, 0xcf);
	 
	gdt_set_gate(2,0,0xffffffff,0x92, 0xcf);
	gdt_set_gate(3,0,0xffffffff,0xfa, 0xcf); /*usermode*/
	 
	gdt_set_gate(4,0,0xffffffff,0xf2, 0xcf); /*usermode*/
	write_tss(5,0x10,0x0);
	
	gdt_flush();
	tss_flush();
}
示例#6
0
文件: gdt.c 项目: dardevelin/ponyos
/*
 * gdt_install
 * Install the kernel's GDTs
 */
void
gdt_install(void) {
	/* GDT pointer and limits */
	gp.limit = (sizeof(struct gdt_entry) * 6) - 1;
	gp.base = (unsigned int)&gdt;
	/* NULL */
	gdt_set_gate(0, 0, 0, 0, 0);
	/* Code segment */
	gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF);
	/* Data segment */
	gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF);
	/* User code */
	gdt_set_gate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF);
	/* User data */
	gdt_set_gate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF);
	write_tss(5, 0x10, 0x0);
	/* Go go go */
	gdt_flush();
	tss_flush();
}
示例#7
0
static void init_gdt() {
  gdt_ptr.limit = (sizeof(gdt_entry_t) * GDT_ENTRIES) - 1;
  gdt_ptr.base  = (u32int)&gdt_entries;

  gdt_set_gate(0, 0, 0, 0, 0);                // Null segment
  gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); // Code segment
  gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); // Data segment
  gdt_set_gate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF); // User mode code segment
  gdt_set_gate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF); // User mode data segment
  gdt_set_gate(5, 0, 0,          0xF2, 0xCF); // User mode tlb segment
  // u32 base = KERNEL_VIRTUAL_BASE - cpu::cPageSize;
  // u32 limit = cpu::cPageSize;

  // gdt_set_gate(5, base, limit, 0xF2, 0xCF); // User mode tlb segment

  write_tss(6, 0x10, 0x0);
  gdt_set_gate(7, 0, 0,          0x92, 0xCF); // Percpu segment
  gdt_flush((u32int)&gdt_ptr);
  tss_flush();
}
示例#8
0
文件: gdt.c 项目: stupaq/sos-kernel
void init_gdt(uint32_t kstack_ptr) {
	// We have six entries in the GDT - two for kernel mode,
	// two for user mode, the NULL descriptor,
	// and one for the TSS (task state segment)
	// The limit is the last valid byte from the start of the GDT
	// - i.e. the size of the GDT - 1.
	gdt_ptr.limit = sizeof(gdt_entry_t) * 6 - 1;
	gdt_ptr.base = (uint32_t) &gdt_entries;

	gdt_set_gate(0, 0, 0, 0, 0); // null segment
	gdt_set_gate(1, 0, 0xFFFFF, 0x9A, 0xCF); // kernel code
	gdt_set_gate(2, 0, 0xFFFFF, 0x92, 0xCF); // kernel data
	gdt_set_gate(3, 0, 0xFFFFF, 0xFA, 0xCF); // user code
	gdt_set_gate(4, 0, 0xFFFFF, 0xF2, 0xCF); // user data
	// we pass gdt_entry index, kernel stack data segment offset
	// and kernel stack pointer
	write_tss(5, 0x10, kstack_ptr);

	gdt_flush((uint32_t) &gdt_ptr);
	tss_flush();
}
示例#9
0
文件: gdt.c 项目: descent/osdev
/*
 * gdt_install
 * Install the kernel's GDTs
 */
void
gdt_install() {
	blog("Setting up Global Descriptor Tables...");
	/* GDT pointer and limits */
	gp.limit = (sizeof(struct gdt_entry) * 6) - 1;
	gp.base = (unsigned int)&gdt;
	/* NULL */
	gdt_set_gate(0, 0, 0, 0, 0);
	/* Code segment */
	gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF);
	/* Data segment */
	gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF);
	/* User code */
	gdt_set_gate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF);
	/* User data */
	gdt_set_gate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF);
	write_tss(5, 0x10, 0x0);
	/* Go go go */
	gdt_flush();
	tss_flush();
	bfinish(0);
}