Changeset 32e8cd1 in mainline for kernel/arch/sparc32/src/mm
- Timestamp:
- 2013-12-28T17:16:44Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c1023bcb
- Parents:
- f6f22cdb
- Location:
- kernel/arch/sparc32/src/mm
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc32/src/mm/as.c
rf6f22cdb r32e8cd1 38 38 #include <genarch/mm/page_pt.h> 39 39 40 static ptd_t context_table[ASID_MAX_ARCH] __attribute__((aligned (1024)));40 static ptd_t context_table[ASID_MAX_ARCH] __attribute__((aligned(1024))); 41 41 42 42 void as_arch_init(void) 43 43 { 44 44 as_operations = &as_pt_operations; 45 as_context_table = (uintptr_t) &context_table;45 as_context_table = (uintptr_t) &context_table; 46 46 } 47 47 48 48 void as_install_arch(as_t *as) 49 49 { 50 printf("as_install_arch(asid=%d)\n", as->asid); 51 printf("genarch.page_table=%p\n", as->genarch.page_table); 52 53 context_table[as->asid].table_pointer = (uintptr_t)as->genarch.page_table >> 6; 50 context_table[as->asid].table_pointer = 51 (uintptr_t) as->genarch.page_table >> 6; 54 52 context_table[as->asid].et = PTE_ET_DESCRIPTOR; 55 53 asi_u32_write(ASI_MMUREGS, 0x200, as->asid); -
kernel/arch/sparc32/src/mm/frame.c
rf6f22cdb r32e8cd1 46 46 uintptr_t base; 47 47 size_t size; 48 49 48 machine_get_memory_extents(&base, &size); 50 49 51 50 base = ALIGN_UP(base, FRAME_SIZE); 52 51 size = ALIGN_DOWN(size, FRAME_SIZE); … … 54 53 if (!frame_adjust_zone_bounds(low, &base, &size)) 55 54 return; 56 55 57 56 if (low) { 58 57 zone_create(ADDR2PFN(base), SIZE2FRAMES(size), 59 58 BOOT_PT_START_FRAME + BOOT_PT_SIZE_FRAMES, 60 59 ZONE_AVAILABLE | ZONE_LOWMEM); 61 62 printf("low_zone: %d frames\n", SIZE2FRAMES(size));63 60 } else { 64 61 pfn_t conf = zone_external_conf_alloc(SIZE2FRAMES(size)); … … 66 63 zone_create(ADDR2PFN(base), SIZE2FRAMES(size), conf, 67 64 ZONE_AVAILABLE | ZONE_HIGHMEM); 68 69 printf("high zone: %d frames\n", SIZE2FRAMES(size));70 65 } 71 72 printf("free: %d\n", frame_total_free_get());73 66 } 74 67 75 68 void physmem_print(void) 76 69 { 77 70 // FIXME TODO 78 71 } 79 72 … … 82 75 { 83 76 frame_common_arch_init(true); 84 85 /* blacklist boot page table */77 78 /* Blacklist boot page table */ 86 79 frame_mark_unavailable(BOOT_PT_START_FRAME, BOOT_PT_SIZE_FRAMES); 87 printf("free: %d\n", frame_total_free_get());88 //machine_frame_init();89 80 } 90 81 … … 95 86 } 96 87 97 /** Frees the boot page table. */98 /*void boot_page_table_free(void)99 {100 unsigned int i;101 for (i = 0; i < BOOT_PT_SIZE_FRAMES; i++)102 frame_free(i * FRAME_SIZE + BOOT_PT_ADDRESS);103 }*/104 105 88 /** @} 106 89 */ -
kernel/arch/sparc32/src/mm/page.c
rf6f22cdb r32e8cd1 27 27 */ 28 28 29 /** @addtogroup abs32lemm29 /** @addtogroup sparc32mm 30 30 * @{ 31 31 */ … … 57 57 int flags = PAGE_CACHEABLE | PAGE_EXEC; 58 58 page_mapping_operations = &pt_mapping_operations; 59 59 60 60 page_table_lock(AS_KERNEL, true); 61 61 62 62 /* Kernel identity mapping */ 63 //FIXME: We need to consider the possibility that 64 //identity_base > identity_size and physmem_end. 65 //This might lead to overflow if identity_size is too big. 63 // FIXME: 64 // We need to consider the possibility that 65 // identity_base > identity_size and physmem_end. 66 // This might lead to overflow if identity_size is too big. 66 67 for (uintptr_t cur = PHYSMEM_START_ADDR; 67 68 cur < min(KA2PA(config.identity_base) + 68 config.identity_size, config.physmem_end);69 config.identity_size, config.physmem_end); 69 70 cur += FRAME_SIZE) 70 71 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); 71 72 72 73 73 page_table_unlock(AS_KERNEL, true); 74 74 as_switch(NULL, AS_KERNEL); 75 76 // printf("as_context_table=0x%08x\n", as_context_table); 77 75 78 76 /* Switch MMU to new context table */ 79 77 asi_u32_write(ASI_MMUREGS, MMU_CONTEXT_TABLE, KA2PA(as_context_table) >> 4); 80 81 //boot_page_table_free();82 78 } 83 79 … … 86 82 uint32_t fault_status = asi_u32_read(ASI_MMUREGS, MMU_FAULT_STATUS); 87 83 uintptr_t fault_address = asi_u32_read(ASI_MMUREGS, MMU_FAULT_ADDRESS); 88 mmu_fault_status_t *fault = (mmu_fault_status_t *)&fault_status; 89 mmu_fault_type_t type = (mmu_fault_type_t)fault->at; 90 91 // printf("page fault on address 0x%08x, status 0x%08x, type %d\n", fault_address, fault_status, type); 92 93 if (type == FAULT_TYPE_LOAD_USER_DATA || 94 type == FAULT_TYPE_LOAD_SUPERVISOR_DATA) 84 mmu_fault_status_t *fault = (mmu_fault_status_t *) &fault_status; 85 mmu_fault_type_t type = (mmu_fault_type_t) fault->at; 86 87 if ((type == FAULT_TYPE_LOAD_USER_DATA) || 88 (type == FAULT_TYPE_LOAD_SUPERVISOR_DATA)) 95 89 as_page_fault(fault_address, PF_ACCESS_READ, istate); 96 90 97 if ( type == FAULT_TYPE_EXECUTE_USER ||98 type == FAULT_TYPE_EXECUTE_SUPERVISOR)91 if ((type == FAULT_TYPE_EXECUTE_USER) || 92 (type == FAULT_TYPE_EXECUTE_SUPERVISOR)) 99 93 as_page_fault(fault_address, PF_ACCESS_EXEC, istate); 100 94 101 if ( type == FAULT_TYPE_STORE_USER_DATA||102 type == FAULT_TYPE_STORE_USER_INSTRUCTION||103 type == FAULT_TYPE_STORE_SUPERVISOR_INSTRUCTION||104 type == FAULT_TYPE_STORE_SUPERVISOR_DATA)95 if ((type == FAULT_TYPE_STORE_USER_DATA) || 96 (type == FAULT_TYPE_STORE_USER_INSTRUCTION) || 97 (type == FAULT_TYPE_STORE_SUPERVISOR_INSTRUCTION) || 98 (type == FAULT_TYPE_STORE_SUPERVISOR_DATA)) 105 99 as_page_fault(fault_address, PF_ACCESS_WRITE, istate); 106 100 } -
kernel/arch/sparc32/src/mm/tlb.c
rf6f22cdb r32e8cd1 27 27 */ 28 28 29 /** @addtogroup abs32lemm29 /** @addtogroup sparc32mm 30 30 * @{ 31 31 */ … … 45 45 } 46 46 47 void tlb_invalidate_pages(asid_t asid __attribute__((unused)), uintptr_t page, size_t cnt) 47 void tlb_invalidate_pages(asid_t asid __attribute__((unused)), uintptr_t page, 48 size_t cnt) 48 49 { 49 50 tlb_invalidate_all();
Note:
See TracChangeset
for help on using the changeset viewer.
