Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit2ecba0f

Browse files
committed
x86_64: support booting from a firmware
Reuse the firmware support we have for aarch64 and enable x86_64 tomake use of it.Signed-off-by: Sergio Lopez <slp@redhat.com>
1 parent36a1eef commit2ecba0f

File tree

5 files changed

+74
-48
lines changed

5 files changed

+74
-48
lines changed

‎src/arch/src/lib.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ pub mod x86_64;
4444
#[cfg(target_arch ="x86_64")]
4545
pubusecrate::x86_64::{
4646
arch_memory_regions, configure_system, get_kernel_start, initrd_load_addr,
47-
layout::CMDLINE_MAX_SIZE, layout::IRQ_BASE, layout::IRQ_MAX,Error,layout::FIRMWARE_SIZE, layout::FIRMWARE_START,
48-
layout::MMIO_MEM_START, layout::RESET_VECTOR,
47+
layout::CMDLINE_MAX_SIZE, layout::FIRMWARE_SIZE, layout::FIRMWARE_START,layout::IRQ_BASE,
48+
layout::IRQ_MAX, layout::MMIO_MEM_START, layout::RESET_VECTOR,Error,
4949
};
5050

5151
/// Type for returning public functions outcome.

‎src/arch/src/x86_64/mod.rs‎

Lines changed: 54 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ pub mod msr;
1717
/// Logic for configuring x86_64 registers.
1818
pubmod regs;
1919

20-
usecrate::{ArchMemoryInfo,InitrdConfig};
21-
usecrate::x86_64::layout::{MMIO_MEM_START,FIRST_ADDR_PAST_32BITS,EBDA_START};
20+
usecrate::x86_64::layout::{EBDA_START,FIRST_ADDR_PAST_32BITS,MMIO_MEM_START};
2221
#[cfg(feature ="tee")]
23-
usecrate::x86_64::layout::{FIRMWARE_START,FIRMWARE_SIZE};
22+
usecrate::x86_64::layout::{FIRMWARE_SIZE,FIRMWARE_START};
23+
usecrate::{ArchMemoryInfo,InitrdConfig};
2424
use arch_gen::x86::bootparam::{boot_params,E820_RAM};
2525
use vm_memory::Bytes;
2626
use vm_memory::{
@@ -63,74 +63,91 @@ pub fn arch_memory_regions(
6363
kernel_load_addr:Option<u64>,
6464
kernel_size:usize,
6565
initrd_size:u64,
66+
firmware_size:Option<usize>,
6667
) ->(ArchMemoryInfo,Vec<(GuestAddress,usize)>){
6768
let page_size:usize =unsafe{ libc::sysconf(libc::_SC_PAGESIZE).try_into().unwrap()};
6869

6970
let size =align_upwards!(size, page_size);
7071

7172
// It's safe to cast MMIO_MEM_START to usize because it fits in a u32 variable
7273
// (It points to an address in the 32 bit space).
73-
let(ram_last_addr, shm_start_addr, regions) =match size.checked_sub(MMIO_MEM_STARTasusize){
74+
let(ram_last_addr, shm_start_addr, regions, firmware_addr) =match size
75+
.checked_sub(MMIO_MEM_STARTasusize)
76+
{
7477
// case1: guest memory fits before the gap
7578
None |Some(0) =>{
7679
let shm_start_addr =FIRST_ADDR_PAST_32BITS;
7780

78-
ifletSome(kernel_load_addr) = kernel_load_addr{
81+
let(ram_last_addr,mut regions) =ifletSome(kernel_load_addr) = kernel_load_addr{
7982
if size <(kernel_load_addr + kernel_sizeasu64)asusize{
8083
panic!("Kernel doesn't fit in RAM");
8184
}
8285

8386
let ram_last_addr = kernel_load_addr + kernel_sizeasu64 + sizeasu64;
8487
(
8588
ram_last_addr,
86-
shm_start_addr,
8789
vec![
8890
(GuestAddress(0), kernel_load_addrasusize),
8991
(GuestAddress(kernel_load_addr + kernel_sizeasu64), size),
9092
],
9193
)
9294
}else{
9395
let ram_last_addr = sizeasu64;
94-
(ram_last_addr, shm_start_addr,vec![(GuestAddress(0), size)])
95-
}
96+
(ram_last_addr,vec![(GuestAddress(0), size)])
97+
};
98+
99+
let firmware_addr =ifletSome(firmware_size) = firmware_size{
100+
let firmware_start = layout::FIRST_ADDR_PAST_32BITS - firmware_sizeasu64;
101+
regions.push((GuestAddress(firmware_start), firmware_size));
102+
firmware_start
103+
}else{
104+
0
105+
};
106+
107+
(ram_last_addr, shm_start_addr, regions, firmware_addr)
96108
}
97109

98110
// case2: guest memory extends beyond the gap
99111
Some(remaining) =>{
100112
let ram_last_addr =FIRST_ADDR_PAST_32BITS + remainingasu64;
101113
let shm_start_addr =((ram_last_addr /0x4000_0000) +1)*0x4000_0000;
102114

103-
ifletSome(kernel_load_addr) = kernel_load_addr{
104-
(
105-
ram_last_addr,
106-
shm_start_addr,
107-
vec![
108-
(GuestAddress(0), kernel_load_addrasusize),
109-
(
110-
GuestAddress(kernel_load_addr + kernel_sizeasu64),
111-
(MMIO_MEM_START -(kernel_load_addr + kernel_sizeasu64))asusize,
112-
),
113-
(GuestAddress(FIRST_ADDR_PAST_32BITS), remaining),
114-
],
115-
)
115+
letmut regions =ifletSome(kernel_load_addr) = kernel_load_addr{
116+
vec![
117+
(GuestAddress(0), kernel_load_addrasusize),
118+
(
119+
GuestAddress(kernel_load_addr + kernel_sizeasu64),
120+
(MMIO_MEM_START -(kernel_load_addr + kernel_sizeasu64))asusize,
121+
),
122+
(GuestAddress(FIRST_ADDR_PAST_32BITS), remaining),
123+
]
116124
}else{
117-
(
118-
ram_last_addr,
119-
shm_start_addr,
120-
vec![
121-
(GuestAddress(0),MMIO_MEM_STARTasusize),
122-
(GuestAddress(FIRST_ADDR_PAST_32BITS), remaining),
123-
],
124-
)
125-
}
125+
vec![
126+
(GuestAddress(0),MMIO_MEM_STARTasusize),
127+
(GuestAddress(FIRST_ADDR_PAST_32BITS), remaining),
128+
]
129+
};
130+
131+
let firmware_addr =ifletSome(firmware_size) = firmware_size{
132+
let firmware_start = layout::FIRST_ADDR_PAST_32BITS - firmware_sizeasu64;
133+
regions.insert(
134+
regions.len() -2,
135+
(GuestAddress(firmware_start), firmware_size),
136+
);
137+
firmware_start
138+
}else{
139+
0
140+
};
141+
142+
(ram_last_addr, shm_start_addr, regions, firmware_addr)
126143
}
127144
};
128145
let info =ArchMemoryInfo{
129146
ram_last_addr,
130147
shm_start_addr,
131148
page_size,
132149
initrd_addr: ram_last_addr - initrd_size,
133-
firmware_addr:0,
150+
firmware_addr,
134151
};
135152
(info, regions)
136153
}
@@ -146,6 +163,7 @@ pub fn arch_memory_regions(
146163
kernel_load_addr:Option<u64>,
147164
kernel_size:usize,
148165
_initrd_size:u64,
166+
_firmware_size:Option<usize>,
149167
) ->(ArchMemoryInfo,Vec<(GuestAddress,usize)>){
150168
let page_size:usize =unsafe{ libc::sysconf(libc::_SC_PAGESIZE).try_into().unwrap()};
151169

@@ -348,7 +366,7 @@ mod tests {
348366
#[test]
349367
fnregions_lt_4gb(){
350368
let(_info, regions) =
351-
arch_memory_regions(1usize <<29,Some(KERNEL_LOAD_ADDR),KERNEL_SIZE,0);
369+
arch_memory_regions(1usize <<29,Some(KERNEL_LOAD_ADDR),KERNEL_SIZE,0,None);
352370
assert_eq!(2, regions.len());
353371
assert_eq!(GuestAddress(0), regions[0].0);
354372
assert_eq!(KERNEL_LOAD_ADDRasusize, regions[0].1);
@@ -366,6 +384,7 @@ mod tests {
366384
Some(KERNEL_LOAD_ADDR),
367385
KERNEL_SIZE,
368386
0,
387+
None,
369388
);
370389
assert_eq!(3, regions.len());
371390
assert_eq!(GuestAddress(0), regions[0].0);
@@ -393,21 +412,21 @@ mod tests {
393412
// Now assigning some memory that falls before the 32bit memory hole.
394413
let mem_size =128 <<20;
395414
let(arch_mem_info, arch_mem_regions) =
396-
arch_memory_regions(mem_size,Some(KERNEL_LOAD_ADDR),KERNEL_SIZE,0);
415+
arch_memory_regions(mem_size,Some(KERNEL_LOAD_ADDR),KERNEL_SIZE,0,None);
397416
let gm =GuestMemoryMmap::from_ranges(&arch_mem_regions).unwrap();
398417
configure_system(&gm,&arch_mem_info,GuestAddress(0),0,&None, no_vcpus).unwrap();
399418

400419
// Now assigning some memory that is equal to the start of the 32bit memory hole.
401420
let mem_size =3328 <<20;
402421
let(arch_mem_info, arch_mem_regions) =
403-
arch_memory_regions(mem_size,Some(KERNEL_LOAD_ADDR),KERNEL_SIZE,0);
422+
arch_memory_regions(mem_size,Some(KERNEL_LOAD_ADDR),KERNEL_SIZE,0,None);
404423
let gm =GuestMemoryMmap::from_ranges(&arch_mem_regions).unwrap();
405424
configure_system(&gm,&arch_mem_info,GuestAddress(0),0,&None, no_vcpus).unwrap();
406425

407426
// Now assigning some memory that falls after the 32bit memory hole.
408427
let mem_size =3330 <<20;
409428
let(arch_mem_info, arch_mem_regions) =
410-
arch_memory_regions(mem_size,Some(KERNEL_LOAD_ADDR),KERNEL_SIZE,0);
429+
arch_memory_regions(mem_size,Some(KERNEL_LOAD_ADDR),KERNEL_SIZE,0,None);
411430
let gm =GuestMemoryMmap::from_ranges(&arch_mem_regions).unwrap();
412431
configure_system(&gm,&arch_mem_info,GuestAddress(0),0,&None, no_vcpus).unwrap();
413432
}

‎src/libkrun/src/lib.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use vmm::resources::{ConsoleConfig, ConsoleType, VmResources};
4343
use vmm::vmm_config::block::{BlockDeviceConfig,BlockRootConfig};
4444
#[cfg(not(feature ="tee"))]
4545
use vmm::vmm_config::external_kernel::{ExternalKernel,KernelFormat};
46+
#[cfg(not(feature ="tee"))]
4647
use vmm::vmm_config::firmware::FirmwareConfig;
4748
#[cfg(not(feature ="tee"))]
4849
use vmm::vmm_config::fs::FsDeviceConfig;

‎src/vmm/src/builder.rs‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -798,13 +798,16 @@ pub fn build_microvm(
798798
Some(intc.clone()),
799799
)?;
800800

801+
let kernel_boot = vm_resources.firmware_config.is_none() && !cfg!(feature ="tee");
802+
801803
vcpus =create_vcpus_x86_64(
802804
&vm,
803805
&vcpu_config,
804806
&guest_memory,
805807
payload_config.entry_addr,
806808
&pio_device_manager.io_bus,
807809
&exit_evt,
810+
kernel_boot,
808811
#[cfg(feature ="tee")]
809812
_sender,
810813
)
@@ -1393,10 +1396,10 @@ fn create_guest_memory(
13931396
}else{
13941397
returnErr(StartMicrovmError::MissingKernelConfig);
13951398
};
1396-
arch::arch_memory_regions(mem_size,Some(kernel_guest_addr), kernel_size,0)
1399+
arch::arch_memory_regions(mem_size,Some(kernel_guest_addr), kernel_size,0,None)
13971400
}
13981401
Payload::ExternalKernel(external_kernel) =>{
1399-
arch::arch_memory_regions(mem_size,None,0, external_kernel.initramfs_size)
1402+
arch::arch_memory_regions(mem_size,None,0, external_kernel.initramfs_size,None)
14001403
}
14011404
#[cfg(feature ="tee")]
14021405
Payload::Tee =>{
@@ -1406,11 +1409,11 @@ fn create_guest_memory(
14061409
}else{
14071410
returnErr(StartMicrovmError::MissingKernelConfig);
14081411
};
1409-
arch::arch_memory_regions(mem_size,Some(kernel_guest_addr), kernel_size,0)
1412+
arch::arch_memory_regions(mem_size,Some(kernel_guest_addr), kernel_size,0,None)
14101413
}
14111414
#[cfg(test)]
1412-
Payload::Empty => arch::arch_memory_regions(mem_size,None,0,0),
1413-
Payload::Firmware =>unreachable!(),
1415+
Payload::Empty => arch::arch_memory_regions(mem_size,None,0,0,None),
1416+
Payload::Firmware =>arch::arch_memory_regions(mem_size,None,0,0, firmware_size),
14141417
};
14151418
#[cfg(any(target_arch ="aarch64", target_arch ="riscv64"))]
14161419
let(arch_mem_info,mut arch_mem_regions) =match payload{
@@ -1651,13 +1654,15 @@ fn attach_legacy_devices(
16511654
}
16521655

16531656
#[cfg(target_arch ="x86_64")]
1657+
#[allow(clippy::too_many_arguments)]
16541658
fncreate_vcpus_x86_64(
16551659
vm:&Vm,
16561660
vcpu_config:&VcpuConfig,
16571661
guest_mem:&GuestMemoryMmap,
16581662
entry_addr:GuestAddress,
16591663
io_bus:&devices::Bus,
16601664
exit_evt:&EventFd,
1665+
kernel_boot:bool,
16611666
#[cfg(feature ="tee")]pm_sender:Sender<WorkerMessage>,
16621667
) ->super::Result<Vec<Vcpu>>{
16631668
letmut vcpus =Vec::with_capacity(vcpu_config.vcpu_countasusize);
@@ -1674,7 +1679,7 @@ fn create_vcpus_x86_64(
16741679
)
16751680
.map_err(Error::Vcpu)?;
16761681

1677-
vcpu.configure_x86_64(guest_mem, entry_addr, vcpu_config)
1682+
vcpu.configure_x86_64(guest_mem, entry_addr, vcpu_config, kernel_boot)
16781683
.map_err(Error::Vcpu)?;
16791684

16801685
vcpus.push(vcpu);
@@ -2196,6 +2201,7 @@ pub mod tests {
21962201
entry_addr,
21972202
&bus,
21982203
&EventFd::new(utils::eventfd::EFD_NONBLOCK).unwrap(),
2204+
true,
21992205
)
22002206
.unwrap();
22012207
assert_eq!(vcpu_vec.len(), vcpu_countasusize);

‎src/vmm/src/linux/vstate.rs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,6 +1153,7 @@ impl Vcpu {
11531153
guest_mem:&GuestMemoryMmap,
11541154
kernel_start_addr:GuestAddress,
11551155
vcpu_config:&VcpuConfig,
1156+
kernel_boot:bool,
11561157
) ->Result<()>{
11571158
let cpuid_vm_spec =VmSpec::new(self.id, vcpu_config.vcpu_count, vcpu_config.ht_enabled)
11581159
.map_err(Error::CpuId)?;
@@ -1177,8 +1178,7 @@ impl Vcpu {
11771178
.set_cpuid2(&self.cpuid)
11781179
.map_err(Error::VcpuSetCpuid)?;
11791180

1180-
#[cfg(not(feature ="tdx"))]
1181-
{
1181+
if kernel_boot{
11821182
arch::x86_64::msr::setup_msrs(&self.fd).map_err(Error::MSRSConfiguration)?;
11831183
arch::x86_64::regs::setup_regs(&self.fd, kernel_start_addr.raw_value(),self.id)
11841184
.map_err(Error::REGSConfiguration)?;
@@ -1874,19 +1874,19 @@ mod tests {
18741874
};
18751875

18761876
assert!(vcpu
1877-
.configure_x86_64(&vm_mem,GuestAddress(0),&vcpu_config)
1877+
.configure_x86_64(&vm_mem,GuestAddress(0),&vcpu_config,true)
18781878
.is_ok());
18791879

18801880
// Test configure while using the T2 template.
18811881
vcpu_config.cpu_template =Some(CpuFeaturesTemplate::T2);
18821882
assert!(vcpu
1883-
.configure_x86_64(&vm_mem,GuestAddress(0),&vcpu_config)
1883+
.configure_x86_64(&vm_mem,GuestAddress(0),&vcpu_config,true)
18841884
.is_ok());
18851885

18861886
// Test configure while using the C3 template.
18871887
vcpu_config.cpu_template =Some(CpuFeaturesTemplate::C3);
18881888
assert!(vcpu
1889-
.configure_x86_64(&vm_mem,GuestAddress(0),&vcpu_config)
1889+
.configure_x86_64(&vm_mem,GuestAddress(0),&vcpu_config,true)
18901890
.is_ok());
18911891
}
18921892

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp