diff options
| author | rsc <rsc> | 2007-08-24 20:28:08 +0000 | 
|---|---|---|
| committer | rsc <rsc> | 2007-08-24 20:28:08 +0000 | 
| commit | 97ac612fb16748e6b011de4deaa803ec5f0afef8 (patch) | |
| tree | 8cc471a789517269791126b29b2ff82915e6bbe6 | |
| parent | ffa58d3616e5d829faa8e8a201f25c785800ccb2 (diff) | |
| download | xv6-labs-97ac612fb16748e6b011de4deaa803ec5f0afef8.tar.gz xv6-labs-97ac612fb16748e6b011de4deaa803ec5f0afef8.tar.bz2 xv6-labs-97ac612fb16748e6b011de4deaa803ec5f0afef8.zip | |
nits
| -rw-r--r-- | bootmain.c | 51 | ||||
| -rw-r--r-- | console.c | 34 | ||||
| -rw-r--r-- | proc.c | 11 | ||||
| -rw-r--r-- | proc.h | 2 | ||||
| -rw-r--r-- | syscall.c | 5 | 
5 files changed, 51 insertions, 52 deletions
| @@ -31,31 +31,35 @@  #include "x86.h"  #define SECTSIZE  512 -#define ELFHDR    ((struct elfhdr*) 0x10000) // scratch space  void readseg(uint, uint, uint);  void  cmain(void)  { +  struct elfhdr *elf;    struct proghdr *ph, *eph; +  void (*entry)(void); -  // read 1st page off disk -  readseg((uint) ELFHDR, SECTSIZE*8, 0); +  elf = (struct elfhdr*)0x10000;  // scratch space -  // is this a valid ELF? -  if(ELFHDR->magic != ELF_MAGIC) +  // Read 1st page off disk +  readseg((uint)elf, SECTSIZE*8, 0); + +  // Is this an ELF executable? +  if(elf->magic != ELF_MAGIC)      goto bad; -  // load each program segment (ignores ph flags) -  ph = (struct proghdr*) ((uchar*) ELFHDR + ELFHDR->phoff); -  eph = ph + ELFHDR->phnum; +  // Load each program segment (ignores ph flags). +  ph = (struct proghdr*)((uchar*)elf + elf->phoff); +  eph = ph + elf->phnum;    for(; ph < eph; ph++)      readseg(ph->va, ph->memsz, ph->offset); -  // call the entry point from the ELF header -  // note: does not return! -  ((void(*)(void)) (ELFHDR->entry & 0xFFFFFF))(); +  // Call the entry point from the ELF header. +  // Does not return! +  entry = (void(*)(void))(elf->entry & 0xFFFFFF); +  entry();  bad:    outw(0x8A00, 0x8A00); @@ -67,7 +71,7 @@ bad:  void  waitdisk(void)  { -  // wait for disk reaady +  // Wait for disk ready.    while((inb(0x1F7) & 0xC0) != 0x40)      ;  } @@ -76,9 +80,8 @@ waitdisk(void)  void  readsect(void *dst, uint offset)  { -  // wait for disk to be ready +  // Issue command.    waitdisk(); -    outb(0x1F2, 1);   // count = 1    outb(0x1F3, offset);    outb(0x1F4, offset >> 8); @@ -86,10 +89,8 @@ readsect(void *dst, uint offset)    outb(0x1F6, (offset >> 24) | 0xE0);    outb(0x1F7, 0x20);  // cmd 0x20 - read sectors -  // wait for disk to be ready +  // Read data.    waitdisk(); - -  // read a sector    insl(0x1F0, dst, SECTSIZE/4);  } @@ -98,24 +99,20 @@ readsect(void *dst, uint offset)  void  readseg(uint va, uint count, uint offset)  { -  uint end_va; +  uint eva;    va &= 0xFFFFFF; -  end_va = va + count; +  eva = va + count; -  // round down to sector boundary +  // Round down to sector boundary.    va &= ~(SECTSIZE - 1); -  // translate from bytes to sectors, and kernel starts at sector 1 +  // Translate from bytes to sectors; kernel starts at sector 1.    offset = (offset / SECTSIZE) + 1;    // If this is too slow, we could read lots of sectors at a time.    // We'd write more to memory than asked, but it doesn't matter --    // we load in increasing order. -  while(va < end_va) { -    readsect((uchar*) va, offset); -    va += SECTSIZE; -    offset++; -  } +  for(; va < eva; va += SECTSIZE, offset++) +    readsect((uchar*)va, offset);  } - @@ -9,7 +9,11 @@  #include "proc.h"  #include "kbd.h" -struct spinlock console_lock; +#define CRTPORT 0x3d4 +#define LPTPORT 0x378 +static ushort *crt = (ushort*)0xb8000;  // CGA memory + +static struct spinlock console_lock;  int panicked = 0;  int use_console_lock = 0; @@ -21,18 +25,16 @@ lpt_putc(int c)  {    int i; -  for(i = 0; !(inb(0x378+1) & 0x80) && i < 12800; i++) +  for(i = 0; !(inb(LPTPORT+1) & 0x80) && i < 12800; i++)      ; -  outb(0x378+0, c); -  outb(0x378+2, 0x08|0x04|0x01); -  outb(0x378+2, 0x08); +  outb(LPTPORT+0, c); +  outb(LPTPORT+2, 0x08|0x04|0x01); +  outb(LPTPORT+2, 0x08);  }  static void  cons_putc(int c)  { -  int crtport = 0x3d4; // io port of CGA -  ushort *crt = (ushort*) 0xB8000; // base of CGA memory    int ind;    if(panicked){ @@ -44,10 +46,10 @@ cons_putc(int c)    lpt_putc(c);    // cursor position, 16 bits, col + 80*row -  outb(crtport, 14); -  ind = inb(crtport + 1) << 8; -  outb(crtport, 15); -  ind |= inb(crtport + 1); +  outb(CRTPORT, 14); +  ind = inb(CRTPORT + 1) << 8; +  outb(CRTPORT, 15); +  ind |= inb(CRTPORT + 1);    c &= 0xff;    if(c == '\n'){ @@ -66,17 +68,17 @@ cons_putc(int c)      memset(crt + ind, 0, sizeof(crt[0]) * ((24 * 80) - ind));    } -  outb(crtport, 14); -  outb(crtport + 1, ind >> 8); -  outb(crtport, 15); -  outb(crtport + 1, ind); +  outb(CRTPORT, 14); +  outb(CRTPORT + 1, ind >> 8); +  outb(CRTPORT, 15); +  outb(CRTPORT + 1, ind);  }  void  printint(int xx, int base, int sgn)  { +  static char digits[] = "0123456789ABCDEF";    char buf[16]; -  char digits[] = "0123456789ABCDEF";    int i = 0, neg = 0;    uint x; @@ -65,15 +65,14 @@ growproc(int n)    return cp->sz - n;  } -// Set up CPU's segment descriptors and task state for a -// given process. -// If p==0, set up for "idle" state for when scheduler() -// is idling, not running any process. +// Set up CPU's segment descriptors and task state for a given process. +// If p==0, set up for "idle" state for when scheduler() is running.  void  setupsegs(struct proc *p)  { -  struct cpu *c = &cpus[cpu()]; - +  struct cpu *c; +   +  c = &cpus[cpu()];    c->ts.ss0 = SEG_KDATA << 3;    if(p)      c->ts.esp0 = (uint)(p->kstack + KSTACKSIZE); @@ -12,7 +12,7 @@  // Save all the regular registers so we don't need to care  // which are caller save.  // Don't save %eax, because that's the return register. -// The layout of jmpbuf is known to setjmp.S. +// The layout of jmpbuf must match code in setjmp.S.  struct jmpbuf {    int ebx;    int ecx; @@ -133,8 +133,9 @@ static int (*syscalls[])(void) = {  void  syscall(void)  { -  int num = cp->tf->eax; - +  int num; +   +  num = cp->tf->eax;    if(num >= 0 && num < NELEM(syscalls) && syscalls[num])      cp->tf->eax = syscalls[num]();    else { | 
