arm:make the MMU fetch pagetable data through the caches.
Change-Id: Ibd7b66558c369d0c0792c02801562580d255fa1f
This commit is contained in:
		
							parent
							
								
									827378c57f
								
							
						
					
					
						commit
						0d02dc9d54
					
				| @ -163,6 +163,21 @@ arm/vm.h | |||||||
| #define ARM_VM_PFE_FS4    (1<<10)  /* Fault status (bit 4) */ | #define ARM_VM_PFE_FS4    (1<<10)  /* Fault status (bit 4) */ | ||||||
| #define ARM_VM_PFE_FS3_0   0xf     /* Fault status (bits 3:0) */ | #define ARM_VM_PFE_FS3_0   0xf     /* Fault status (bits 3:0) */ | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | /* Translation table base register specfic flags */ | ||||||
|  | #define ARM_TTBR_C (0x01) /* Cacheable bit. Indicates whether the translation table walk is to Inner Cacheable memory. */ | ||||||
|  | 
 | ||||||
|  | /* RGN bits[4:3] indicates the Outer cacheability attributes 
 | ||||||
|  |    for the memory associated with the translation table walks */ | ||||||
|  | #define ARM_TTBR_OUTER_NC    (0x0 << 3) /* Non-cacheable*/ | ||||||
|  | #define ARM_TTBR_OUTER_WBWA  (0x1 << 3) /* Outer Write-Back Write-Allocate Cacheable. */ | ||||||
|  | #define ARM_TTBR_OUTER_WT    (0x2 << 3) /* Outer Write-Through Cacheable. */ | ||||||
|  | #define ARM_TTBR_OUTER_WBNWA (0x3 << 3) /* Outer Write-Back no Write-Allocate Cacheable. */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #define ARM_TTBR_ADDR_MASK (0xffffc000) /* only the 18 upper bits are to be used as address */ | ||||||
|  | #define ARM_TTBR_FLAGS_CACHED ARM_TTBR_OUTER_WBWA | ||||||
|  | 
 | ||||||
| /* Fault status */ | /* Fault status */ | ||||||
| #define ARM_VM_PFE_FS(s) \ | #define ARM_VM_PFE_FS(s) \ | ||||||
|     ((((s) & ARM_VM_PFE_FS4) >> 6) | ((s) & ARM_VM_PFE_FS3_0)) |     ((((s) & ARM_VM_PFE_FS4) >> 6) | ((s) & ARM_VM_PFE_FS3_0)) | ||||||
|  | |||||||
| @ -215,16 +215,20 @@ static inline u32_t read_ttbr0() | |||||||
| 	asm volatile("mrc p15, 0, %[bar], c2, c0, 0 @ Read TTBR0\n\t" | 	asm volatile("mrc p15, 0, %[bar], c2, c0, 0 @ Read TTBR0\n\t" | ||||||
| 			: [bar] "=r" (bar)); | 			: [bar] "=r" (bar)); | ||||||
| 
 | 
 | ||||||
| 	return bar; | 	return bar & ARM_TTBR_ADDR_MASK; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Write Translation Table Base Register 0 */ | /* Write Translation Table Base Register 0 */ | ||||||
| static inline void write_ttbr0(u32_t bar) | static inline void write_ttbr0(u32_t bar) | ||||||
| { | { | ||||||
| 	barrier(); | 	barrier(); | ||||||
| 
 | 	/* In our setup TTBR contains the base address *and* the flags
 | ||||||
|  | 	   but other pieces of the kernel code expect ttbr to be the  | ||||||
|  | 	   base address of the l1 page table. We therefore add the | ||||||
|  | 	   flags here and remove them in the read_ttbr0 */ | ||||||
|  | 	u32_t v  =  (bar  & ARM_TTBR_ADDR_MASK ) | ARM_TTBR_FLAGS_CACHED; | ||||||
| 	asm volatile("mcr p15, 0, %[bar], c2, c0, 0 @ Write TTBR0\n\t" | 	asm volatile("mcr p15, 0, %[bar], c2, c0, 0 @ Write TTBR0\n\t" | ||||||
| 			: : [bar] "r" (bar)); | 			: : [bar] "r" (v)); | ||||||
| 
 | 
 | ||||||
| 	refresh_tlb(); | 	refresh_tlb(); | ||||||
| } | } | ||||||
|  | |||||||
| @ -303,7 +303,7 @@ int vm_lookup(const struct proc *proc, const vir_bytes virtual, | |||||||
| 	assert(HASPT(proc)); | 	assert(HASPT(proc)); | ||||||
| 
 | 
 | ||||||
| 	/* Retrieve page directory entry. */ | 	/* Retrieve page directory entry. */ | ||||||
| 	root = (u32_t *) proc->p_seg.p_ttbr; | 	root = (u32_t *) (proc->p_seg.p_ttbr & ARM_TTBR_ADDR_MASK); | ||||||
| 	assert(!((u32_t) root % ARM_PAGEDIR_SIZE)); | 	assert(!((u32_t) root % ARM_PAGEDIR_SIZE)); | ||||||
| 	pde = ARM_VM_PDE(virtual); | 	pde = ARM_VM_PDE(virtual); | ||||||
| 	assert(pde >= 0 && pde < ARM_VM_DIR_ENTRIES); | 	assert(pde >= 0 && pde < ARM_VM_DIR_ENTRIES); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Kees Jongenburger
						Kees Jongenburger