Make Austin happier
2011
This commit is contained in:
		
							parent
							
								
									a4b213cf49
								
							
						
					
					
						commit
						d9818bdd7d
					
				
					 2 changed files with 13 additions and 13 deletions
				
			
		
							
								
								
									
										2
									
								
								README
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
										
									
									
									
								
							| 
						 | 
					@ -26,7 +26,7 @@ In addition, we are grateful for the patches contributed by Greg
 | 
				
			||||||
Price, Yandong Mao, and Hitoshi Mitake.
 | 
					Price, Yandong Mao, and Hitoshi Mitake.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The code in the files that constitute xv6 is
 | 
					The code in the files that constitute xv6 is
 | 
				
			||||||
Copyright 2006-2007 Frans Kaashoek, Robert Morris, and Russ Cox.
 | 
					Copyright 2006-2011 Frans Kaashoek, Robert Morris, and Russ Cox.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ERROR REPORTS
 | 
					ERROR REPORTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										24
									
								
								vm.c
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								vm.c
									
										
									
									
									
								
							| 
						 | 
					@ -18,7 +18,7 @@ seginit(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  struct cpu *c;
 | 
					  struct cpu *c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Map virtual addresses to linear addresses using identity map.
 | 
					  // Map "logical" addresses to virtual addresses using identity map.
 | 
				
			||||||
  // Cannot share a CODE descriptor for both kernel and user
 | 
					  // Cannot share a CODE descriptor for both kernel and user
 | 
				
			||||||
  // because it would have to have DPL_USR, but the CPU forbids
 | 
					  // because it would have to have DPL_USR, but the CPU forbids
 | 
				
			||||||
  // an interrupt from CPL=0 to DPL=3.
 | 
					  // an interrupt from CPL=0 to DPL=3.
 | 
				
			||||||
| 
						 | 
					@ -40,7 +40,7 @@ seginit(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Return the address of the PTE in page table pgdir
 | 
					// Return the address of the PTE in page table pgdir
 | 
				
			||||||
// that corresponds to linear address va.  If alloc!=0,
 | 
					// that corresponds to virtual address va.  If alloc!=0,
 | 
				
			||||||
// create any required page table pages.
 | 
					// create any required page table pages.
 | 
				
			||||||
static pte_t *
 | 
					static pte_t *
 | 
				
			||||||
walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
 | 
					walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
 | 
				
			||||||
| 
						 | 
					@ -64,17 +64,17 @@ walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
 | 
				
			||||||
  return &pgtab[PTX(va)];
 | 
					  return &pgtab[PTX(va)];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Create PTEs for linear addresses starting at la that refer to
 | 
					// Create PTEs for virtual addresses starting at la that refer to
 | 
				
			||||||
// physical addresses starting at pa. la and size might not
 | 
					// physical addresses starting at pa. la and size might not
 | 
				
			||||||
// be page-aligned.
 | 
					// be page-aligned.
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(void))
 | 
					mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm, char* (*alloc)(void))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  char *a, *last;
 | 
					  char *a, *last;
 | 
				
			||||||
  pte_t *pte;
 | 
					  pte_t *pte;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  a = PGROUNDDOWN(la);
 | 
					  a = PGROUNDDOWN(va);
 | 
				
			||||||
  last = PGROUNDDOWN(la + size - 1);
 | 
					  last = PGROUNDDOWN(va + size - 1);
 | 
				
			||||||
  for(;;){
 | 
					  for(;;){
 | 
				
			||||||
    pte = walkpgdir(pgdir, a, alloc);
 | 
					    pte = walkpgdir(pgdir, a, alloc);
 | 
				
			||||||
    if(pte == 0)
 | 
					    if(pte == 0)
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,7 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(vo
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The mappings from logical to linear are one to one (i.e.,
 | 
					// The mappings from logical to virtual are one to one (i.e.,
 | 
				
			||||||
// segmentation doesn't do anything).
 | 
					// segmentation doesn't do anything).
 | 
				
			||||||
// There is one page table per process, plus one that's used
 | 
					// There is one page table per process, plus one that's used
 | 
				
			||||||
// when a CPU is not running any process (kpgdir).
 | 
					// when a CPU is not running any process (kpgdir).
 | 
				
			||||||
| 
						 | 
					@ -98,7 +98,6 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(vo
 | 
				
			||||||
// page protection bits prevent it from using anything other
 | 
					// page protection bits prevent it from using anything other
 | 
				
			||||||
// than its memory.
 | 
					// than its memory.
 | 
				
			||||||
// 
 | 
					// 
 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// setupkvm() and exec() set up every page table like this:
 | 
					// setupkvm() and exec() set up every page table like this:
 | 
				
			||||||
//   0..USERTOP      : user memory (text, data, stack, heap), mapped to some unused phys mem
 | 
					//   0..USERTOP      : user memory (text, data, stack, heap), mapped to some unused phys mem
 | 
				
			||||||
//   KERNBASE..KERNBASE+1M: mapped to 0..1M
 | 
					//   KERNBASE..KERNBASE+1M: mapped to 0..1M
 | 
				
			||||||
| 
						 | 
					@ -112,9 +111,9 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(vo
 | 
				
			||||||
// (which is inaccessible in user mode).  The user program sits in
 | 
					// (which is inaccessible in user mode).  The user program sits in
 | 
				
			||||||
// the bottom of the address space, and the kernel at the top at KERNBASE.
 | 
					// the bottom of the address space, and the kernel at the top at KERNBASE.
 | 
				
			||||||
static struct kmap {
 | 
					static struct kmap {
 | 
				
			||||||
  void *l;
 | 
					  void *virt;
 | 
				
			||||||
  uint p;
 | 
					  uint phys_start;
 | 
				
			||||||
  uint e;
 | 
					  uint phys_end;
 | 
				
			||||||
  int perm;
 | 
					  int perm;
 | 
				
			||||||
} kmap[] = {
 | 
					} kmap[] = {
 | 
				
			||||||
  { P2V(0), 0, 1024*1024, PTE_W},  // First 1Mbyte contains BIOS and some IO devices
 | 
					  { P2V(0), 0, 1024*1024, PTE_W},  // First 1Mbyte contains BIOS and some IO devices
 | 
				
			||||||
| 
						 | 
					@ -135,7 +134,8 @@ setupkvm(char* (*alloc)(void))
 | 
				
			||||||
  memset(pgdir, 0, PGSIZE);
 | 
					  memset(pgdir, 0, PGSIZE);
 | 
				
			||||||
  k = kmap;
 | 
					  k = kmap;
 | 
				
			||||||
  for(k = kmap; k < &kmap[NELEM(kmap)]; k++)
 | 
					  for(k = kmap; k < &kmap[NELEM(kmap)]; k++)
 | 
				
			||||||
    if(mappages(pgdir, k->l, k->e - k->p, (uint)k->p, k->perm, alloc) < 0)
 | 
					    if(mappages(pgdir, k->virt, k->phys_end - k->phys_start, (uint)k->phys_start, 
 | 
				
			||||||
 | 
							k->perm, alloc) < 0)
 | 
				
			||||||
      return 0;
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return pgdir;
 | 
					  return pgdir;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue