arm64 libhelpers: Add helper functions with el argument
[coreboot.git] / src / arch / arm64 / armv8 / lib / sysctrl.c
blob444d6c7db2c77ee835d52e5b189475ac8692a9ba
1 /*
2 * This file is part of the coreboot project.
4 * Copyright (C) 2014 Google Inc
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; version 2 of
9 * the License.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
19 * MA 02110-1301 USA
21 * Reference: ARM Architecture Reference Manual, ARMv8-A edition
22 * sysctrl.c: This file defines all the library functions for accessing system
23 * control registers in Aarch64
26 #include <stdint.h>
28 #include <arch/lib_helpers.h>
30 /* ACTLR */
31 uint32_t raw_read_actlr_el1(void)
33 uint32_t actlr_el1;
35 __asm__ __volatile__("mrs %0, ACTLR_EL1\n\t" : "=r" (actlr_el1) : : "memory");
37 return actlr_el1;
40 void raw_write_actlr_el1(uint32_t actlr_el1)
42 __asm__ __volatile__("msr ACTLR_EL1, %0\n\t" : : "r" (actlr_el1) : "memory");
45 uint32_t raw_read_actlr_el2(void)
47 uint32_t actlr_el2;
49 __asm__ __volatile__("mrs %0, ACTLR_EL2\n\t" : "=r" (actlr_el2) : : "memory");
51 return actlr_el2;
54 void raw_write_actlr_el2(uint32_t actlr_el2)
56 __asm__ __volatile__("msr ACTLR_EL2, %0\n\t" : : "r" (actlr_el2) : "memory");
59 uint32_t raw_read_actlr_el3(void)
61 uint32_t actlr_el3;
63 __asm__ __volatile__("mrs %0, ACTLR_EL3\n\t" : "=r" (actlr_el3) : : "memory");
65 return actlr_el3;
68 void raw_write_actlr_el3(uint32_t actlr_el3)
70 __asm__ __volatile__("msr ACTLR_EL3, %0\n\t" : : "r" (actlr_el3) : "memory");
73 uint32_t raw_read_actlr_current(void)
75 uint32_t el = get_current_el();
76 return raw_read_actlr(el);
79 void raw_write_actlr_current(uint32_t actlr)
81 uint32_t el = get_current_el();
82 raw_write_actlr(actlr, el);
85 uint32_t raw_read_actlr(uint32_t el)
87 SWITCH_CASE_READ(raw_read_actlr, actlr, uint32_t, el);
90 void raw_write_actlr(uint32_t actlr, uint32_t el)
92 SWITCH_CASE_WRITE(raw_write_actlr, actlr, el);
95 /* AFSR0 */
96 uint32_t raw_read_afsr0_el1(void)
98 uint32_t afsr0_el1;
100 __asm__ __volatile__("mrs %0, AFSR0_EL1\n\t" : "=r" (afsr0_el1) : : "memory");
102 return afsr0_el1;
105 void raw_write_afsr0_el1(uint32_t afsr0_el1)
107 __asm__ __volatile__("msr AFSR0_EL1, %0\n\t" : : "r" (afsr0_el1) : "memory");
110 uint32_t raw_read_afsr0_el2(void)
112 uint32_t afsr0_el2;
114 __asm__ __volatile__("mrs %0, AFSR0_EL2\n\t" : "=r" (afsr0_el2) : : "memory");
116 return afsr0_el2;
119 void raw_write_afsr0_el2(uint32_t afsr0_el2)
121 __asm__ __volatile__("msr AFSR0_EL2, %0\n\t" : : "r" (afsr0_el2) : "memory");
124 uint32_t raw_read_afsr0_el3(void)
126 uint32_t afsr0_el3;
128 __asm__ __volatile__("mrs %0, AFSR0_EL3\n\t" : "=r" (afsr0_el3) : : "memory");
130 return afsr0_el3;
133 void raw_write_afsr0_el3(uint32_t afsr0_el3)
135 __asm__ __volatile__("msr AFSR0_EL3, %0\n\t" : : "r" (afsr0_el3) : "memory");
138 uint32_t raw_read_afsr0_current(void)
140 uint32_t el = get_current_el();
141 return raw_read_afsr0(el);
144 void raw_write_afsr0_current(uint32_t afsr0)
146 uint32_t el = get_current_el();
147 raw_write_afsr0(afsr0, el);
150 uint32_t raw_read_afsr0(uint32_t el)
152 SWITCH_CASE_READ(raw_read_afsr0, afsr0, uint32_t, el);
155 void raw_write_afsr0(uint32_t afsr0, uint32_t el)
157 SWITCH_CASE_WRITE(raw_write_afsr0, afsr0, el);
160 /* AFSR1 */
161 uint32_t raw_read_afsr1_el1(void)
163 uint32_t afsr1_el1;
165 __asm__ __volatile__("mrs %0, AFSR1_EL1\n\t" : "=r" (afsr1_el1) : : "memory");
167 return afsr1_el1;
170 void raw_write_afsr1_el1(uint32_t afsr1_el1)
172 __asm__ __volatile__("msr AFSR1_EL1, %0\n\t" : : "r" (afsr1_el1) : "memory");
175 uint32_t raw_read_afsr1_el2(void)
177 uint32_t afsr1_el2;
179 __asm__ __volatile__("mrs %0, AFSR1_EL2\n\t" : "=r" (afsr1_el2) : : "memory");
181 return afsr1_el2;
184 void raw_write_afsr1_el2(uint32_t afsr1_el2)
186 __asm__ __volatile__("msr AFSR1_EL2, %0\n\t" : : "r" (afsr1_el2) : "memory");
189 uint32_t raw_read_afsr1_el3(void)
191 uint32_t afsr1_el3;
193 __asm__ __volatile__("mrs %0, AFSR1_EL3\n\t" : "=r" (afsr1_el3) : : "memory");
195 return afsr1_el3;
198 void raw_write_afsr1_el3(uint32_t afsr1_el3)
200 __asm__ __volatile__("msr AFSR1_EL3, %0\n\t" : : "r" (afsr1_el3) : "memory");
203 uint32_t raw_read_afsr1_current(void)
205 uint32_t el = get_current_el();
206 return raw_read_afsr1(el);
209 void raw_write_afsr1_current(uint32_t afsr1)
211 uint32_t el = get_current_el();
212 raw_write_afsr1(afsr1, el);
215 uint32_t raw_read_afsr1(uint32_t el)
217 SWITCH_CASE_READ(raw_read_afsr1, afsr1, uint32_t, el);
220 void raw_write_afsr1(uint32_t afsr1, uint32_t el)
222 SWITCH_CASE_WRITE(raw_write_afsr1, afsr1, el);
225 /* AIDR */
226 uint32_t raw_read_aidr_el1(void)
228 uint32_t aidr_el1;
230 __asm__ __volatile__("mrs %0, AIDR_EL1\n\t" : "=r" (aidr_el1) : : "memory");
232 return aidr_el1;
235 /* AMAIR */
236 uint64_t raw_read_amair_el1(void)
238 uint64_t amair_el1;
240 __asm__ __volatile__("mrs %0, AMAIR_EL1\n\t" : "=r" (amair_el1) : : "memory");
242 return amair_el1;
245 void raw_write_amair_el1(uint64_t amair_el1)
247 __asm__ __volatile__("msr AMAIR_EL1, %0\n\t" : : "r" (amair_el1) : "memory");
250 uint64_t raw_read_amair_el2(void)
252 uint64_t amair_el2;
254 __asm__ __volatile__("mrs %0, AMAIR_EL2\n\t" : "=r" (amair_el2) : : "memory");
256 return amair_el2;
259 void raw_write_amair_el2(uint64_t amair_el2)
261 __asm__ __volatile__("msr AMAIR_EL2, %0\n\t" : : "r" (amair_el2) : "memory");
264 uint64_t raw_read_amair_el3(void)
266 uint64_t amair_el3;
268 __asm__ __volatile__("mrs %0, AMAIR_EL3\n\t" : "=r" (amair_el3) : : "memory");
270 return amair_el3;
273 void raw_write_amair_el3(uint64_t amair_el3)
275 __asm__ __volatile__("msr AMAIR_EL3, %0\n\t" : : "r" (amair_el3) : "memory");
278 uint64_t raw_read_amair_current(void)
280 uint32_t el = get_current_el();
281 return raw_read_amair(el);
284 void raw_write_amair_current(uint64_t amair)
286 uint32_t el = get_current_el();
287 raw_write_amair(amair, el);
290 uint64_t raw_read_amair(uint32_t el)
292 SWITCH_CASE_READ(raw_read_amair, amair, uint64_t, el);
295 void raw_write_amair(uint64_t amair, uint32_t el)
297 SWITCH_CASE_WRITE(raw_write_amair, amair, el);
300 /* CCSIDR */
301 uint32_t raw_read_ccsidr_el1(void)
303 uint32_t ccsidr_el1;
305 __asm__ __volatile__("mrs %0, CCSIDR_EL1\n\t" : "=r" (ccsidr_el1) : : "memory");
307 return ccsidr_el1;
310 /* CLIDR */
311 uint32_t raw_read_clidr_el1(void)
313 uint32_t clidr_el1;
315 __asm__ __volatile__("mrs %0, CLIDR_EL1\n\t" : "=r" (clidr_el1) : : "memory");
317 return clidr_el1;
320 /* CPACR */
321 uint32_t raw_read_cpacr_el1(void)
323 uint32_t cpacr_el1;
325 __asm__ __volatile__("mrs %0, CPACR_EL1\n\t" : "=r" (cpacr_el1) : : "memory");
327 return cpacr_el1;
330 void raw_write_cpacr_el1(uint32_t cpacr_el1)
332 __asm__ __volatile__("msr CPACR_EL1, %0\n\t" : : "r" (cpacr_el1) : "memory");
335 /* CPTR */
336 uint32_t raw_read_cptr_el2(void)
338 uint32_t cptr_el2;
340 __asm__ __volatile__("mrs %0, CPTR_EL2\n\t" : "=r" (cptr_el2) : : "memory");
342 return cptr_el2;
345 void raw_write_cptr_el2(uint32_t cptr_el2)
347 __asm__ __volatile__("msr CPTR_EL2, %0\n\t" : : "r" (cptr_el2) : "memory");
350 uint32_t raw_read_cptr_el3(void)
352 uint32_t cptr_el3;
354 __asm__ __volatile__("mrs %0, CPTR_EL3\n\t" : "=r" (cptr_el3) : : "memory");
356 return cptr_el3;
359 void raw_write_cptr_el3(uint32_t cptr_el3)
361 __asm__ __volatile__("msr CPTR_EL3, %0\n\t" : : "r" (cptr_el3) : "memory");
364 /* CSSELR */
365 uint32_t raw_read_csselr_el1(void)
367 uint32_t csselr_el1;
369 __asm__ __volatile__("mrs %0, CSSELR_EL1\n\t" : "=r" (csselr_el1) : : "memory");
371 return csselr_el1;
374 void raw_write_csselr_el1(uint32_t csselr_el1)
376 __asm__ __volatile__("msr CSSELR_EL1, %0\n\t" : : "r" (csselr_el1) : "memory");
379 /* CTR */
380 uint32_t raw_read_ctr_el0(void)
382 uint32_t ctr_el0;
384 __asm__ __volatile__("mrs %0, CTR_EL0\n\t" : "=r" (ctr_el0) : : "memory");
386 return ctr_el0;
389 /* ESR */
390 uint32_t raw_read_esr_el1(void)
392 uint32_t esr_el1;
394 __asm__ __volatile__("mrs %0, ESR_EL1\n\t" : "=r" (esr_el1) : : "memory");
396 return esr_el1;
399 void raw_write_esr_el1(uint32_t esr_el1)
401 __asm__ __volatile__("msr ESR_EL1, %0\n\t" : : "r" (esr_el1) : "memory");
404 uint32_t raw_read_esr_el2(void)
406 uint32_t esr_el2;
408 __asm__ __volatile__("mrs %0, ESR_EL2\n\t" : "=r" (esr_el2) : : "memory");
410 return esr_el2;
413 void raw_write_esr_el2(uint32_t esr_el2)
415 __asm__ __volatile__("msr ESR_EL2, %0\n\t" : : "r" (esr_el2) : "memory");
418 uint32_t raw_read_esr_el3(void)
420 uint32_t esr_el3;
422 __asm__ __volatile__("mrs %0, ESR_EL3\n\t" : "=r" (esr_el3) : : "memory");
424 return esr_el3;
427 void raw_write_esr_el3(uint32_t esr_el3)
429 __asm__ __volatile__("msr ESR_EL3, %0\n\t" : : "r" (esr_el3) : "memory");
432 uint32_t raw_read_esr_current(void)
434 uint32_t el = get_current_el();
435 return raw_read_esr(el);
438 void raw_write_esr_current(uint32_t esr)
440 uint32_t el = get_current_el();
441 raw_write_esr(esr, el);
444 uint32_t raw_read_esr(uint32_t el)
446 SWITCH_CASE_READ(raw_read_esr, esr, uint32_t, el);
449 void raw_write_esr(uint32_t esr, uint32_t el)
451 SWITCH_CASE_WRITE(raw_write_esr, esr, el);
454 /* FAR */
455 uint64_t raw_read_far_el1(void)
457 uint64_t far_el1;
459 __asm__ __volatile__("mrs %0, FAR_EL1\n\t" : "=r" (far_el1) : : "memory");
461 return far_el1;
464 void raw_write_far_el1(uint64_t far_el1)
466 __asm__ __volatile__("msr FAR_EL1, %0\n\t" : : "r" (far_el1) : "memory");
469 uint64_t raw_read_far_el2(void)
471 uint64_t far_el2;
473 __asm__ __volatile__("mrs %0, FAR_EL2\n\t" : "=r" (far_el2) : : "memory");
475 return far_el2;
478 void raw_write_far_el2(uint64_t far_el2)
480 __asm__ __volatile__("msr FAR_EL2, %0\n\t" : : "r" (far_el2) : "memory");
483 uint64_t raw_read_far_el3(void)
485 uint64_t far_el3;
487 __asm__ __volatile__("mrs %0, FAR_EL3\n\t" : "=r" (far_el3) : : "memory");
489 return far_el3;
492 void raw_write_far_el3(uint64_t far_el3)
494 __asm__ __volatile__("msr FAR_EL3, %0\n\t" : : "r" (far_el3) : "memory");
497 uint64_t raw_read_far_current(void)
499 uint32_t el = get_current_el();
500 return raw_read_far(el);
503 void raw_write_far_current(uint64_t far)
505 uint32_t el = get_current_el();
506 raw_write_far(far, el);
509 uint64_t raw_read_far(uint32_t el)
511 SWITCH_CASE_READ(raw_read_far, far, uint64_t, el);
514 void raw_write_far(uint64_t far, uint32_t el)
516 SWITCH_CASE_WRITE(raw_write_far, far, el);
519 /* HCR */
520 uint64_t raw_read_hcr_el2(void)
522 uint64_t hcr_el2;
524 __asm__ __volatile__("mrs %0, HCR_EL2\n\t" : "=r" (hcr_el2) : : "memory");
526 return hcr_el2;
529 void raw_write_hcr_el2(uint64_t hcr_el2)
531 __asm__ __volatile__("msr HCR_EL2, %0\n\t" : : "r" (hcr_el2) : "memory");
534 /* AA64PFR0 */
535 uint64_t raw_read_aa64pfr0_el1(void)
537 uint64_t aa64pfr0_el1;
539 __asm__ __volatile__("mrs %0, ID_AA64PFR0_EL1\n\t" : "=r" (aa64pfr0_el1) : : "memory");
541 return aa64pfr0_el1;
544 /* MAIR */
545 uint64_t raw_read_mair_el1(void)
547 uint64_t mair_el1;
549 __asm__ __volatile__("mrs %0, MAIR_EL1\n\t" : "=r" (mair_el1) : : "memory");
551 return mair_el1;
554 void raw_write_mair_el1(uint64_t mair_el1)
556 __asm__ __volatile__("msr MAIR_EL1, %0\n\t" : : "r" (mair_el1) : "memory");
559 uint64_t raw_read_mair_el2(void)
561 uint64_t mair_el2;
563 __asm__ __volatile__("mrs %0, MAIR_EL2\n\t" : "=r" (mair_el2) : : "memory");
565 return mair_el2;
568 void raw_write_mair_el2(uint64_t mair_el2)
570 __asm__ __volatile__("msr MAIR_EL2, %0\n\t" : : "r" (mair_el2) : "memory");
573 uint64_t raw_read_mair_el3(void)
575 uint64_t mair_el3;
577 __asm__ __volatile__("mrs %0, MAIR_EL3\n\t" : "=r" (mair_el3) : : "memory");
579 return mair_el3;
582 void raw_write_mair_el3(uint64_t mair_el3)
584 __asm__ __volatile__("msr MAIR_EL3, %0\n\t" : : "r" (mair_el3) : "memory");
587 uint64_t raw_read_mair_current(void)
589 uint32_t el = get_current_el();
590 return raw_read_mair(el);
593 void raw_write_mair_current(uint64_t mair)
595 uint32_t el = get_current_el();
596 raw_write_mair(mair, el);
599 uint64_t raw_read_mair(uint32_t el)
601 SWITCH_CASE_READ(raw_read_mair, mair, uint64_t, el);
604 void raw_write_mair(uint64_t mair, uint32_t el)
606 SWITCH_CASE_WRITE(raw_write_mair, mair, el);
609 /* MIDR */
610 uint32_t raw_read_midr_el1(void)
612 uint32_t midr_el1;
614 __asm__ __volatile__("mrs %0, MIDR_EL1\n\t" : "=r" (midr_el1) : : "memory");
616 return midr_el1;
619 /* MPIDR */
620 uint64_t raw_read_mpidr_el1(void)
622 uint64_t mpidr_el1;
624 __asm__ __volatile__("mrs %0, MPIDR_EL1\n\t" : "=r" (mpidr_el1) : : "memory");
626 return mpidr_el1;
629 /* RMR */
630 uint32_t raw_read_rmr_el1(void)
632 uint32_t rmr_el1;
634 __asm__ __volatile__("mrs %0, RMR_EL1\n\t" : "=r" (rmr_el1) : : "memory");
636 return rmr_el1;
639 void raw_write_rmr_el1(uint32_t rmr_el1)
641 __asm__ __volatile__("msr RMR_EL1, %0\n\t" : : "r" (rmr_el1) : "memory");
644 uint32_t raw_read_rmr_el2(void)
646 uint32_t rmr_el2;
648 __asm__ __volatile__("mrs %0, RMR_EL2\n\t" : "=r" (rmr_el2) : : "memory");
650 return rmr_el2;
653 void raw_write_rmr_el2(uint32_t rmr_el2)
655 __asm__ __volatile__("msr RMR_EL2, %0\n\t" : : "r" (rmr_el2) : "memory");
658 uint32_t raw_read_rmr_el3(void)
660 uint32_t rmr_el3;
662 __asm__ __volatile__("mrs %0, RMR_EL3\n\t" : "=r" (rmr_el3) : : "memory");
664 return rmr_el3;
667 void raw_write_rmr_el3(uint32_t rmr_el3)
669 __asm__ __volatile__("msr RMR_EL3, %0\n\t" : : "r" (rmr_el3) : "memory");
672 uint32_t raw_read_rmr_current(void)
674 uint32_t el = get_current_el();
675 return raw_read_rmr(el);
678 void raw_write_rmr_current(uint32_t rmr)
680 uint32_t el = get_current_el();
681 raw_write_rmr(rmr, el);
684 uint32_t raw_read_rmr(uint32_t el)
686 SWITCH_CASE_READ(raw_read_rmr, rmr, uint32_t, el);
689 void raw_write_rmr(uint32_t rmr, uint32_t el)
691 SWITCH_CASE_WRITE(raw_write_rmr, rmr, el);
694 /* RVBAR */
695 uint64_t raw_read_rvbar_el1(void)
697 uint64_t rvbar_el1;
699 __asm__ __volatile__("mrs %0, RVBAR_EL1\n\t" : "=r" (rvbar_el1) : : "memory");
701 return rvbar_el1;
704 void raw_write_rvbar_el1(uint64_t rvbar_el1)
706 __asm__ __volatile__("msr RVBAR_EL1, %0\n\t" : : "r" (rvbar_el1) : "memory");
709 uint64_t raw_read_rvbar_el2(void)
711 uint64_t rvbar_el2;
713 __asm__ __volatile__("mrs %0, RVBAR_EL2\n\t" : "=r" (rvbar_el2) : : "memory");
715 return rvbar_el2;
718 void raw_write_rvbar_el2(uint64_t rvbar_el2)
720 __asm__ __volatile__("msr RVBAR_EL2, %0\n\t" : : "r" (rvbar_el2) : "memory");
723 uint64_t raw_read_rvbar_el3(void)
725 uint64_t rvbar_el3;
727 __asm__ __volatile__("mrs %0, RVBAR_EL3\n\t" : "=r" (rvbar_el3) : : "memory");
729 return rvbar_el3;
732 void raw_write_rvbar_el3(uint64_t rvbar_el3)
734 __asm__ __volatile__("msr RVBAR_EL3, %0\n\t" : : "r" (rvbar_el3) : "memory");
737 uint64_t raw_read_rvbar_current(void)
739 uint32_t el = get_current_el();
740 return raw_read_rvbar(el);
743 void raw_write_rvbar_current(uint64_t rvbar)
745 uint32_t el = get_current_el();
746 raw_write_rvbar(rvbar, el);
749 uint64_t raw_read_rvbar(uint32_t el)
751 SWITCH_CASE_READ(raw_read_rvbar, rvbar, uint64_t, el);
754 void raw_write_rvbar(uint64_t rvbar, uint32_t el)
756 SWITCH_CASE_WRITE(raw_write_rvbar, rvbar, el);
759 /* Scr */
760 uint32_t raw_read_scr_el3(void)
762 uint32_t scr_el3;
764 __asm__ __volatile__("mrs %0, SCR_EL3\n\t" : "=r" (scr_el3) : : "memory");
766 return scr_el3;
769 void raw_write_scr_el3(uint32_t scr_el3)
771 __asm__ __volatile__("msr SCR_EL3, %0\n\t" : : "r" (scr_el3) : "memory");
774 /* SCTLR */
775 uint32_t raw_read_sctlr_el1(void)
777 uint32_t sctlr_el1;
779 __asm__ __volatile__("mrs %0, SCTLR_EL1\n\t" : "=r" (sctlr_el1) : : "memory");
781 return sctlr_el1;
784 void raw_write_sctlr_el1(uint32_t sctlr_el1)
786 __asm__ __volatile__("msr SCTLR_EL1, %0\n\t" : : "r" (sctlr_el1) : "memory");
789 uint32_t raw_read_sctlr_el2(void)
791 uint32_t sctlr_el2;
793 __asm__ __volatile__("mrs %0, SCTLR_EL2\n\t" : "=r" (sctlr_el2) : : "memory");
795 return sctlr_el2;
798 void raw_write_sctlr_el2(uint32_t sctlr_el2)
800 __asm__ __volatile__("msr SCTLR_EL2, %0\n\t" : : "r" (sctlr_el2) : "memory");
803 uint32_t raw_read_sctlr_el3(void)
805 uint32_t sctlr_el3;
807 __asm__ __volatile__("mrs %0, SCTLR_EL3\n\t" : "=r" (sctlr_el3) : : "memory");
809 return sctlr_el3;
812 void raw_write_sctlr_el3(uint32_t sctlr_el3)
814 __asm__ __volatile__("msr SCTLR_EL3, %0\n\t" : : "r" (sctlr_el3) : "memory");
817 uint32_t raw_read_sctlr_current(void)
819 uint32_t el = get_current_el();
820 return raw_read_sctlr(el);
823 void raw_write_sctlr_current(uint32_t sctlr)
825 uint32_t el = get_current_el();
826 raw_write_sctlr(sctlr, el);
829 uint32_t raw_read_sctlr(uint32_t el)
831 SWITCH_CASE_READ(raw_read_sctlr, sctlr, uint32_t, el);
834 void raw_write_sctlr(uint32_t sctlr, uint32_t el)
836 SWITCH_CASE_WRITE(raw_write_sctlr, sctlr, el);
839 /* TCR */
840 uint64_t raw_read_tcr_el1(void)
842 uint64_t tcr_el1;
844 __asm__ __volatile__("mrs %0, TCR_EL1\n\t" : "=r" (tcr_el1) : : "memory");
846 return tcr_el1;
849 void raw_write_tcr_el1(uint64_t tcr_el1)
851 __asm__ __volatile__("msr TCR_EL1, %0\n\t" : : "r" (tcr_el1) : "memory");
854 uint32_t raw_read_tcr_el2(void)
856 uint32_t tcr_el2;
858 __asm__ __volatile__("mrs %0, TCR_EL2\n\t" : "=r" (tcr_el2) : : "memory");
860 return tcr_el2;
863 void raw_write_tcr_el2(uint32_t tcr_el2)
865 __asm__ __volatile__("msr TCR_EL2, %0\n\t" : : "r" (tcr_el2) : "memory");
868 uint32_t raw_read_tcr_el3(void)
870 uint32_t tcr_el3;
872 __asm__ __volatile__("mrs %0, TCR_EL3\n\t" : "=r" (tcr_el3) : : "memory");
874 return tcr_el3;
877 void raw_write_tcr_el3(uint32_t tcr_el3)
879 __asm__ __volatile__("msr TCR_EL3, %0\n\t" : : "r" (tcr_el3) : "memory");
882 /* TTBR0 */
883 uint64_t raw_read_ttbr0_el1(void)
885 uint64_t ttbr0_el1;
887 __asm__ __volatile__("mrs %0, TTBR0_EL1\n\t" : "=r" (ttbr0_el1) : : "memory");
889 return ttbr0_el1;
892 void raw_write_ttbr0_el1(uint64_t ttbr0_el1)
894 __asm__ __volatile__("msr TTBR0_EL1, %0\n\t" : : "r" (ttbr0_el1) : "memory");
897 uint64_t raw_read_ttbr0_el2(void)
899 uint64_t ttbr0_el2;
901 __asm__ __volatile__("mrs %0, TTBR0_EL2\n\t" : "=r" (ttbr0_el2) : : "memory");
903 return ttbr0_el2;
906 void raw_write_ttbr0_el2(uint64_t ttbr0_el2)
908 __asm__ __volatile__("msr TTBR0_EL2, %0\n\t" : : "r" (ttbr0_el2) : "memory");
911 uint64_t raw_read_ttbr0_el3(void)
913 uint64_t ttbr0_el3;
915 __asm__ __volatile__("mrs %0, TTBR0_EL3\n\t" : "=r" (ttbr0_el3) : : "memory");
917 return ttbr0_el3;
920 void raw_write_ttbr0_el3(uint64_t ttbr0_el3)
922 __asm__ __volatile__("msr TTBR0_EL3, %0\n\t" : : "r" (ttbr0_el3) : "memory");
925 uint64_t raw_read_ttbr0_current(void)
927 uint32_t el = get_current_el();
928 return raw_read_ttbr0(el);
931 void raw_write_ttbr0_current(uint64_t ttbr0)
933 uint32_t el = get_current_el();
934 raw_write_ttbr0(ttbr0, el);
937 uint64_t raw_read_ttbr0(uint32_t el)
939 SWITCH_CASE_READ(raw_read_ttbr0, ttbr0, uint64_t, el);
942 void raw_write_ttbr0(uint64_t ttbr0, uint32_t el)
944 SWITCH_CASE_WRITE(raw_write_ttbr0, ttbr0, el);
947 /* TTBR1 */
948 uint64_t raw_read_ttbr1_el1(void)
950 uint64_t ttbr1_el1;
952 __asm__ __volatile__("mrs %0, TTBR1_EL1\n\t" : "=r" (ttbr1_el1) : : "memory");
954 return ttbr1_el1;
957 void raw_write_ttbr1_el1(uint64_t ttbr1_el1)
959 __asm__ __volatile__("msr TTBR1_EL1, %0\n\t" : : "r" (ttbr1_el1) : "memory");
962 /* VBAR */
963 uint64_t raw_read_vbar_el1(void)
965 uint64_t vbar_el1;
967 __asm__ __volatile__("mrs %0, VBAR_EL1\n\t" : "=r" (vbar_el1) : : "memory");
969 return vbar_el1;
972 void raw_write_vbar_el1(uint64_t vbar_el1)
974 __asm__ __volatile__("msr VBAR_EL1, %0\n\t" : : "r" (vbar_el1) : "memory");
977 uint64_t raw_read_vbar_el2(void)
979 uint64_t vbar_el2;
981 __asm__ __volatile__("mrs %0, VBAR_EL2\n\t" : "=r" (vbar_el2) : : "memory");
983 return vbar_el2;
986 void raw_write_vbar_el2(uint64_t vbar_el2)
988 __asm__ __volatile__("msr VBAR_EL2, %0\n\t" : : "r" (vbar_el2) : "memory");
991 uint64_t raw_read_vbar_el3(void)
993 uint64_t vbar_el3;
995 __asm__ __volatile__("mrs %0, VBAR_EL3\n\t" : "=r" (vbar_el3) : : "memory");
997 return vbar_el3;
1000 void raw_write_vbar_el3(uint64_t vbar_el3)
1002 __asm__ __volatile__("msr VBAR_EL3, %0\n\t" : : "r" (vbar_el3) : "memory");
1005 uint64_t raw_read_vbar_current(void)
1007 uint32_t el = get_current_el();
1008 return raw_read_vbar(el);
1011 void raw_write_vbar_current(uint64_t vbar)
1013 uint32_t el = get_current_el();
1014 raw_write_vbar(vbar, el);
1017 uint64_t raw_read_vbar(uint32_t el)
1019 SWITCH_CASE_READ(raw_read_vbar, vbar, uint64_t, el);
1022 void raw_write_vbar(uint64_t vbar, uint32_t el)
1024 SWITCH_CASE_WRITE(raw_write_vbar, vbar, el);