Commit graph

54 commits

Author SHA1 Message Date
Robert Morris 8dc71a257d handle another out-of-memory in fork(). the policy here is not consistent,
since other calls (e.g. exec()) panic on out of memory.
2020-08-17 08:18:23 -04:00
Robert Morris bc51626aab try to handle a few of the possible out-of-memory errors in fork() 2020-08-17 08:18:23 -04:00
Robert Morris a8dd44cf59 modify uvmunmap() to be in aligned pages
fix a bug in fork() recovering from out of memory
2020-08-17 08:18:23 -04:00
Frans Kaashoek 0502342335
Merge pull request #9 from d0iasm/riscv
update initcode to avoid using the compressed extension
2020-08-10 13:54:58 -04:00
Robert Morris 7f35d7a14e modify each page in usertests countfree()
get rid of static for walk() and freewalk()
2020-08-10 11:19:10 -04:00
Robert Morris 1e72d5ca08 cpu->scheduler -> cpu->context to reduce confusion 2020-08-10 11:19:10 -04:00
Robert Morris 5494c91705 rename p->tf to p->trapframe, for consistency with p->context 2020-08-10 11:19:10 -04:00
Asami Doi 8b052656a0 update initcode to avoid using the compressed extension 2020-03-20 12:33:32 +09:00
Robert Morris e7ffb74ad1 fix a potential memory leak 2019-10-27 13:36:46 -04:00
Robert Morris 2821d43cc9 nits 2019-10-16 12:27:08 -04:00
Robert Morris 37df68e5de story is more complex than I thought. 2019-09-23 07:24:41 -04:00
Robert Morris d175beadf5 bug fix: reparent() sometimes deadlocked
bug fix: exit() sometimes released a different parent lock than it acquired
usertests
2019-09-23 06:50:25 -04:00
Robert Morris 4de161f973 don't panic if a program frees all its memory with sbrk().
if a program sbrk()'s to a non-page-boundary, don't free that page.
corresponding usertests.
2019-09-20 11:35:27 -04:00
Frans Kaashoek 7e6c37e67e Support exit status for exit/wait
One test case for returning a exit status
Passes usertests, but haven't used it to simplify tests
2019-09-10 12:30:10 -04:00
Frans Kaashoek 21ad8c76bc A few now unused DOC 2019-08-19 18:12:19 -04:00
Frans Kaashoek 2501560cd6 Cosmetic cleanup: fsinit reads sb and calls loginit. initialize icache
in main.c and don't make it disk specific; the icache is shared.  This
doesn't matter since we have only one disk, but conceptually cleaner
and maybe helpful to students for mount lab.
2019-08-18 14:35:11 -04:00
Robert Morris cf48b24c03 beautify console.c 2019-07-27 04:15:06 -04:00
Robert Morris ea95a6654c trampin -> uservec
trampout -> userret
2019-07-26 04:53:46 -04:00
Robert Morris 4e62de64cd fix an exit/exit deadlock -> one more locking protocol violation
increase timer rate from 1/second to 10/second
2019-07-25 06:30:49 -04:00
Robert Morris 9a817bd134 rationalize some vm function names 2019-07-24 15:28:37 -04:00
Robert Morris a77287e924 no more PAGEBREAK 2019-07-24 13:33:43 -04:00
Robert Morris 54178ad94d simplify kernel mapping calls 2019-07-23 12:17:17 -04:00
Robert Morris 55bc96d419 a few core -> CPU
get rid of PDF generating support
2019-07-23 11:14:10 -04:00
Frans Kaashoek 6c78af4a57 fix mapkstack 2019-07-22 20:58:15 -04:00
Robert Morris 6b379e4707 -MD and TRAPFRAME 2019-07-22 14:54:40 -04:00
Frans Kaashoek c5d48db045 Merge branch 'riscv-kstack' into riscv 2019-07-22 13:32:33 -04:00
Robert Morris 328204d9cc not much 2019-07-20 18:51:31 -04:00
Robert Morris 06e49a58dc pi for pipe, rather than p, to avoid confusion with proc's p->lock 2019-07-20 17:07:20 -04:00
Robert Morris 3333665ab6 not much 2019-07-20 10:17:26 -04:00
Robert Morris 2418ac380c it's not clear that the release will always enable interrupts 2019-07-19 13:27:48 -04:00
Robert Morris dbd729b32d with per-proc locks, we don't need the intr_on() inside the loop. 2019-07-19 10:20:02 -04:00
Frans Kaashoek 9156632701 One way of supporting a guard page below kstack: allocate kstacks in
procinit() and map them high up (below TRAMPOLNE) with an empty
mapping below each stack.  Never free a kernel stack.

Another way would be to allocate and map them dynamically, but then we
need to reload page table when switching processes in scheduler()
and/or have a kernel pagetable per proc (if we want k->stack to be the
same virtual address in each process).

One gotcha: kernel addresses are not equal to physical addresses for
stack addresses.  A stack address must be translated if we need its
physical address (e.g., virtio passes a stack address to the disk).
2019-07-19 08:38:51 -04:00
Robert Morris ebc3937209 conservatively call sfence.vma before every satp load. 2019-07-16 17:02:21 -04:00
Robert Morris 4bc900e78b nits 2019-07-10 14:54:34 -04:00
Robert Morris 061e3be6f8 more comment cleanup 2019-07-10 10:13:08 -04:00
Robert Morris 5eb1685700 have kill() lock before looking at p->pid
document wait()'s use of np->parent w/o holding lock.
2019-07-10 09:24:50 -04:00
Robert Morris 9981bb2270 tweak some comments. 2019-07-10 08:57:51 -04:00
Robert Morris 9d34838b4f holding p->lock all the way through state=RUNNABLE means we don't need EMBRYO 2019-07-08 11:11:00 -04:00
Robert Morris db72f3108f eliminate ptable. ptable.lock -> pid_lock. 2019-07-07 15:20:13 -04:00
Robert Morris 4ce3a5fa21 nits 2019-07-07 14:57:16 -04:00
Robert Morris c4f6a241cd avoid a double-lock of initproc->lock if child of init is reparenting 2019-07-07 07:03:28 -04:00
Frans Kaashoek dabbc348bc Maybe fix two races identified by rtm (thx!):
- during exit(), hold p's parent lock and p's lock across all changes
to p and its parent (e.g., reparenting and wakeup1).  the lock
ordering between concurrent exits of children, parent, and great
parent might work out because processes form a tree.

- in wakeup1() test and set p->state atomically by asking caller to
have p locked.

a correctness proof would be desirable.
2019-07-06 16:38:41 -04:00
Frans Kaashoek 6bfb078b14 x 2019-07-04 08:54:16 -04:00
Frans Kaashoek 47e69250d0 Simplify wakeup1 2019-07-03 15:38:30 -04:00
Frans Kaashoek cee830af24 Apply some corresponding bug fixes from wq branch here 2019-07-03 15:18:55 -04:00
Frans Kaashoek 26f306113a Fix a lost wakeup bug: the disk driver's wakeup() can run after the
reading process acquired p->lock and released virtio lock in sleep(),
but before the process had set p->status to SLEEPING, because the
wakeup tested p->status without holding p's lock.  Thus, wakeup can
complete without seeing any process SLEEPING and then p sets p->status
to SLEEPING.

Fix some other issues:

- Don't initialize proc lock in allocproc(), because freeproc() sets
np->state = UNUSED and allocproc() can choose np and calls initlock()
on the process's lock, releasing np's lock accidentally.  Move
initializing proc's lock to init.

- Protect nextpid using ptable.lock (and move into its own function)

Some clean up:
- Don't acquire p->lock when it p is used in a private way (e.g., exit()/grow()).
- Move find_runnable() back into scheduler().
2019-07-02 19:29:14 -04:00
Frans Kaashoek 1e4d7065d6 Merge branch 'riscv' into riscv-proc 2019-07-02 14:19:31 -04:00
Frans Kaashoek 84c759fc02 x 2019-07-02 14:09:38 -04:00
Frans Kaashoek 37ac6f8f4f Don't start processes at the end of the proc table 2019-07-02 13:55:52 -04:00
Frans Kaashoek da51735980 Avoid two cores selecting the same process to run 2019-07-02 13:40:33 -04:00