diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2019-06-04 10:43:45 -0400 | 
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 2019-06-04 10:43:45 -0400 | 
| commit | 0e131b226336808c135795f5b9d7defc5a58b2ae (patch) | |
| tree | 226cf0c8f1043d99175aee8835baf570cdf662e6 | |
| parent | b78894f34ebbceb23bcf36ff820fefb942b54ccf (diff) | |
| download | xv6-labs-0e131b226336808c135795f5b9d7defc5a58b2ae.tar.gz xv6-labs-0e131b226336808c135795f5b9d7defc5a58b2ae.tar.bz2 xv6-labs-0e131b226336808c135795f5b9d7defc5a58b2ae.zip | |
fix a problem with end. make uartputc() wait until h/w is ready.
| -rw-r--r-- | defs.h | 1 | ||||
| -rw-r--r-- | kalloc.c | 6 | ||||
| -rw-r--r-- | kernel.ld | 4 | ||||
| -rw-r--r-- | memlayout.h | 3 | ||||
| -rw-r--r-- | proc.c | 2 | ||||
| -rw-r--r-- | riscv.h | 16 | ||||
| -rw-r--r-- | start.c | 2 | ||||
| -rw-r--r-- | sysproc.c | 1 | ||||
| -rw-r--r-- | trap.c | 2 | ||||
| -rw-r--r-- | uart.c | 3 | ||||
| -rw-r--r-- | vm.c | 15 | 
11 files changed, 32 insertions, 23 deletions
| @@ -179,7 +179,6 @@ int             uartgetc(void);  // vm.c  void            kvminit(void); -void            kvmswitch(void);  pagetable_t     uvmcreate(void);  void            uvminit(pagetable_t, char *, uint);  uint64          uvmalloc(pagetable_t, uint64, uint64); @@ -27,8 +27,6 @@ void  kinit()  {    initlock(&kmem.lock, "kmem"); -  if(PHYSTOP > RAMDISK) -    panic("kinit");    freerange(end, (void*)PHYSTOP);  } @@ -76,7 +74,7 @@ kalloc(void)    if(r)      kmem.freelist = r->next;    release(&kmem.lock); -  memset((char*)r, 5, PGSIZE); // fill with junk +  if(r) +    memset((char*)r, 5, PGSIZE); // fill with junk    return (void*)r;  } - @@ -26,8 +26,6 @@ SECTIONS    }    bss : {      *(.bss) +    PROVIDE(end = .);    } - -  . = ALIGN(0x1000); -  PROVIDE(end = .);  } diff --git a/memlayout.h b/memlayout.h index 1a6b200..db233f7 100644 --- a/memlayout.h +++ b/memlayout.h @@ -2,6 +2,7 @@  // qemu -machine virt is set up like this:  // 00001000 -- boot ROM, provided by qemu +// 0C000000 -- PLIC  // 10000000 -- uart0 registers  // 80000000 -- boot ROM jumps here in machine mode  //             -kernel loads the kernel here @@ -26,7 +27,7 @@  // for use by the kernel and user pages  // from physical address 0x80000000 to PHYSTOP.  #define KERNBASE 0x80000000L -#define PHYSTOP (KERNBASE + 64*1024*1024) +#define PHYSTOP (KERNBASE + 128*1024*1024)  // map the trampoline page to the highest address,  // in both user and kernel space. @@ -360,7 +360,7 @@ scheduler(void)    for(;;){      // Enable interrupts on this processor.      intr_on(); -     +      // Loop over process table looking for process to run.      acquire(&ptable.lock);      for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){ @@ -132,6 +132,14 @@ w_stvec(uint64 x)    asm("csrw stvec, %0" : : "r" (x));  } +static inline uint64 +r_stvec() +{ +  uint64 x; +  asm("csrr %0, stvec" : "=r" (x) ); +  return x; +} +  // use riscv's sv39 page table scheme.  #define SATP_SV39 (8L << 60) @@ -201,6 +209,14 @@ intr_get()    return (x & SSTATUS_SIE) != 0;  } +static inline uint64 +r_sp() +{ +  uint64 x; +  asm("mv %0, sp" : "=r" (x) ); +  return x; +} +  #define PGSIZE 4096 // bytes per page  #define PGSHIFT 12  // bits of offset within a page @@ -6,7 +6,7 @@  void main();  // entry.S uses this as the initial stack. -char stack0[4096]; +__attribute__ ((aligned (16))) char stack0[4096];  // entry.S jumps here in machine mode on stack0.  void @@ -39,6 +39,7 @@ sys_sbrk(void)    if(argint(0, &n) < 0)      return -1; +  printf("sbrk(%d), sz was %d\n", n, (int)myproc()->sz);    addr = myproc()->sz;    if(growproc(n) < 0)      return -1; @@ -108,7 +108,7 @@ usertrapret(void)  // interrupts and exceptions from kernel code go here,  // on whatever the current kernel stack is.  // must be 4-byte aligned to fit in stvec. -void __attribute__ ((aligned (4))) +void   kerneltrap()  {    uint64 sstatus = r_sstatus(); @@ -46,6 +46,9 @@ uartinit(void)  void  uartputc(int c)  { +  // wait for Transmit Holding Empty to be set in LSR. +  while((*R(5) & (1 << 5)) == 0) +    ;    *R(0) = c;  } @@ -33,12 +33,11 @@ kvminit()    // PLIC    mappages(kernel_pagetable, PLIC, 0x4000000,             PLIC, PTE_R | PTE_W); -      // map kernel text executable and read-only.    mappages(kernel_pagetable, KERNBASE, (uint64)etext-KERNBASE,             KERNBASE, PTE_R | PTE_X); -   +    // map kernel data and the physical RAM we'll make use of.    mappages(kernel_pagetable, (uint64)etext, PHYSTOP-(uint64)etext,             (uint64)etext, PTE_R | PTE_W); @@ -52,14 +51,8 @@ kvminit()    mappages(kernel_pagetable, TRAMPOLINE, PGSIZE,             (uint64)trampout, PTE_R | PTE_X); -  kvmswitch(); -} - -// Switch h/w page table register to the kernel's page table, -// and enable paging. -void -kvmswitch(void) -{ +  // Switch h/w page table register to the kernel's page table, +  // and enable paging.    w_satp(MAKE_SATP(kernel_pagetable));  } @@ -214,7 +207,7 @@ uvmalloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)    for(; a < newsz; a += PGSIZE){      mem = kalloc();      if(mem == 0){ -      uvmdealloc(pagetable, newsz, oldsz); +      uvmdealloc(pagetable, a, oldsz);        return 0;      }      memset(mem, 0, PGSIZE); | 
