Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm.c
- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm.c
r321 r429 137 137 * ARMv7におけるデータキャッシュの無効化 138 138 * 139 * レベル0のキャッシュのみを無効化する. 139 * バリアを2か所に入れているのは,ARMアーキテクチャリファレンスマニュ 140 * アルのサンプルコードを踏襲した. 140 141 */ 141 142 #if __TARGET_ARCH_ARM == 7 … … 144 145 armv7_invalidate_dcache(void) 145 146 { 146 uint32_t reg; 147 uint32_t clidr, ccsidr; 148 uint32_t level, no_levels; 147 149 uint32_t way, no_ways, shift_way; 148 150 uint32_t set, no_sets, shift_set; 149 150 CP15_WRITE_CSSELR(0U); 151 CP15_READ_CCSIDR(reg); 152 no_sets = ((reg >> 13) & 0x7fffU) + 1; 153 shift_set = (reg & 0x07U) + 4; 154 no_ways = ((reg >> 3) & 0x3ffU) + 1; 155 shift_way = count_leading_zero(no_ways); 156 157 for (way = 0; way < no_ways; way++){ 158 for (set = 0; set < no_sets; set++) { 159 reg = (way << shift_way) | (set << shift_set); 160 CP15_WRITE_DCISW(reg); 151 uint32_t waylevel, setwaylevel; 152 153 CP15_READ_CLIDR(clidr); 154 no_levels = (clidr >> 24) & 0x07U; 155 for (level = 0; level < no_levels; level++) { 156 if (((clidr >> (level * 3)) & 0x07U) >= 0x02U) { 157 CP15_WRITE_CSSELR(level << 1); 158 inst_sync_barrier(); 159 CP15_READ_CCSIDR(ccsidr); 160 no_sets = ((ccsidr >> 13) & 0x7fffU) + 1; 161 shift_set = (ccsidr & 0x07U) + 4; 162 no_ways = ((ccsidr >> 3) & 0x3ffU) + 1; 163 shift_way = count_leading_zero(no_ways - 1); 164 165 for (way = 0; way < no_ways; way++) { 166 waylevel = (way << shift_way) | (level << 1); 167 for (set = 0; set < no_sets; set++) { 168 setwaylevel = waylevel | (set << shift_set); 169 CP15_WRITE_DCISW(setwaylevel); 170 } 171 } 161 172 } 162 173 } 174 data_sync_barrier(); 163 175 } 164 176 … … 168 180 * ARMv7におけるデータキャッシュのクリーンと無効化 169 181 * 170 * レベル0のキャッシュのみをクリーンと無効化する. 182 * バリアを2か所に入れているのは,ARMアーキテクチャリファレンスマニュ 183 * アルのサンプルコードを踏襲した. 171 184 */ 172 185 #if __TARGET_ARCH_ARM == 7 … … 175 188 armv7_clean_and_invalidate_dcache(void) 176 189 { 177 uint32_t reg; 190 uint32_t clidr, ccsidr; 191 uint32_t level, no_levels; 178 192 uint32_t way, no_ways, shift_way; 179 193 uint32_t set, no_sets, shift_set; 180 181 CP15_WRITE_CSSELR(0U); 182 CP15_READ_CCSIDR(reg); 183 no_sets = ((reg >> 13) & 0x7fffU) + 1; 184 shift_set = (reg & 0x07U) + 4; 185 no_ways = ((reg >> 3) & 0x3ffU) + 1; 186 shift_way = count_leading_zero(no_ways); 187 188 for (way = 0; way < no_ways; way++){ 189 for (set = 0; set < no_sets; set++) { 190 reg = (way << shift_way) | (set << shift_set); 191 CP15_WRITE_DCCISW(reg); 194 uint32_t waylevel, setwaylevel; 195 196 CP15_READ_CLIDR(clidr); 197 no_levels = (clidr >> 24) & 0x07U; 198 for (level = 0; level < no_levels; level++) { 199 if (((clidr >> (level * 3)) & 0x07U) >= 0x02U) { 200 CP15_WRITE_CSSELR(level << 1); 201 inst_sync_barrier(); 202 CP15_READ_CCSIDR(ccsidr); 203 no_sets = ((ccsidr >> 13) & 0x7fffU) + 1; 204 shift_set = (ccsidr & 0x07U) + 4; 205 no_ways = ((ccsidr >> 3) & 0x3ffU) + 1; 206 shift_way = count_leading_zero(no_ways - 1); 207 208 for (way = 0; way < no_ways; way++) { 209 waylevel = (way << shift_way) | (level << 1); 210 for (set = 0; set < no_sets; set++) { 211 setwaylevel = waylevel | (set << shift_set); 212 CP15_WRITE_DCCISW(setwaylevel); 213 } 214 } 192 215 } 193 216 } 217 data_sync_barrier(); 194 218 } 195 219
Note:
See TracChangeset
for help on using the changeset viewer.