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