FreeNOS
ARM64Control.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2025 Ivan Tan
3 * Copyright (C) 2015 Niek Linnenbank
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include "ARM64Control.h"
20#include <Log.h>
21
22namespace ARM64Control {
23
25{
26 u64 r = 0;
27 switch (reg)
28 {
29 case SystemControl: {
30 asm volatile ("mrs %0, sctlr_el1" : "=r" (r));
31 break;
32 }
33 case SystemFrequency: {
34 asm volatile ("mrs %0, cntfrq_el0" : "=r" (r));
35 break;
36 }
37 case MemoryModelFeature: {
38 asm volatile ("mrs %0, id_aa64mmfr0_el1" : "=r" (r));
39 break;
40 }
41 case PhysicalTimerCount: {
42 asm volatile ("mrs %0, cntpct_el0" : "=r" (r));
43 break;
44 }
45 case PhysicalTimerValue: {
46 asm volatile ("mrs %0, cntp_tval_el0" : "=r" (r));
47 break;
48 }
50 asm volatile ("mrs %0, cntp_ctl_el0" : "=r" (r));
51 break;
52 }
53 case DAIF: {
54 asm volatile ("mrs %0, DAIF" : "=r" (r));
55 break;
56 }
57 default: break;
58 }
59 return r;
60}
61
62void write(Register reg, u64 value)
63{
64 switch (reg)
65 {
66 case SystemControl: {
67 asm volatile ("msr sctlr_el1, %0" : : "r" (value));
68 break;
69 }
70 case TranslationTable0: {
71 asm volatile ("msr ttbr0_el1, %0" : : "r" (value));
72 break;
73 }
74 case TranslationTable1: {
75 asm volatile ("msr ttbr1_el1, %0" : : "r" (value));
76 break;
77 }
79 asm volatile ("msr tcr_el1, %0; isb" : : "r" (value));
80 break;
81 }
82 case VectorBaseAddress: {
83 asm volatile ("msr vbar_el1, %0" : : "r" (value));
84 break;
85 }
87 asm volatile ("msr mair_el1, %0" : : "r" (value));
88 break;
89 }
90 case PhysicalTimerValue: {
91 asm volatile ("msr cntp_tval_el0, %0" : : "r" (value));
92 break;
93 }
95 asm volatile ("msr cntp_ctl_el0, %0" : : "r" (value));
96 break;
97 }
98 default: break;
99 }
100}
101
103{
104 u64 val = read(reg);
105 val |= flags;
106 write(reg, val);
107}
108
110{
111 u64 val = read(reg);
112 val &= ~(flags);
113 write(reg, val);
114}
115
120
125
126}
u32 flags
Definition IntelACPI.h:3
unsigned long long u64
Unsigned 64-bit number.
Definition Types.h:50
ARM64 System Control Coprocessor (CP15).
u64 read(Register reg)
Read a register from the CP15.
void write(Register reg, u64 value)
Write register to the CP15.
DomainControlFlags
Domain Control flags.
AuxControlFlags
Aux Control flags.
void unset(Register reg, u64 flags)
Register
System Control Registers.
void set(Register reg, u64 flags)