Skip to content

Commit b80c27e

Browse files
committed
feat: 添加 pa_bits 字段到 HCpu 和 VmMachineUninit 结构体,增强物理地址处理能力
1 parent e1d5326 commit b80c27e

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

src/arch/aarch64/cpu.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub struct HCpu {
2323
vpercpu: Aarch64PerCpu,
2424
max_guest_page_table_levels: usize,
2525
pub pa_range: core::ops::Range<usize>,
26+
pub pa_bits: usize,
2627
}
2728

2829
impl HCpu {
@@ -38,13 +39,15 @@ impl HCpu {
3839
vpercpu,
3940
max_guest_page_table_levels: 0,
4041
pa_range: 0..0,
42+
pa_bits: 0,
4143
}
4244
}
4345

4446
pub fn init(&mut self) -> anyhow::Result<()> {
4547
self.vpercpu.hardware_enable();
4648
self.max_guest_page_table_levels = self.vpercpu.max_guest_page_table_levels();
4749
self.pa_range = self.vpercpu.pa_range();
50+
self.pa_bits = self.vpercpu.pa_bits();
4851
Ok(())
4952
}
5053

@@ -102,7 +105,6 @@ impl VCpu {
102105
let vcpu = arm_vcpu::Aarch64VCpu::new(Aarch64VCpuCreateConfig {
103106
mpidr_el1: hard_id.raw() as u64,
104107
dtb_addr: dtb_addr.as_usize(),
105-
pt_level: 4,
106108
})
107109
.unwrap();
108110
Ok(VCpu { vcpu, common })
@@ -111,6 +113,10 @@ impl VCpu {
111113
pub fn set_pt_level(&mut self, level: usize) {
112114
self.vcpu.pt_level = level;
113115
}
116+
117+
pub fn set_pa_bits(&mut self, pa_bits: usize) {
118+
self.vcpu.pa_bits = pa_bits;
119+
}
114120
}
115121

116122
impl VCpuOp for VCpu {

src/arch/aarch64/vm/unint.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub struct VmMachineUninit {
1515
config: AxVMConfig,
1616
pt_levels: usize,
1717
pa_max: usize,
18+
pa_bits: usize,
1819
}
1920

2021
impl VmMachineUninitOps for VmMachineUninit {
@@ -25,6 +26,7 @@ impl VmMachineUninitOps for VmMachineUninit {
2526
config,
2627
pt_levels: 4,
2728
pa_max: usize::MAX,
29+
pa_bits: 48,
2830
}
2931
}
3032

@@ -63,23 +65,32 @@ impl VmMachineUninit {
6365
let vcpu_count = vcpus.len();
6466

6567
for vcpu in &vcpus {
66-
let (max_levels, max_pa) =
67-
vcpu.with_hcpu(|cpu| (cpu.max_guest_page_table_levels(), cpu.pa_range.end));
68+
let (max_levels, max_pa, pa_bits) = vcpu.with_hcpu(|cpu| {
69+
(
70+
cpu.max_guest_page_table_levels(),
71+
cpu.pa_range.end,
72+
cpu.pa_bits,
73+
)
74+
});
6875
if max_levels < self.pt_levels {
6976
self.pt_levels = max_levels;
7077
}
7178
if max_pa < self.pa_max {
7279
self.pa_max = max_pa;
7380
}
81+
82+
if pa_bits < self.pa_bits {
83+
self.pa_bits = pa_bits;
84+
}
7485
}
7586

7687
if self.pt_levels == 3 {
7788
self.pa_max = self.pa_max.min(0x8000000000);
7889
}
7990

8091
debug!(
81-
"VM {} ({}) vCPU count: {}, \n Max Guest Page Table Levels: {}\n Max PA: {:#x}",
82-
self.config.id, self.config.name, vcpu_count, self.pt_levels, self.pa_max
92+
"VM {} ({}) vCPU count: {}, \n Max Guest Page Table Levels: {}\n Max PA: {:#x}\n PA Bits: {}",
93+
self.config.id, self.config.name, vcpu_count, self.pt_levels, self.pa_max, self.pa_bits
8394
);
8495
Ok(vcpus)
8596
}
@@ -121,6 +132,7 @@ impl VmMachineUninit {
121132
vcpu.vcpu.set_entry(kernel_entry).unwrap();
122133
vcpu.vcpu.set_dtb_addr(dtb_addr).unwrap();
123134
vcpu.set_pt_level(self.pt_levels);
135+
vcpu.set_pa_bits(self.pa_bits);
124136

125137
let setup_config = Aarch64VCpuSetupConfig {
126138
passthrough_interrupt: self.config.interrupt_mode()

0 commit comments

Comments
 (0)