kill user process when it generates an unhandled trap (e.g., 13)
fix bug in test code of malloc
This commit is contained in:
		
							parent
							
								
									81d5219998
								
							
						
					
					
						commit
						74493bf446
					
				
					 3 changed files with 3 additions and 19 deletions
				
			
		
							
								
								
									
										4
									
								
								trap.c
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								trap.c
									
										
									
									
									
								
							| 
						 | 
					@ -126,8 +126,10 @@ trap(struct trapframe *tf)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cprintf("trap %d from cpu %d eip %x\n", v, cpu(), tf->eip);
 | 
					  cprintf("trap %d from cpu %d eip %x\n", v, cpu(), tf->eip);
 | 
				
			||||||
  if(curproc[cpu()])
 | 
					  if(curproc[cpu()]) {
 | 
				
			||||||
    cprintf("pid %d\n", curproc[cpu()]->pid);
 | 
					    cprintf("pid %d\n", curproc[cpu()]->pid);
 | 
				
			||||||
 | 
					    proc_exit();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  //  panic("trap");
 | 
					  //  panic("trap");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return;
 | 
					  return;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,8 +26,6 @@ free(void *ap)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Header *bp, *p;
 | 
					  Header *bp, *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  printf(1, "free\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bp = (Header *) ap - 1;
 | 
					  bp = (Header *) ap - 1;
 | 
				
			||||||
  for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
 | 
					  for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
 | 
				
			||||||
    if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
 | 
					    if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
 | 
				
			||||||
| 
						 | 
					@ -53,7 +51,6 @@ morecore(uint nu)
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  if (nu < PAGE)
 | 
					  if (nu < PAGE)
 | 
				
			||||||
    nu = PAGE;
 | 
					    nu = PAGE;
 | 
				
			||||||
  printf(1, "call sbrk\n");
 | 
					 | 
				
			||||||
  cp = sbrk(nu * sizeof(Header));
 | 
					  cp = sbrk(nu * sizeof(Header));
 | 
				
			||||||
  if (cp == (char *) -1)
 | 
					  if (cp == (char *) -1)
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
| 
						 | 
					@ -69,8 +66,6 @@ malloc(uint nbytes)
 | 
				
			||||||
  Header *p, *prevp;
 | 
					  Header *p, *prevp;
 | 
				
			||||||
  uint nunits;
 | 
					  uint nunits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  printf(1, "malloc %d\n", nbytes);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
 | 
					  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
 | 
				
			||||||
  if ((prevp = freep) == 0) {
 | 
					  if ((prevp = freep) == 0) {
 | 
				
			||||||
    base.s.ptr = freep = prevp = &base;
 | 
					    base.s.ptr = freep = prevp = &base;
 | 
				
			||||||
| 
						 | 
					@ -86,7 +81,6 @@ malloc(uint nbytes)
 | 
				
			||||||
	p->s.size = nunits;
 | 
						p->s.size = nunits;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      freep = prevp;
 | 
					      freep = prevp;
 | 
				
			||||||
      printf(1, "malloc returns: %d\n", (int) (p+1));
 | 
					 | 
				
			||||||
      return (void *) (p + 1);
 | 
					      return (void *) (p + 1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (p == freep) 
 | 
					    if (p == freep) 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								usertests.c
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								usertests.c
									
										
									
									
									
								
							| 
						 | 
					@ -120,20 +120,8 @@ exitwait(void)
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
mem(void)
 | 
					mem(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  void *m = malloc(4096);
 | 
					 | 
				
			||||||
  void *m1, *m2;
 | 
					  void *m1, *m2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  free(m + 3*1024);
 | 
					 | 
				
			||||||
  free(m + 2*1024);
 | 
					 | 
				
			||||||
  free(m + 1024);
 | 
					 | 
				
			||||||
  free(m);
 | 
					 | 
				
			||||||
  m1 = malloc(4096);
 | 
					 | 
				
			||||||
  if (m1 != m) {
 | 
					 | 
				
			||||||
    puts("didn't coalesce\n");
 | 
					 | 
				
			||||||
    exit();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  free(m1);
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  m1 = 0;
 | 
					  m1 = 0;
 | 
				
			||||||
  while ((m2 = malloc(1024)) != 0) {
 | 
					  while ((m2 = malloc(1024)) != 0) {
 | 
				
			||||||
    *(char **) m2 = m1;
 | 
					    *(char **) m2 = m1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue