Merge branch 'riscv' into uvm-perm

This commit is contained in:
Frans Kaashoek 2022-08-23 11:01:06 -04:00
commit ccb7bd14c7
14 changed files with 156 additions and 95 deletions

View file

@ -259,7 +259,7 @@ userinit(void)
int
growproc(int n)
{
uint sz;
uint64 sz;
struct proc *p = myproc();
sz = p->sz;
@ -390,7 +390,7 @@ exit(int status)
int
wait(uint64 addr)
{
struct proc *np;
struct proc *pp;
int havekids, pid;
struct proc *p = myproc();
@ -399,32 +399,32 @@ wait(uint64 addr)
for(;;){
// Scan through table looking for exited children.
havekids = 0;
for(np = proc; np < &proc[NPROC]; np++){
if(np->parent == p){
for(pp = proc; pp < &proc[NPROC]; pp++){
if(pp->parent == p){
// make sure the child isn't still in exit() or swtch().
acquire(&np->lock);
acquire(&pp->lock);
havekids = 1;
if(np->state == ZOMBIE){
if(pp->state == ZOMBIE){
// Found one.
pid = np->pid;
if(addr != 0 && copyout(p->pagetable, addr, (char *)&np->xstate,
sizeof(np->xstate)) < 0) {
release(&np->lock);
pid = pp->pid;
if(addr != 0 && copyout(p->pagetable, addr, (char *)&pp->xstate,
sizeof(pp->xstate)) < 0) {
release(&pp->lock);
release(&wait_lock);
return -1;
}
freeproc(np);
release(&np->lock);
freeproc(pp);
release(&pp->lock);
release(&wait_lock);
return pid;
}
release(&np->lock);
release(&pp->lock);
}
}
// No point waiting if we don't have any children.
if(!havekids || p->killed){
if(!havekids || killed(p)){
release(&wait_lock);
return -1;
}
@ -603,6 +603,25 @@ kill(int pid)
return -1;
}
void
setkilled(struct proc *p)
{
acquire(&p->lock);
p->killed = 1;
release(&p->lock);
}
int
killed(struct proc *p)
{
int k;
acquire(&p->lock);
k = p->killed;
release(&p->lock);
return k;
}
// Copy to either a user address, or kernel address,
// depending on usr_dst.
// Returns 0 on success, -1 on error.