1 /* 2 * Copyright 2007, François Revol, revol@free.fr. 3 * Distributed under the terms of the MIT License. 4 * 5 * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. 6 * Distributed under the terms of the MIT License. 7 * 8 * Copyright 2001, Travis Geiselbrecht. All rights reserved. 9 * Distributed under the terms of the NewOS License. 10 */ 11 12 13 #include <KernelExport.h> 14 15 #include <arch/cpu.h> 16 #include <boot/kernel_args.h> 17 18 19 status_t 20 arch_cpu_preboot_init_percpu(kernel_args *args, int curr_cpu) 21 { 22 return B_OK; 23 } 24 25 26 status_t 27 arch_cpu_init_percpu(kernel_args *args, int curr_cpu) 28 { 29 if (curr_cpu != 0) 30 panic("No SMP support on ARM yet!\n"); 31 32 return 0; 33 } 34 35 36 status_t 37 arch_cpu_init(kernel_args *args) 38 { 39 return B_OK; 40 } 41 42 43 status_t 44 arch_cpu_init_post_vm(kernel_args *args) 45 { 46 return B_OK; 47 } 48 49 50 status_t 51 arch_cpu_init_post_modules(kernel_args *args) 52 { 53 return B_OK; 54 } 55 56 57 status_t 58 arch_cpu_shutdown(bool reboot) 59 { 60 while(1) 61 arch_cpu_idle(); 62 63 // never reached 64 return B_ERROR; 65 } 66 67 68 void 69 arch_cpu_sync_icache(void *address, size_t len) 70 { 71 uint32 Rd = 0; 72 asm volatile ("mcr p15, 0, %[c7format], c7, c5, 0" 73 : : [c7format] "r" (Rd) ); 74 } 75 76 77 void 78 arch_cpu_invalidate_TLB_page(addr_t page) 79 { 80 // ensure visibility of the update to translation table walks 81 dsb(); 82 83 // TLBIMVAIS(page) 84 asm volatile ("mcr p15, 0, %0, c8, c3, 1" 85 : : "r" (page)); 86 87 // ensure completion of TLB invalidation 88 dsb(); 89 isb(); 90 } 91 92 void 93 arch_cpu_invalidate_TLB_range(addr_t start, addr_t end) 94 { 95 // ensure visibility of the update to translation table walks 96 dsb(); 97 98 int32 num_pages = end / B_PAGE_SIZE - start / B_PAGE_SIZE; 99 while (num_pages-- >= 0) { 100 asm volatile ("mcr p15, 0, %[c8format], c8, c6, 1" 101 : : [c8format] "r" (start) ); 102 start += B_PAGE_SIZE; 103 } 104 105 // ensure completion of TLB invalidation 106 dsb(); 107 isb(); 108 } 109 110 111 void 112 arch_cpu_invalidate_TLB_list(addr_t pages[], int num_pages) 113 { 114 // ensure visibility of the update to translation table walks 115 dsb(); 116 117 for (int i = 0; i < num_pages; i++) { 118 asm volatile ("mcr p15, 0, %[c8format], c8, c6, 1": 119 : [c8format] "r" (pages[i]) ); 120 } 121 122 // ensure completion of TLB invalidation 123 dsb(); 124 isb(); 125 } 126 127 128 void 129 arch_cpu_global_TLB_invalidate(void) 130 { 131 // ensure visibility of the update to translation table walks 132 dsb(); 133 134 uint32 Rd = 0; 135 asm volatile ("mcr p15, 0, %[c8format], c8, c7, 0" 136 : : [c8format] "r" (Rd) ); 137 138 // ensure completion of TLB invalidation 139 dsb(); 140 isb(); 141 } 142 143 144 void 145 arch_cpu_user_TLB_invalidate(void) 146 {/* 147 cpu_ops.flush_insn_pipeline(); 148 cpu_ops.flush_atc_user(); 149 cpu_ops.flush_insn_pipeline(); 150 */ 151 #warning WRITEME 152 } 153