Skip to content

Commit 2b293e6

Browse files
committed
hvf: generalize sysreg management
So far we only supported ICC sysregs, but for enabling EL2 we also need to support non-ICC sysregs. Generalize sysreg management. Signed-off-by: Sergio Lopez <[email protected]>
1 parent 4f8b542 commit 2b293e6

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

src/arch/src/aarch64/macos/sysreg.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,24 @@ arm64_sys_reg!(SYSREG_ICC_PMR_EL1, 3, 0, 0, 4, 6);
5757
arm64_sys_reg!(SYSREG_ICC_SGI1R_EL1, 3, 0, 5, 12, 11);
5858
arm64_sys_reg!(SYSREG_ICC_SRE_EL1, 3, 0, 5, 12, 12);
5959

60+
arm64_sys_reg!(SYSREG_CNTVOFF_EL2, 3, 4, 3, 14, 0);
61+
arm64_sys_reg!(SYSREG_CNTHCTL_EL2, 3, 4, 0, 14, 1);
62+
arm64_sys_reg!(SYSREG_CNTHP_TVAL_EL2, 3, 4, 0, 14, 2);
63+
arm64_sys_reg!(SYSREG_CNTHP_CTL_EL2, 3, 4, 1, 14, 2);
64+
arm64_sys_reg!(SYSREG_CNTHP_CVAL_EL2, 3, 4, 2, 14, 2);
65+
arm64_sys_reg!(SYSREG_CNTHV_TVAL_EL2, 3, 4, 0, 14, 3);
66+
arm64_sys_reg!(SYSREG_CNTHV_CTL_EL2, 3, 4, 1, 14, 3);
67+
arm64_sys_reg!(SYSREG_CNTHV_CVAL_EL2, 3, 4, 2, 14, 3);
68+
69+
arm64_sys_reg!(SYSREG_LORC_EL1, 3, 0, 3, 10, 4);
70+
6071
// ICC_CTLR_EL1 (https://developer.arm.com/documentation/ddi0595/2021-06/AArch64-Registers/ICC-CTLR-EL1--Interrupt-Controller-Control-Register--EL1-)
6172
pub const ICC_CTLR_EL1_RSS_SHIFT: u32 = 18;
6273
pub const ICC_CTLR_EL1_A3V_SHIFT: u32 = 15;
6374
pub const ICC_CTLR_EL1_ID_BITS_SHIFT: u32 = 11;
6475
pub const ICC_CTLR_EL1_PRI_BITS_SHIFT: u32 = 8;
6576

66-
pub fn icc_reg_name(addr: u32) -> Option<&'static str> {
77+
pub fn sys_reg_name(addr: u32) -> Option<&'static str> {
6778
match addr {
6879
SYSREG_ICC_IAR0_EL1 => Some("SYSREG_ICC_IAR0_EL1"),
6980
SYSREG_ICC_IAR1_EL1 => Some("SYSREG_ICC_IAR1_EL1"),
@@ -89,6 +100,17 @@ pub fn icc_reg_name(addr: u32) -> Option<&'static str> {
89100
SYSREG_ICC_PMR_EL1 => Some("SYSREG_ICC_PMR_EL1"),
90101
SYSREG_ICC_SGI1R_EL1 => Some("SYSREG_ICC_SGI1R_EL1"),
91102
SYSREG_ICC_SRE_EL1 => Some("SYSREG_ICC_SRE_EL1"),
103+
104+
SYSREG_CNTVOFF_EL2 => Some("SYSREG_CNTVOFF_EL2"),
105+
SYSREG_CNTHCTL_EL2 => Some("SYSREG_CNTHCTL_EL2"),
106+
SYSREG_CNTHP_TVAL_EL2 => Some("SYSREG_CNTHP_TVAL_EL2"),
107+
SYSREG_CNTHP_CTL_EL2 => Some("SYSREG_CNTHP_CTL_EL2"),
108+
SYSREG_CNTHP_CVAL_EL2 => Some("SYSREG_CNTHP_CVAL_EL2"),
109+
SYSREG_CNTHV_TVAL_EL2 => Some("SYSREG_CNTHV_TVAL_EL2"),
110+
SYSREG_CNTHV_CTL_EL2 => Some("SYSREG_CNTHV_CTL_EL2"),
111+
SYSREG_CNTHV_CVAL_EL2 => Some("SYSREG_CNTHV_CVAL_EL2"),
112+
113+
SYSREG_LORC_EL1 => Some("SYSREG_LORC_EL1"),
92114
_ => None,
93115
}
94116
}

src/hvf/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::sync::Arc;
2020
use std::time::Duration;
2121

2222
#[cfg(all(target_arch = "aarch64", target_os = "macos"))]
23-
use arch::aarch64::sysreg::{icc_reg_name, SYSREG_MASK};
23+
use arch::aarch64::sysreg::{sys_reg_name, SYSREG_MASK};
2424
use crossbeam_channel::Sender;
2525
use log::debug;
2626

@@ -486,7 +486,7 @@ impl HvfVcpu<'_> {
486486
syndrome,
487487
rt,
488488
reg,
489-
icc_reg_name(reg).unwrap_or("non-ICC reg")
489+
sys_reg_name(reg).unwrap_or("unknown sysreg")
490490
);
491491

492492
self.pending_advance_pc = true;
@@ -508,7 +508,7 @@ impl HvfVcpu<'_> {
508508
"UNKNOWN rt={}, reg={} name={}",
509509
rt,
510510
reg,
511-
icc_reg_name(reg).unwrap()
511+
sys_reg_name(reg).unwrap_or("unknown sysreg")
512512
),
513513
}
514514
} else {
@@ -523,8 +523,8 @@ impl HvfVcpu<'_> {
523523
panic!(
524524
"unexpected write: {} name={}",
525525
reg,
526-
icc_reg_name(reg).unwrap_or("non-ICC reg")
527-
)
526+
sys_reg_name(reg).unwrap_or("unknown sysreg")
527+
);
528528
}
529529
}
530530
}

0 commit comments

Comments
 (0)