24#ifndef LIBCPU_SHARED_ARM_CP15_H
25#define LIBCPU_SHARED_ARM_CP15_H
37#ifndef ARM_CP15_TEXT_SECTION
38 #define ARM_CP15_TEXT_SECTION
41#define ARM_CP15_CACHE_PREPARE_MVA(mva) \
42 ((const void *) (((uint32_t) (mva)) & ~0x1fU))
44#define ARM_CP15_TLB_PREPARE_MVA(mva) \
45 ((const void *) (((uint32_t) (mva)) & ~0x3fU))
67#define ARM_MMU_SECT_BASE_SHIFT 20
68#define ARM_MMU_SECT_BASE_MASK (0xfffU << ARM_MMU_SECT_BASE_SHIFT)
69#define ARM_MMU_SECT_NS (1U << 19)
70#define ARM_MMU_SECT_NG (1U << 17)
71#define ARM_MMU_SECT_S (1U << 16)
72#define ARM_MMU_SECT_AP_2 (1U << 15)
73#define ARM_MMU_SECT_TEX_2 (1U << 14)
74#define ARM_MMU_SECT_TEX_1 (1U << 13)
75#define ARM_MMU_SECT_TEX_0 (1U << 12)
76#define ARM_MMU_SECT_TEX_SHIFT 12
77#define ARM_MMU_SECT_TEX_MASK (0x3U << ARM_MMU_SECT_TEX_SHIFT)
78#define ARM_MMU_SECT_AP_1 (1U << 11)
79#define ARM_MMU_SECT_AP_0 (1U << 10)
80#define ARM_MMU_SECT_AP_SHIFT 10
81#define ARM_MMU_SECT_AP_MASK (0x23U << ARM_MMU_SECT_AP_SHIFT)
82#define ARM_MMU_SECT_DOMAIN_SHIFT 5
83#define ARM_MMU_SECT_DOMAIN_MASK (0xfU << ARM_MMU_SECT_DOMAIN_SHIFT)
84#define ARM_MMU_SECT_XN (1U << 4)
85#define ARM_MMU_SECT_C (1U << 3)
86#define ARM_MMU_SECT_B (1U << 2)
87#define ARM_MMU_SECT_PXN (1U << 0)
88#define ARM_MMU_SECT_DEFAULT 0x2U
89#define ARM_MMU_SECT_GET_INDEX(mva) \
90 (((uint32_t) (mva)) >> ARM_MMU_SECT_BASE_SHIFT)
91#define ARM_MMU_SECT_MVA_ALIGN_UP(mva) \
92 ((1U << ARM_MMU_SECT_BASE_SHIFT) \
93 + ((((uint32_t) (mva) - 1U)) & ~((1U << ARM_MMU_SECT_BASE_SHIFT) - 1U)))
95#define ARM_MMU_PAGE_TABLE_BASE_SHIFT 10
96#define ARM_MMU_PAGE_TABLE_BASE_MASK (0x3fffffU << ARM_MMU_PAGE_TABLE_BASE_SHIFT)
97#define ARM_MMU_PAGE_TABLE_DOMAIN_SHIFT 5
98#define ARM_MMU_PAGE_TABLE_DOMAIN_MASK (0xfU << ARM_MMU_PAGE_TABLE_DOMAIN_SHIFT)
99#define ARM_MMU_PAGE_TABLE_NS (1U << 3)
100#define ARM_MMU_PAGE_TABLE_PXN (1U << 2)
101#define ARM_MMU_PAGE_TABLE_DEFAULT 0x1U
103#define ARM_MMU_SMALL_PAGE_BASE_SHIFT 12
104#define ARM_MMU_SMALL_PAGE_BASE_MASK (0xfffffU << ARM_MMU_SMALL_PAGE_BASE_SHIFT)
105#define ARM_MMU_SMALL_PAGE_NG (1U << 11)
106#define ARM_MMU_SMALL_PAGE_S (1U << 10)
107#define ARM_MMU_SMALL_PAGE_AP_2 (1U << 9)
108#define ARM_MMU_SMALL_PAGE_TEX_2 (1U << 8)
109#define ARM_MMU_SMALL_PAGE_TEX_1 (1U << 7)
110#define ARM_MMU_SMALL_PAGE_TEX_0 (1U << 6)
111#define ARM_MMU_SMALL_PAGE_TEX_SHIFT 6
112#define ARM_MMU_SMALL_PAGE_TEX_MASK (0x3U << ARM_MMU_SMALL_PAGE_TEX_SHIFT)
113#define ARM_MMU_SMALL_PAGE_AP_1 (1U << 5)
114#define ARM_MMU_SMALL_PAGE_AP_0 (1U << 4)
115#define ARM_MMU_SMALL_PAGE_AP_SHIFT 4
116#define ARM_MMU_SMALL_PAGE_AP_MASK (0x23U << ARM_MMU_SMALL_PAGE_AP_SHIFT)
117#define ARM_MMU_SMALL_PAGE_C (1U << 3)
118#define ARM_MMU_SMALL_PAGE_B (1U << 2)
119#define ARM_MMU_SMALL_PAGE_XN (1U << 0)
120#define ARM_MMU_SMALL_PAGE_DEFAULT 0x2U
121#define ARM_MMU_SMALL_PAGE_GET_INDEX(mva) \
122 (((uint32_t) (mva)) >> ARM_MMU_SMALL_PAGE_BASE_SHIFT)
123#define ARM_MMU_SMALL_PAGE_MVA_ALIGN_UP(mva) \
124 ((1U << ARM_MMU_SMALL_PAGE_BASE_SHIFT) \
125 + ((((uint32_t) (mva) - 1U)) & ~((1U << ARM_MMU_SMALL_PAGE_BASE_SHIFT) - 1U)))
127#define ARM_MMU_SECT_FLAGS_TO_PAGE_TABLE(flags) \
128 (ARM_MMU_PAGE_TABLE_DEFAULT \
129 | ((flags) & ARM_MMU_SECT_DOMAIN_MASK) \
130 | (((flags) & ARM_MMU_SECT_NS) >> 16) \
131 | (((flags) & ARM_MMU_SECT_PXN) << 2))
133#define ARM_MMU_PAGE_TABLE_FLAGS_TO_SECT(flags) \
134 (ARM_MMU_SECT_DEFAULT \
135 | ((flags) & ARM_MMU_PAGE_TABLE_DOMAIN_MASK) \
136 | (((flags) & ARM_MMU_PAGE_TABLE_NS) << 16) \
137 | (((flags) & ARM_MMU_PAGE_TABLE_PXN) >> 2))
139#define ARM_MMU_SECT_FLAGS_TO_SMALL_PAGE(flags) \
140 ((((flags) & 0x3fc00) >> 6) \
141 | ((flags) & (ARM_MMU_SECT_C | ARM_MMU_SECT_B | 0x2)) \
142 | (((flags) & ARM_MMU_SECT_XN) >> 4))
144#define ARM_MMU_SMALL_PAGE_FLAGS_TO_SECT(flags) \
145 ((((flags) & 0xff0) << 6) \
146 | ((flags) & (ARM_MMU_SMALL_PAGE_C | ARM_MMU_SMALL_PAGE_B | 0x2)) \
147 | (((flags) & ARM_MMU_SMALL_PAGE_XN) << 4))
149#define ARM_MMU_TRANSLATION_TABLE_ENTRY_SIZE 4U
150#define ARM_MMU_TRANSLATION_TABLE_ENTRY_COUNT 4096U
152#define ARM_MMU_SMALL_PAGE_TABLE_ENTRY_SIZE 4U
153#define ARM_MMU_SMALL_PAGE_TABLE_ENTRY_COUNT 256U
155#define ARM_MMU_DEFAULT_CLIENT_DOMAIN 15U
157#define ARMV7_MMU_READ_ONLY \
158 ((ARM_MMU_DEFAULT_CLIENT_DOMAIN << ARM_MMU_SECT_DOMAIN_SHIFT) \
159 | ARM_MMU_SECT_AP_0 \
160 | ARM_MMU_SECT_AP_2 \
161 | ARM_MMU_SECT_DEFAULT)
163#define ARMV7_MMU_READ_ONLY_CACHED \
164 (ARMV7_MMU_READ_ONLY | ARM_MMU_SECT_TEX_0 | ARM_MMU_SECT_C | ARM_MMU_SECT_B)
166#define ARMV7_MMU_READ_WRITE \
167 ((ARM_MMU_DEFAULT_CLIENT_DOMAIN << ARM_MMU_SECT_DOMAIN_SHIFT) \
168 | ARM_MMU_SECT_AP_0 \
169 | ARM_MMU_SECT_DEFAULT)
172 #define ARMV7_MMU_READ_WRITE_CACHED \
173 (ARMV7_MMU_READ_WRITE \
174 | ARM_MMU_SECT_TEX_0 | ARM_MMU_SECT_C | ARM_MMU_SECT_B | ARM_MMU_SECT_S)
176 #define ARMV7_MMU_READ_WRITE_CACHED \
177 (ARMV7_MMU_READ_WRITE \
178 | ARM_MMU_SECT_TEX_0 | ARM_MMU_SECT_C | ARM_MMU_SECT_B)
181#define ARMV7_MMU_DATA_READ_ONLY \
182 (ARMV7_MMU_READ_ONLY | ARM_MMU_SECT_TEX_0)
184#define ARMV7_MMU_DATA_READ_ONLY_CACHED \
185 ARMV7_MMU_READ_ONLY_CACHED
187#define ARMV7_MMU_DATA_READ_WRITE \
188 (ARMV7_MMU_READ_WRITE | ARM_MMU_SECT_TEX_0)
190#define ARMV7_MMU_DATA_READ_WRITE_CACHED \
191 ARMV7_MMU_READ_WRITE_CACHED
193#define ARMV7_MMU_CODE \
194 (ARMV7_MMU_READ_ONLY | ARM_MMU_SECT_TEX_0)
196#define ARMV7_MMU_CODE_CACHED \
197 ARMV7_MMU_READ_ONLY_CACHED
199#define ARMV7_MMU_DEVICE \
200 (ARMV7_MMU_READ_WRITE | ARM_MMU_SECT_B)
210#define ARM_CP15_CTRL_TE (1U << 30)
211#define ARM_CP15_CTRL_AFE (1U << 29)
212#define ARM_CP15_CTRL_TRE (1U << 28)
213#define ARM_CP15_CTRL_NMFI (1U << 27)
214#define ARM_CP15_CTRL_EE (1U << 25)
215#define ARM_CP15_CTRL_VE (1U << 24)
216#define ARM_CP15_CTRL_XP (1U << 23)
217#define ARM_CP15_CTRL_U (1U << 22)
218#define ARM_CP15_CTRL_FI (1U << 21)
219#define ARM_CP15_CTRL_UWXN (1U << 20)
220#define ARM_CP15_CTRL_WXN (1U << 19)
221#define ARM_CP15_CTRL_HA (1U << 17)
222#define ARM_CP15_CTRL_L4 (1U << 15)
223#define ARM_CP15_CTRL_RR (1U << 14)
224#define ARM_CP15_CTRL_V (1U << 13)
225#define ARM_CP15_CTRL_I (1U << 12)
226#define ARM_CP15_CTRL_Z (1U << 11)
227#define ARM_CP15_CTRL_SW (1U << 10)
228#define ARM_CP15_CTRL_R (1U << 9)
229#define ARM_CP15_CTRL_S (1U << 8)
230#define ARM_CP15_CTRL_B (1U << 7)
231#define ARM_CP15_CTRL_CP15BEN (1U << 5)
232#define ARM_CP15_CTRL_C (1U << 2)
233#define ARM_CP15_CTRL_A (1U << 1)
234#define ARM_CP15_CTRL_M (1U << 0)
244#define ARM_CP15_DAC_NO_ACCESS 0x0U
245#define ARM_CP15_DAC_CLIENT 0x1U
246#define ARM_CP15_DAC_MANAGER 0x3U
247#define ARM_CP15_DAC_DOMAIN(index, val) ((val) << (2 * index))
257#define ARM_CP15_FAULT_STATUS_MASK 0x040F
259#define ARM_CP15_FSR_ALIGNMENT_FAULT 0x00000001
260#define ARM_CP15_FSR_BACKGROUND_FAULT 0x0000
261#define ARM_CP15_FSR_ACCESS_PERMISSION_FAULT 0x000D
262#define ARM_CP15_FSR_PRECISE_EXTERNAL_ABORT_FAULT 0x0008
263#define ARM_CP15_FSR_IMPRECISE_EXTERNAL_ABORT_FAULT 0x0406
264#define ARM_CP15_FSR_PRECISE_PARITY_ERROR_EXCEPTION 0x0006
265#define ARM_CP15_FSR_IMPRECISE_PARITY_ERROR_EXCEPTION 0x0408
266#define ARM_CP15_FSR_DEBUG_EVENT 0x0002
279#define ARM_CP15_CACHE_TYPE_FORMAT_ARMV6 0
280#define ARM_CP15_CACHE_TYPE_FORMAT_ARMV7 4
290#define ARM_CP15_CACHE_CSS_ID_DATA 0
291#define ARM_CP15_CACHE_CSS_ID_INSTRUCTION 1
292#define ARM_CP15_CACHE_CSS_LEVEL(level) ((level) << 1)
296ARM_CP15_TEXT_SECTION
static inline uint32_t
297arm_cp15_get_id_code(
void)
299 ARM_SWITCH_REGISTERS;
304 "mrc p15, 0, %[val], c0, c0, 0\n"
306 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
312ARM_CP15_TEXT_SECTION
static inline uint32_t
313arm_cp15_get_tcm_status(
void)
315 ARM_SWITCH_REGISTERS;
320 "mrc p15, 0, %[val], c0, c0, 2\n"
322 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
328ARM_CP15_TEXT_SECTION
static inline uint32_t
329arm_cp15_get_control(
void)
331 ARM_SWITCH_REGISTERS;
336 "mrc p15, 0, %[val], c1, c0, 0\n"
338 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
344ARM_CP15_TEXT_SECTION
static inline void
345arm_cp15_set_control(uint32_t val)
347 ARM_SWITCH_REGISTERS;
351 "mcr p15, 0, %[val], c1, c0, 0\n"
377ARM_CP15_TEXT_SECTION
static inline uint32_t
378arm_cp15_mmu_disable(uint32_t cls)
380 ARM_SWITCH_REGISTERS;
387 "mrc p15, 0, %[ctrl], c1, c0, 0\n"
388 "bic %[tmp_0], %[ctrl], #1\n"
389 "mcr p15, 0, %[tmp_0], c1, c0, 0\n"
393 "rsb %[tmp_0], %[cls], #0\n"
394 "and %[tmp_0], %[tmp_0], %[tmp_1]\n"
395 "sub %[tmp_0], %[tmp_0], %[cls], asl #3\n"
396 "add %[tmp_1], %[tmp_0], %[cls], asl #4\n"
398 "mcr p15, 0, %[tmp_0], c7, c14, 1\n"
399 "add %[tmp_0], %[tmp_0], %[cls]\n"
400 "cmp %[tmp_1], %[tmp_0]\n"
403 : [ctrl]
"=&r" (ctrl),
404 [tmp_0]
"=&r" (tmp_0),
405 [tmp_1]
"=&r" (tmp_1)
406 ARM_SWITCH_ADDITIONAL_OUTPUT
414ARM_CP15_TEXT_SECTION
static inline uint32_t
415*arm_cp15_get_translation_table_base(
void)
417 ARM_SWITCH_REGISTERS;
422 "mrc p15, 0, %[base], c2, c0, 0\n"
424 : [base]
"=&r" (base) ARM_SWITCH_ADDITIONAL_OUTPUT
430ARM_CP15_TEXT_SECTION
static inline void
431arm_cp15_set_translation_table_base(uint32_t *base)
433 ARM_SWITCH_REGISTERS;
437 "mcr p15, 0, %[base], c2, c0, 0\n"
445ARM_CP15_TEXT_SECTION
static inline uint32_t
446arm_cp15_get_translation_table_base_control_register(
void)
448 ARM_SWITCH_REGISTERS;
453 "mrc p15, 0, %[ttb_cr], c2, c0, 2\n"
455 : [ttb_cr]
"=&r" (ttb_cr) ARM_SWITCH_ADDITIONAL_OUTPUT
461ARM_CP15_TEXT_SECTION
static inline void
462arm_cp15_set_translation_table_base_control_register(uint32_t ttb_cr)
464 ARM_SWITCH_REGISTERS;
468 "mcr p15, 0, %[ttb_cr], c2, c0, 2\n"
471 : [ttb_cr]
"r" (ttb_cr)
475ARM_CP15_TEXT_SECTION
static inline uint32_t
476arm_cp15_get_domain_access_control(
void)
478 ARM_SWITCH_REGISTERS;
483 "mrc p15, 0, %[val], c3, c0, 0\n"
485 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
491ARM_CP15_TEXT_SECTION
static inline void
492arm_cp15_set_domain_access_control(uint32_t val)
494 ARM_SWITCH_REGISTERS;
498 "mcr p15, 0, %[val], c3, c0, 0\n"
505ARM_CP15_TEXT_SECTION
static inline uint32_t
506arm_cp15_get_data_fault_status(
void)
508 ARM_SWITCH_REGISTERS;
513 "mrc p15, 0, %[val], c5, c0, 0\n"
515 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
521ARM_CP15_TEXT_SECTION
static inline void
522arm_cp15_set_data_fault_status(uint32_t val)
524 ARM_SWITCH_REGISTERS;
528 "mcr p15, 0, %[val], c5, c0, 0\n"
535ARM_CP15_TEXT_SECTION
static inline uint32_t
536arm_cp15_get_instruction_fault_status(
void)
538 ARM_SWITCH_REGISTERS;
543 "mrc p15, 0, %[val], c5, c0, 1\n"
545 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
551ARM_CP15_TEXT_SECTION
static inline void
552arm_cp15_set_instruction_fault_status(uint32_t val)
554 ARM_SWITCH_REGISTERS;
558 "mcr p15, 0, %[val], c5, c0, 1\n"
565ARM_CP15_TEXT_SECTION
static inline void
566*arm_cp15_get_fault_address(
void)
568 ARM_SWITCH_REGISTERS;
573 "mrc p15, 0, %[mva], c6, c0, 0\n"
575 : [mva]
"=&r" (mva) ARM_SWITCH_ADDITIONAL_OUTPUT
581ARM_CP15_TEXT_SECTION
static inline void
582arm_cp15_set_fault_address(
const void *mva)
584 ARM_SWITCH_REGISTERS;
588 "mcr p15, 0, %[mva], c6, c0, 0\n"
595ARM_CP15_TEXT_SECTION
static inline void
596arm_cp15_tlb_invalidate(
void)
598 ARM_SWITCH_REGISTERS;
603 "mcr p15, 0, %[sbz], c8, c7, 0\n"
613 _ARM_Data_synchronization_barrier();
614 _ARM_Instruction_synchronization_barrier();
617ARM_CP15_TEXT_SECTION
static inline void
618arm_cp15_tlb_invalidate_entry(
const void *mva)
620 ARM_SWITCH_REGISTERS;
622 mva = ARM_CP15_TLB_PREPARE_MVA(mva);
626 "mcr p15, 0, %[mva], c8, c7, 1\n"
633ARM_CP15_TEXT_SECTION
static inline void
634arm_cp15_tlb_invalidate_entry_all_asids(
const void *mva)
636 ARM_SWITCH_REGISTERS;
638 mva = ARM_CP15_TLB_PREPARE_MVA(mva);
642 "mcr p15, 0, %[mva], c8, c7, 3\n"
649ARM_CP15_TEXT_SECTION
static inline void
650arm_cp15_tlb_instruction_invalidate(
void)
652 ARM_SWITCH_REGISTERS;
657 "mcr p15, 0, %[sbz], c8, c5, 0\n"
664ARM_CP15_TEXT_SECTION
static inline void
665arm_cp15_tlb_instruction_invalidate_entry(
const void *mva)
667 ARM_SWITCH_REGISTERS;
669 mva = ARM_CP15_TLB_PREPARE_MVA(mva);
673 "mcr p15, 0, %[mva], c8, c5, 1\n"
680ARM_CP15_TEXT_SECTION
static inline void
681arm_cp15_tlb_data_invalidate(
void)
683 ARM_SWITCH_REGISTERS;
688 "mcr p15, 0, %[sbz], c8, c6, 0\n"
695ARM_CP15_TEXT_SECTION
static inline void
696arm_cp15_tlb_data_invalidate_entry(
const void *mva)
698 ARM_SWITCH_REGISTERS;
700 mva = ARM_CP15_TLB_PREPARE_MVA(mva);
704 "mcr p15, 0, %[mva], c8, c6, 1\n"
711ARM_CP15_TEXT_SECTION
static inline void
712arm_cp15_tlb_lockdown_entry(
const void *mva)
714 uint32_t arm_switch_reg;
718 "add %[arm_switch_reg], pc, #16\n"
719 "mcr p15, 0, %[arm_switch_reg], c7, c13, 1\n"
720 "mcr p15, 0, %[mva], c8, c7, 1\n"
721 "mrc p15, 0, %[arm_switch_reg], c10, c0, 0\n"
722 "orr %[arm_switch_reg], #0x1\n"
723 "mcr p15, 0, %[arm_switch_reg], c10, c0, 0\n"
724 "ldr %[mva], [%[mva]]\n"
725 "mrc p15, 0, %[arm_switch_reg], c10, c0, 0\n"
726 "bic %[arm_switch_reg], #0x1\n"
727 "mcr p15, 0, %[arm_switch_reg], c10, c0, 0\n"
729 : [mva]
"=r" (mva), [arm_switch_reg]
"=&r" (arm_switch_reg)
743ARM_CP15_TEXT_SECTION
static inline uint32_t
744arm_cp15_get_cache_type(
void)
746 ARM_SWITCH_REGISTERS;
751 "mrc p15, 0, %[val], c0, c0, 1\n"
753 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
760ARM_CP15_TEXT_SECTION
static inline int
761arm_cp15_cache_type_get_format(uint32_t
ct)
763 return (
ct >> 29) & 0x7U;
767ARM_CP15_TEXT_SECTION
static inline uint32_t
768arm_cp15_get_min_cache_line_size(
void)
771 uint32_t
ct = arm_cp15_get_cache_type();
772 uint32_t
format = arm_cp15_cache_type_get_format(
ct);
774 if (
format == ARM_CP15_CACHE_TYPE_FORMAT_ARMV7) {
776 mcls = (1U << (
ct & 0xf)) * 4;
777 }
else if (
format == ARM_CP15_CACHE_TYPE_FORMAT_ARMV6) {
779 uint32_t mask = (1U << 12) - 1;
780 uint32_t dcls = (
ct >> 12) & mask;
781 uint32_t icls =
ct & mask;
783 mcls = dcls <= icls ? dcls : icls;
790ARM_CP15_TEXT_SECTION
static inline uint32_t
791arm_cp15_get_data_cache_line_size(
void)
794 uint32_t
ct = arm_cp15_get_cache_type();
795 uint32_t
format = arm_cp15_cache_type_get_format(
ct);
797 if (
format == ARM_CP15_CACHE_TYPE_FORMAT_ARMV7) {
799 mcls = (1U << ((
ct & 0xf0000) >> 16)) * 4;
800 }
else if (
format == ARM_CP15_CACHE_TYPE_FORMAT_ARMV6) {
802 uint32_t mask = (1U << 12) - 1;
803 mcls = (
ct >> 12) & mask;
810ARM_CP15_TEXT_SECTION
static inline uint32_t
811arm_cp15_get_instruction_cache_line_size(
void)
814 uint32_t
ct = arm_cp15_get_cache_type();
815 uint32_t
format = arm_cp15_cache_type_get_format(
ct);
817 if (
format == ARM_CP15_CACHE_TYPE_FORMAT_ARMV7) {
819 mcls = (1U << (
ct & 0x0000f)) * 4;
820 }
else if (
format == ARM_CP15_CACHE_TYPE_FORMAT_ARMV6) {
822 uint32_t mask = (1U << 12) - 1;
831ARM_CP15_TEXT_SECTION
static inline uint32_t
832arm_cp15_get_cache_size_id(
void)
834 ARM_SWITCH_REGISTERS;
839 "mrc p15, 1, %[val], c0, c0, 0\n"
841 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
847ARM_CP15_TEXT_SECTION
static inline uint32_t
848arm_ccsidr_get_line_power(uint32_t ccsidr)
850 return (ccsidr & 0x7) + 4;
853ARM_CP15_TEXT_SECTION
static inline uint32_t
854arm_ccsidr_get_associativity(uint32_t ccsidr)
856 return ((ccsidr >> 3) & 0x3ff) + 1;
859ARM_CP15_TEXT_SECTION
static inline uint32_t
860arm_ccsidr_get_num_sets(uint32_t ccsidr)
862 return ((ccsidr >> 13) & 0x7fff) + 1;
867ARM_CP15_TEXT_SECTION
static inline uint32_t
868arm_cp15_get_cache_level_id(
void)
870 ARM_SWITCH_REGISTERS;
875 "mrc p15, 1, %[val], c0, c0, 1\n"
877 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
883ARM_CP15_TEXT_SECTION
static inline uint32_t
884arm_clidr_get_level_of_coherency(uint32_t clidr)
886 return (clidr >> 24) & 0x7;
889ARM_CP15_TEXT_SECTION
static inline uint32_t
890arm_clidr_get_cache_type(uint32_t clidr, uint32_t level)
892 return (clidr >> (3 * level)) & 0x7;
897ARM_CP15_TEXT_SECTION
static inline uint32_t
898arm_cp15_get_cache_size_selection(
void)
900 ARM_SWITCH_REGISTERS;
905 "mrc p15, 2, %[val], c0, c0, 0\n"
907 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
913ARM_CP15_TEXT_SECTION
static inline void
914arm_cp15_set_cache_size_selection(uint32_t val)
916 ARM_SWITCH_REGISTERS;
920 "mcr p15, 2, %[val], c0, c0, 0\n"
928ARM_CP15_TEXT_SECTION
static inline uint32_t
929arm_cp15_get_cache_size_id_for_level(uint32_t level_and_inst_dat)
935 arm_cp15_set_cache_size_selection(level_and_inst_dat);
936 _ARM_Instruction_synchronization_barrier();
937 ccsidr = arm_cp15_get_cache_size_id();
943ARM_CP15_TEXT_SECTION
static inline void
944arm_cp15_cache_invalidate(
void)
946 ARM_SWITCH_REGISTERS;
951 "mcr p15, 0, %[sbz], c7, c7, 0\n"
961ARM_CP15_TEXT_SECTION
static inline void
962arm_cp15_instruction_cache_inner_shareable_invalidate_all(
void)
964 ARM_SWITCH_REGISTERS;
969 "mcr p15, 0, %[sbz], c7, c1, 0\n"
979ARM_CP15_TEXT_SECTION
static inline void
980arm_cp15_branch_predictor_inner_shareable_invalidate_all(
void)
982 ARM_SWITCH_REGISTERS;
987 "mcr p15, 0, %[sbz], c7, c1, 6\n"
997ARM_CP15_TEXT_SECTION
static inline void
998arm_cp15_branch_predictor_invalidate_all(
void)
1000 ARM_SWITCH_REGISTERS;
1005 "mcr p15, 0, %[sbz], c7, c5, 6\n"
1014ARM_CP15_TEXT_SECTION
static inline void
1015arm_cp15_flush_prefetch_buffer(
void)
1017 ARM_SWITCH_REGISTERS;
1022 "mcr p15, 0, %[sbz], c7, c5, 4\n"
1030ARM_CP15_TEXT_SECTION
static inline void
1031arm_cp15_instruction_cache_invalidate(
void)
1033 ARM_SWITCH_REGISTERS;
1038 "mcr p15, 0, %[sbz], c7, c5, 0\n"
1046ARM_CP15_TEXT_SECTION
static inline void
1047arm_cp15_instruction_cache_invalidate_line(
const void *mva)
1049 ARM_SWITCH_REGISTERS;
1051 mva = ARM_CP15_CACHE_PREPARE_MVA(mva);
1055 "mcr p15, 0, %[mva], c7, c5, 1\n"
1063ARM_CP15_TEXT_SECTION
static inline void
1064arm_cp15_instruction_cache_invalidate_line_by_set_and_way(uint32_t set_and_way)
1066 ARM_SWITCH_REGISTERS;
1070 "mcr p15, 0, %[set_and_way], c7, c5, 2\n"
1073 : [set_and_way]
"r" (set_and_way)
1078ARM_CP15_TEXT_SECTION
static inline void
1079arm_cp15_instruction_cache_prefetch_line(
const void *mva)
1081 ARM_SWITCH_REGISTERS;
1083 mva = ARM_CP15_CACHE_PREPARE_MVA(mva);
1087 "mcr p15, 0, %[mva], c7, c13, 1\n"
1094ARM_CP15_TEXT_SECTION
static inline void
1095arm_cp15_data_cache_invalidate(
void)
1097 ARM_SWITCH_REGISTERS;
1102 "mcr p15, 0, %[sbz], c7, c6, 0\n"
1110ARM_CP15_TEXT_SECTION
static inline void
1111arm_cp15_data_cache_invalidate_line(
const void *mva)
1113 ARM_SWITCH_REGISTERS;
1115 mva = ARM_CP15_CACHE_PREPARE_MVA(mva);
1119 "mcr p15, 0, %[mva], c7, c6, 1\n"
1127ARM_CP15_TEXT_SECTION
static inline void
1128arm_cp15_data_cache_invalidate_line_by_set_and_way(uint32_t set_and_way)
1130 ARM_SWITCH_REGISTERS;
1134 "mcr p15, 0, %[set_and_way], c7, c6, 2\n"
1137 : [set_and_way]
"r" (set_and_way)
1142ARM_CP15_TEXT_SECTION
static inline void
1143arm_cp15_cache_invalidate_level(uint32_t level, uint32_t inst_data_fl)
1146 uint32_t line_power;
1147 uint32_t associativity;
1151 ccsidr = arm_cp15_get_cache_size_id_for_level((level << 1) | inst_data_fl);
1153 line_power = arm_ccsidr_get_line_power(ccsidr);
1154 associativity = arm_ccsidr_get_associativity(ccsidr);
1155 way_shift = __builtin_clz(associativity - 1);
1157 for (way = 0; way < associativity; ++way) {
1158 uint32_t num_sets = arm_ccsidr_get_num_sets(ccsidr);
1161 for (set = 0; set < num_sets; ++set) {
1162 uint32_t set_way = (way << way_shift)
1163 | (set << line_power)
1166 arm_cp15_data_cache_invalidate_line_by_set_and_way(set_way);
1171ARM_CP15_TEXT_SECTION
static inline void
1172arm_cp15_data_cache_invalidate_all_levels(
void)
1174 uint32_t clidr = arm_cp15_get_cache_level_id();
1175 uint32_t loc = arm_clidr_get_level_of_coherency(clidr);
1178 for (level = 0; level < loc; ++level) {
1179 uint32_t ctype = arm_clidr_get_cache_type(clidr, level);
1182 if (((ctype & (0x6)) == 2) || (ctype == 4)) {
1183 arm_cp15_cache_invalidate_level(level, 0);
1188ARM_CP15_TEXT_SECTION
static inline void
1189arm_cp15_data_cache_clean_line(
const void *mva)
1191 ARM_SWITCH_REGISTERS;
1193 mva = ARM_CP15_CACHE_PREPARE_MVA(mva);
1197 "mcr p15, 0, %[mva], c7, c10, 1\n"
1205ARM_CP15_TEXT_SECTION
static inline void
1206arm_cp15_data_cache_clean_line_by_set_and_way(uint32_t set_and_way)
1208 ARM_SWITCH_REGISTERS;
1212 "mcr p15, 0, %[set_and_way], c7, c10, 2\n"
1215 : [set_and_way]
"r" (set_and_way)
1220ARM_CP15_TEXT_SECTION
static inline void
1221arm_cp15_data_cache_clean_level(uint32_t level)
1224 uint32_t line_power;
1225 uint32_t associativity;
1229 ccsidr = arm_cp15_get_cache_size_id_for_level(level << 1);
1231 line_power = arm_ccsidr_get_line_power(ccsidr);
1232 associativity = arm_ccsidr_get_associativity(ccsidr);
1233 way_shift = __builtin_clz(associativity - 1);
1235 for (way = 0; way < associativity; ++way) {
1236 uint32_t num_sets = arm_ccsidr_get_num_sets(ccsidr);
1239 for (set = 0; set < num_sets; ++set) {
1240 uint32_t set_way = (way << way_shift)
1241 | (set << line_power)
1244 arm_cp15_data_cache_clean_line_by_set_and_way(set_way);
1249ARM_CP15_TEXT_SECTION
static inline void
1250arm_cp15_data_cache_clean_all_levels(
void)
1252 uint32_t clidr = arm_cp15_get_cache_level_id();
1253 uint32_t loc = arm_clidr_get_level_of_coherency(clidr);
1256 for (level = 0; level < loc; ++level) {
1257 uint32_t ctype = arm_clidr_get_cache_type(clidr, level);
1260 if (((ctype & (0x6)) == 2) || (ctype == 4)) {
1261 arm_cp15_data_cache_clean_level(level);
1266ARM_CP15_TEXT_SECTION
static inline void
1267arm_cp15_data_cache_test_and_clean(
void)
1269 ARM_SWITCH_REGISTERS;
1274 "mrc p15, 0, r15, c7, c10, 3\n"
1287ARM_CP15_TEXT_SECTION
static inline void
1288arm_cp15_data_cache_clean_and_invalidate(
void)
1290 ARM_SWITCH_REGISTERS;
1296 "mcr p15, 0, %[sbz], c7, c14, 0\n"
1304ARM_CP15_TEXT_SECTION
static inline void
1305arm_cp15_data_cache_clean_and_invalidate_line(
const void *mva)
1307 ARM_SWITCH_REGISTERS;
1309 mva = ARM_CP15_CACHE_PREPARE_MVA(mva);
1313 "mcr p15, 0, %[mva], c7, c14, 1\n"
1321ARM_CP15_TEXT_SECTION
static inline void
1322arm_cp15_data_cache_clean_and_invalidate_line_by_set_and_way(uint32_t set_and_way)
1324 ARM_SWITCH_REGISTERS;
1328 "mcr p15, 0, %[set_and_way], c7, c14, 2\n"
1331 : [set_and_way]
"r" (set_and_way)
1336ARM_CP15_TEXT_SECTION
static inline void
1337arm_cp15_data_cache_test_and_clean_and_invalidate(
void)
1339 ARM_SWITCH_REGISTERS;
1344 "mrc p15, 0, r15, c7, c14, 3\n"
1355ARM_CP15_TEXT_SECTION
static inline void
1356arm_cp15_drain_write_buffer(
void)
1358 ARM_SWITCH_REGISTERS;
1363 "mcr p15, 0, %[sbz], c7, c10, 4\n"
1371ARM_CP15_TEXT_SECTION
static inline void
1372arm_cp15_wait_for_interrupt(
void)
1374 ARM_SWITCH_REGISTERS;
1379 "mcr p15, 0, %[sbz], c7, c0, 4\n"
1387ARM_CP15_TEXT_SECTION
static inline uint32_t
1388arm_cp15_get_multiprocessor_affinity(
void)
1390 ARM_SWITCH_REGISTERS;
1395 "mrc p15, 0, %[mpidr], c0, c0, 5\n"
1397 : [mpidr]
"=&r" (mpidr) ARM_SWITCH_ADDITIONAL_OUTPUT
1400 return mpidr & 0xff;
1403ARM_CP15_TEXT_SECTION
static inline uint32_t
1404arm_cortex_a9_get_multiprocessor_cpu_id(
void)
1406 return arm_cp15_get_multiprocessor_affinity() & 0xff;
1409#define ARM_CORTEX_A9_ACTL_FW (1U << 0)
1410#define ARM_CORTEX_A9_ACTL_L2_PREFETCH_HINT_ENABLE (1U << 1)
1411#define ARM_CORTEX_A9_ACTL_L1_PREFETCH_ENABLE (1U << 2)
1412#define ARM_CORTEX_A9_ACTL_WRITE_FULL_LINE_OF_ZEROS_MODE (1U << 3)
1413#define ARM_CORTEX_A9_ACTL_SMP (1U << 6)
1414#define ARM_CORTEX_A9_ACTL_EXCL (1U << 7)
1415#define ARM_CORTEX_A9_ACTL_ALLOC_IN_ONE_WAY (1U << 8)
1416#define ARM_CORTEX_A9_ACTL_PARITY_ON (1U << 9)
1418ARM_CP15_TEXT_SECTION
static inline uint32_t
1419arm_cp15_get_auxiliary_control(
void)
1421 ARM_SWITCH_REGISTERS;
1426 "mrc p15, 0, %[val], c1, c0, 1\n"
1428 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1434ARM_CP15_TEXT_SECTION
static inline void
1435arm_cp15_set_auxiliary_control(uint32_t val)
1437 ARM_SWITCH_REGISTERS;
1441 "mcr p15, 0, %[val], c1, c0, 1\n"
1450ARM_CP15_TEXT_SECTION
static inline uint32_t
1451arm_cp15_get_processor_feature_1(
void)
1453 ARM_SWITCH_REGISTERS;
1458 "mrc p15, 0, %[val], c0, c1, 1\n"
1460 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1468ARM_CP15_TEXT_SECTION
static inline void
1469*arm_cp15_get_vector_base_address(
void)
1471 ARM_SWITCH_REGISTERS;
1476 "mrc p15, 0, %[base], c12, c0, 0\n"
1478 : [base]
"=&r" (base) ARM_SWITCH_ADDITIONAL_OUTPUT
1484ARM_CP15_TEXT_SECTION
static inline void
1485arm_cp15_set_vector_base_address(
void *base)
1487 ARM_SWITCH_REGISTERS;
1491 "mcr p15, 0, %[base], c12, c0, 0\n"
1498ARM_CP15_TEXT_SECTION
static inline void
1499*arm_cp15_get_hyp_vector_base_address(
void)
1501 ARM_SWITCH_REGISTERS;
1506 "mrc p15, 4, %[base], c12, c0, 0\n"
1508 : [base]
"=&r" (base) ARM_SWITCH_ADDITIONAL_OUTPUT
1514ARM_CP15_TEXT_SECTION
static inline void
1515arm_cp15_set_hyp_vector_base_address(
void *base)
1517 ARM_SWITCH_REGISTERS;
1521 "mcr p15, 4, %[base], c12, c0, 0\n"
1529ARM_CP15_TEXT_SECTION
static inline uint32_t
1530arm_cp15_get_performance_monitors_cycle_count(
void)
1532 ARM_SWITCH_REGISTERS;
1537 "mrc p15, 0, %[val], c9, c13, 0\n"
1539 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1546ARM_CP15_TEXT_SECTION
static inline void
1547arm_cp15_set_performance_monitors_cycle_count(uint32_t val)
1549 ARM_SWITCH_REGISTERS;
1553 "mcr p15, 0, %[val], c9, c13, 0\n"
1561ARM_CP15_TEXT_SECTION
static inline uint32_t
1562arm_cp15_get_performance_monitors_common_event_id_0(
void)
1564 ARM_SWITCH_REGISTERS;
1569 "mrc p15, 0, %[val], c9, c12, 6\n"
1571 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1578ARM_CP15_TEXT_SECTION
static inline uint32_t
1579arm_cp15_get_performance_monitors_common_event_id_1(
void)
1581 ARM_SWITCH_REGISTERS;
1586 "mrc p15, 0, %[val], c9, c12, 7\n"
1588 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1594#define ARM_CP15_PMCLRSET_CYCLE_COUNTER 0x80000000
1597ARM_CP15_TEXT_SECTION
static inline uint32_t
1598arm_cp15_get_performance_monitors_count_enable_clear(
void)
1600 ARM_SWITCH_REGISTERS;
1605 "mrc p15, 0, %[val], c9, c12, 2\n"
1607 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1614ARM_CP15_TEXT_SECTION
static inline void
1615arm_cp15_set_performance_monitors_count_enable_clear(uint32_t val)
1617 ARM_SWITCH_REGISTERS;
1621 "mcr p15, 0, %[val], c9, c12, 2\n"
1629ARM_CP15_TEXT_SECTION
static inline uint32_t
1630arm_cp15_get_performance_monitors_count_enable_set(
void)
1632 ARM_SWITCH_REGISTERS;
1637 "mrc p15, 0, %[val], c9, c12, 1\n"
1639 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1646ARM_CP15_TEXT_SECTION
static inline void
1647arm_cp15_set_performance_monitors_count_enable_set(uint32_t val)
1649 ARM_SWITCH_REGISTERS;
1653 "mcr p15, 0, %[val], c9, c12, 1\n"
1660#define ARM_CP15_PMCR_IMP(x) ((x) << 24)
1661#define ARM_CP15_PMCR_IDCODE(x) ((x) << 16)
1662#define ARM_CP15_PMCR_N(x) ((x) << 11)
1663#define ARM_CP15_PMCR_DP (1U << 5)
1664#define ARM_CP15_PMCR_X (1U << 4)
1665#define ARM_CP15_PMCR_D (1U << 3)
1666#define ARM_CP15_PMCR_C (1U << 2)
1667#define ARM_CP15_PMCR_P (1U << 1)
1668#define ARM_CP15_PMCR_E (1U << 0)
1671ARM_CP15_TEXT_SECTION
static inline uint32_t
1672arm_cp15_get_performance_monitors_control(
void)
1674 ARM_SWITCH_REGISTERS;
1679 "mrc p15, 0, %[val], c9, c12, 0\n"
1681 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1688ARM_CP15_TEXT_SECTION
static inline void
1689arm_cp15_set_performance_monitors_control(uint32_t val)
1691 ARM_SWITCH_REGISTERS;
1695 "mcr p15, 0, %[val], c9, c12, 0\n"
1703ARM_CP15_TEXT_SECTION
static inline uint32_t
1704arm_cp15_get_performance_monitors_interrupt_enable_clear(
void)
1706 ARM_SWITCH_REGISTERS;
1711 "mrc p15, 0, %[val], c9, c14, 2\n"
1713 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1720ARM_CP15_TEXT_SECTION
static inline void
1721arm_cp15_set_performance_monitors_interrupt_enable_clear(uint32_t val)
1723 ARM_SWITCH_REGISTERS;
1727 "mcr p15, 0, %[val], c9, c14, 2\n"
1735ARM_CP15_TEXT_SECTION
static inline uint32_t
1736arm_cp15_get_performance_monitors_interrupt_enable_set(
void)
1738 ARM_SWITCH_REGISTERS;
1743 "mrc p15, 0, %[val], c9, c14, 1\n"
1745 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1752ARM_CP15_TEXT_SECTION
static inline void
1753arm_cp15_set_performance_monitors_interrupt_enable_set(uint32_t val)
1755 ARM_SWITCH_REGISTERS;
1759 "mcr p15, 0, %[val], c9, c14, 1\n"
1767ARM_CP15_TEXT_SECTION
static inline uint32_t
1768arm_cp15_get_performance_monitors_overflow_flag_status(
void)
1770 ARM_SWITCH_REGISTERS;
1775 "mrc p15, 0, %[val], c9, c12, 3\n"
1777 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1784ARM_CP15_TEXT_SECTION
static inline void
1785arm_cp15_set_performance_monitors_overflow_flag_status(uint32_t val)
1787 ARM_SWITCH_REGISTERS;
1791 "mcr p15, 0, %[val], c9, c12, 3\n"
1799ARM_CP15_TEXT_SECTION
static inline uint32_t
1800arm_cp15_get_performance_monitors_overflow_flag_status_set(
void)
1802 ARM_SWITCH_REGISTERS;
1807 "mrc p15, 0, %[val], c9, c14, 3\n"
1809 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1816ARM_CP15_TEXT_SECTION
static inline void
1817arm_cp15_set_performance_monitors_overflow_flag_status_set(uint32_t val)
1819 ARM_SWITCH_REGISTERS;
1823 "mcr p15, 0, %[val], c9, c14, 3\n"
1831ARM_CP15_TEXT_SECTION
static inline uint32_t
1832arm_cp15_get_performance_monitors_event_counter_selection(
void)
1834 ARM_SWITCH_REGISTERS;
1839 "mrc p15, 0, %[val], c9, c12, 5\n"
1841 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1848ARM_CP15_TEXT_SECTION
static inline void
1849arm_cp15_set_performance_monitors_event_counter_selection(uint32_t val)
1851 ARM_SWITCH_REGISTERS;
1855 "mcr p15, 0, %[val], c9, c12, 5\n"
1863ARM_CP15_TEXT_SECTION
static inline void
1864arm_cp15_set_performance_monitors_software_increment(uint32_t val)
1866 ARM_SWITCH_REGISTERS;
1870 "mcr p15, 0, %[val], c9, c12, 4\n"
1878ARM_CP15_TEXT_SECTION
static inline uint32_t
1879arm_cp15_get_performance_monitors_user_enable(
void)
1881 ARM_SWITCH_REGISTERS;
1886 "mrc p15, 0, %[val], c9, c14, 0\n"
1888 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1895ARM_CP15_TEXT_SECTION
static inline void
1896arm_cp15_set_performance_monitors_user_enable(uint32_t val)
1898 ARM_SWITCH_REGISTERS;
1902 "mcr p15, 0, %[val], c9, c14, 0\n"
1910ARM_CP15_TEXT_SECTION
static inline uint32_t
1911arm_cp15_get_performance_monitors_event_count(
void)
1913 ARM_SWITCH_REGISTERS;
1918 "mrc p15, 0, %[val], c9, c13, 2\n"
1920 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1927ARM_CP15_TEXT_SECTION
static inline void
1928arm_cp15_set_performance_monitors_event_count(uint32_t val)
1930 ARM_SWITCH_REGISTERS;
1934 "mcr p15, 0, %[val], c9, c13, 2\n"
1942ARM_CP15_TEXT_SECTION
static inline uint32_t
1943arm_cp15_get_performance_monitors_event_type_select(
void)
1945 ARM_SWITCH_REGISTERS;
1950 "mrc p15, 0, %[val], c9, c13, 1\n"
1952 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1959ARM_CP15_TEXT_SECTION
static inline void
1960arm_cp15_set_performance_monitors_event_type_select(uint32_t val)
1962 ARM_SWITCH_REGISTERS;
1966 "mcr p15, 0, %[val], c9, c13, 1\n"
1974ARM_CP15_TEXT_SECTION
static inline uint32_t
1975arm_cp15_get_counter_frequency(
void)
1977 ARM_SWITCH_REGISTERS;
1982 "mrc p15, 0, %[val], c14, c0, 0\n"
1984 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
1991ARM_CP15_TEXT_SECTION
static inline void
1992arm_cp15_set_counter_frequency(uint32_t val)
1994 ARM_SWITCH_REGISTERS;
1998 "mcr p15, 0, %[val], c14, c0, 0\n"
2006ARM_CP15_TEXT_SECTION
static inline uint64_t
2007arm_cp15_get_counter_physical_count(
void)
2009 ARM_SWITCH_REGISTERS;
2014 "mrrc p15, 0, %Q[val], %R[val], c14\n"
2016 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2023ARM_CP15_TEXT_SECTION
static inline uint32_t
2024arm_cp15_get_counter_non_secure_pl1_control(
void)
2026 ARM_SWITCH_REGISTERS;
2031 "mrc p15, 0, %[val], c14, c1, 0\n"
2033 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2040ARM_CP15_TEXT_SECTION
static inline void
2041arm_cp15_set_counter_non_secure_pl1_control(uint32_t val)
2043 ARM_SWITCH_REGISTERS;
2047 "mcr p15, 0, %[val], c14, c1, 0\n"
2055ARM_CP15_TEXT_SECTION
static inline uint32_t
2056arm_cp15_get_counter_pl1_physical_timer_value(
void)
2058 ARM_SWITCH_REGISTERS;
2063 "mrc p15, 0, %[val], c14, c2, 0\n"
2065 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2072ARM_CP15_TEXT_SECTION
static inline void
2073arm_cp15_set_counter_pl1_physical_timer_value(uint32_t val)
2075 ARM_SWITCH_REGISTERS;
2079 "mcr p15, 0, %[val], c14, c2, 0\n"
2087ARM_CP15_TEXT_SECTION
static inline uint32_t
2088arm_cp15_get_counter_pl1_physical_timer_control(
void)
2090 ARM_SWITCH_REGISTERS;
2095 "mrc p15, 0, %[val], c14, c2, 1\n"
2097 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2104ARM_CP15_TEXT_SECTION
static inline void
2105arm_cp15_set_counter_pl1_physical_timer_control(uint32_t val)
2107 ARM_SWITCH_REGISTERS;
2111 "mcr p15, 0, %[val], c14, c2, 1\n"
2119ARM_CP15_TEXT_SECTION
static inline uint32_t
2120arm_cp15_get_counter_pl1_virtual_timer_value(
void)
2122 ARM_SWITCH_REGISTERS;
2127 "mrc p15, 0, %[val], c14, c3, 0\n"
2129 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2136ARM_CP15_TEXT_SECTION
static inline void
2137arm_cp15_set_counter_pl1_virtual_timer_value(uint32_t val)
2139 ARM_SWITCH_REGISTERS;
2143 "mcr p15, 0, %[val], c14, c3, 0\n"
2151ARM_CP15_TEXT_SECTION
static inline uint32_t
2152arm_cp15_get_counter_pl1_virtual_timer_control(
void)
2154 ARM_SWITCH_REGISTERS;
2159 "mrc p15, 0, %[val], c14, c3, 1\n"
2161 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2168ARM_CP15_TEXT_SECTION
static inline void
2169arm_cp15_set_counter_pl1_virtual_timer_control(uint32_t val)
2171 ARM_SWITCH_REGISTERS;
2175 "mcr p15, 0, %[val], c14, c3, 1\n"
2183ARM_CP15_TEXT_SECTION
static inline uint64_t
2184arm_cp15_get_counter_virtual_count(
void)
2186 ARM_SWITCH_REGISTERS;
2191 "mrrc p15, 1, %Q[val], %R[val], c14\n"
2193 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2200ARM_CP15_TEXT_SECTION
static inline uint64_t
2201arm_cp15_get_counter_pl1_physical_compare_value(
void)
2203 ARM_SWITCH_REGISTERS;
2208 "mrrc p15, 2, %Q[val], %R[val], c14\n"
2210 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2217ARM_CP15_TEXT_SECTION
static inline void
2218arm_cp15_set_counter_pl1_physical_compare_value(uint64_t val)
2220 ARM_SWITCH_REGISTERS;
2224 "mcrr p15, 2, %Q[val], %R[val], c14\n"
2232ARM_CP15_TEXT_SECTION
static inline uint64_t
2233arm_cp15_get_counter_pl1_virtual_compare_value(
void)
2235 ARM_SWITCH_REGISTERS;
2240 "mrrc p15, 3, %Q[val], %R[val], c14\n"
2242 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2249ARM_CP15_TEXT_SECTION
static inline void
2250arm_cp15_set_counter_pl1_virtual_compare_value(uint64_t val)
2252 ARM_SWITCH_REGISTERS;
2256 "mcrr p15, 3, %Q[val], %R[val], c14\n"
2264ARM_CP15_TEXT_SECTION
static inline uint64_t
2265arm_cp15_get_counter_virtual_offset(
void)
2267 ARM_SWITCH_REGISTERS;
2272 "mrrc p15, 4, %Q[val], %R[val], c14\n"
2274 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2281ARM_CP15_TEXT_SECTION
static inline void
2282arm_cp15_set_counter_virtual_offset(uint64_t val)
2284 ARM_SWITCH_REGISTERS;
2288 "mcrr p15, 4, %Q[val], %R[val], c14\n"
2296ARM_CP15_TEXT_SECTION
static inline uint32_t
2297arm_cp15_get_diagnostic_control(
void)
2299 ARM_SWITCH_REGISTERS;
2304 "mrc p15, 0, %[val], c15, c0, 1\n"
2306 : [val]
"=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
2313ARM_CP15_TEXT_SECTION
static inline void
2314arm_cp15_set_diagnostic_control(uint32_t val)
2316 ARM_SWITCH_REGISTERS;
2320 "mcr p15, 0, %[val], c15, c0, 1\n"
2335 uint32_t section_flags
2344 Arm_symbolic_exception_name exception,
2345 void (*handler)(
void)
#define rtems_interrupt_local_disable(_isr_cookie)
This macro disables the interrupts on the current processor.
Definition: intr.h:138
ISR_Level rtems_interrupt_level
Interrupt level type.
Definition: intr.h:42
#define rtems_interrupt_local_enable(_isr_cookie)
This macro restores the previous interrupt level on the current processor.
Definition: intr.h:148
void * arm_cp15_set_exception_handler(Arm_symbolic_exception_name exception, void(*handler)(void))
Sets the exception handler in the vector table.
Definition: arm-cp15-set-exception-handler.c:19
uint32_t arm_cp15_set_translation_table_entries(const void *begin, const void *end, uint32_t section_flags)
Sets the section_flags for the address range [begin, end).
Definition: arm-cp15-set-ttb-entries.c:126
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.
unsigned ct
Definition: tlb.h:14