diff options
author | kaashoek <kaashoek> | 2006-06-28 16:35:03 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-06-28 16:35:03 +0000 |
commit | bd303ed06096395778c80558e013b64bb47b9e9c (patch) | |
tree | 4bcd3d7ae05c85f414c98037a7baef51455acc33 /main.c | |
parent | c41f1de5d41a527a3fa2d1e94215766130eac456 (diff) | |
download | xv6-labs-bd303ed06096395778c80558e013b64bb47b9e9c.tar.gz xv6-labs-bd303ed06096395778c80558e013b64bb47b9e9c.tar.bz2 xv6-labs-bd303ed06096395778c80558e013b64bb47b9e9c.zip |
timer interrupts
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 83 |
1 files changed, 27 insertions, 56 deletions
@@ -36,11 +36,11 @@ main() cprintf("\nxV6\n\n"); + pic_init(); // initialize PIC---not clear why mp_init(); // multiprocessor kinit(); // physical memory allocator tvinit(); // trap vectors idtinit(); // CPU's idt - pic_init(); // create fake process zero p = &proc[0]; @@ -59,8 +59,9 @@ main() p->ppid = 0; setupsegs(p); - // turn on interrupts - irq_setmask_8259A(0xff); + // turn on interrupts on boot processor + lapic_timerinit(); + lapic_enableintr(); write_eflags(read_eflags() | FL_IF); #if 0 @@ -68,38 +69,8 @@ main() cprintf("sec0.0 %x\n", buf[0] & 0xff); #endif -#if 1 p = newproc(); load_icode(p, _binary_usertests_start, (unsigned) _binary_usertests_size); -#endif - -#if 0 - i = 0; - p->mem[i++] = 0x90; // nop - p->mem[i++] = 0xb8; // mov ..., %eax - p->mem[i++] = SYS_fork; - p->mem[i++] = 0; - p->mem[i++] = 0; - p->mem[i++] = 0; - p->mem[i++] = 0xcd; // int - p->mem[i++] = T_SYSCALL; - p->mem[i++] = 0xb8; // mov ..., %eax - p->mem[i++] = SYS_wait; - p->mem[i++] = 0; - p->mem[i++] = 0; - p->mem[i++] = 0; - p->mem[i++] = 0xcd; // int - p->mem[i++] = T_SYSCALL; - p->mem[i++] = 0xb8; // mov ..., %eax - p->mem[i++] = SYS_exit; - p->mem[i++] = 0; - p->mem[i++] = 0; - p->mem[i++] = 0; - p->mem[i++] = 0xcd; // int - p->mem[i++] = T_SYSCALL; - p->tf->tf_eip = 0; - p->tf->tf_esp = p->sz; -#endif swtch(); @@ -109,32 +80,32 @@ main() void load_icode(struct proc *p, uint8_t *binary, unsigned size) { - int i; - struct Elf *elf; - struct Proghdr *ph; + int i; + struct Elf *elf; + struct Proghdr *ph; - // Check magic number on binary - elf = (struct Elf*) binary; - cprintf("elf %x magic %x\n", elf, elf->e_magic); - if (elf->e_magic != ELF_MAGIC) - panic("load_icode: not an ELF binary"); + // Check magic number on binary + elf = (struct Elf*) binary; + cprintf("elf %x magic %x\n", elf, elf->e_magic); + if (elf->e_magic != ELF_MAGIC) + panic("load_icode: not an ELF binary"); p->tf->tf_eip = elf->e_entry; p->tf->tf_esp = p->sz; - // Map and load segments as directed. - ph = (struct Proghdr*) (binary + elf->e_phoff); - for (i = 0; i < elf->e_phnum; i++, ph++) { - if (ph->p_type != ELF_PROG_LOAD) - continue; - cprintf("va %x memsz %d\n", ph->p_va, ph->p_memsz); - if (ph->p_va + ph->p_memsz < ph->p_va) - panic("load_icode: overflow in elf header segment"); - if (ph->p_va + ph->p_memsz >= p->sz) - panic("load_icode: icode wants to be above UTOP"); - - // Load/clear the segment - memcpy(p->mem + ph->p_va, binary + ph->p_offset, ph->p_filesz); - memset(p->mem + ph->p_va + ph->p_filesz, 0, ph->p_memsz - ph->p_filesz); - } + // Map and load segments as directed. + ph = (struct Proghdr*) (binary + elf->e_phoff); + for (i = 0; i < elf->e_phnum; i++, ph++) { + if (ph->p_type != ELF_PROG_LOAD) + continue; + cprintf("va %x memsz %d\n", ph->p_va, ph->p_memsz); + if (ph->p_va + ph->p_memsz < ph->p_va) + panic("load_icode: overflow in elf header segment"); + if (ph->p_va + ph->p_memsz >= p->sz) + panic("load_icode: icode wants to be above UTOP"); + + // Load/clear the segment + memcpy(p->mem + ph->p_va, binary + ph->p_offset, ph->p_filesz); + memset(p->mem + ph->p_va + ph->p_filesz, 0, ph->p_memsz - ph->p_filesz); + } } |