mirror of
https://github.com/google/alioth.git
synced 2024-11-24 04:09:36 +00:00
build(deps): bump zerocopy from 0.7.35 to 0.8.5
Bumps [zerocopy](https://github.com/google/zerocopy) from 0.7.35 to 0.8.5. - [Release notes](https://github.com/google/zerocopy/releases) - [Changelog](https://github.com/google/zerocopy/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/zerocopy/compare/v0.7.35...v0.8.5) --- updated-dependencies: - dependency-name: zerocopy dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Changyuan Lyu <changyuanl@google.com>
This commit is contained in:
parent
8d89963dfa
commit
0ce7db8610
29 changed files with 236 additions and 213 deletions
15
Cargo.lock
generated
15
Cargo.lock
generated
|
@ -145,12 +145,6 @@ version = "3.16.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.104"
|
||||
|
@ -785,19 +779,18 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
|||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
checksum = "6129d25825e874589a0e529175dd060c13dab4f3d960c6a0b711e5535b598bb2"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
checksum = "d917df3784b4e2f5deb708d14623b2c02833890e1aa7a5dd1088998e8e9402b1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
|
@ -11,7 +11,7 @@ license.workspace = true
|
|||
test-hv = []
|
||||
|
||||
[dependencies]
|
||||
zerocopy = { version = "0.7.32", features = ["derive", "alloc"] }
|
||||
zerocopy = { version = "0.8.5", features = ["derive", "alloc"] }
|
||||
bitflags = "2.4.0"
|
||||
bitfield = "0.17.0"
|
||||
log = "0.4"
|
||||
|
|
|
@ -22,7 +22,7 @@ use std::sync::Arc;
|
|||
|
||||
use parking_lot::Mutex;
|
||||
use snafu::ResultExt;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::arch::cpuid::CpuidIn;
|
||||
use crate::arch::layout::{
|
||||
|
@ -34,7 +34,7 @@ use crate::arch::reg::{Reg, SegAccess, SegReg, SegRegVal};
|
|||
use crate::arch::sev::SnpPageType;
|
||||
use crate::board::{error, Board, BoardConfig, Result, VcpuGuard, PCIE_MMIO_64_SIZE};
|
||||
use crate::firmware::acpi::bindings::{
|
||||
AcpiTableFadt, AcpiTableHeader, AcpiTableRsdp, AcpiTableXsdt,
|
||||
AcpiTableFadt, AcpiTableHeader, AcpiTableRsdp, AcpiTableXsdt3,
|
||||
};
|
||||
use crate::firmware::acpi::reg::{FadtReset, FadtSleepControl};
|
||||
use crate::firmware::acpi::{
|
||||
|
@ -130,7 +130,7 @@ where
|
|||
let mut cpuid_table = SnpCpuidInfo::new_zeroed();
|
||||
let ram_bus = self.memory.ram_bus();
|
||||
let ram = ram_bus.lock_layout();
|
||||
let desc = SevMetadataDesc::read_from_prefix(&fw_range[offset..]).unwrap();
|
||||
let (desc, _) = SevMetadataDesc::read_from_prefix(&fw_range[offset..]).unwrap();
|
||||
let snp_page_type = match desc.type_ {
|
||||
SEV_DESC_TYPE_SNP_SEC_MEM => SnpPageType::Unmeasured,
|
||||
SEV_DESC_TYPE_SNP_SECRETS => SnpPageType::Secrets,
|
||||
|
@ -183,7 +183,8 @@ where
|
|||
let metadata_offset_r: u32 =
|
||||
parse_data_from_fw(fw_range, &SEV_METADATA_GUID).unwrap();
|
||||
let metadata_offset = fw_range.len() - metadata_offset_r as usize;
|
||||
let metadata = SevMetaData::read_from_prefix(&fw_range[metadata_offset..]).unwrap();
|
||||
let (metadata, _) =
|
||||
SevMetaData::read_from_prefix(&fw_range[metadata_offset..]).unwrap();
|
||||
let desc_offset = metadata_offset + size_of::<SevMetaData>();
|
||||
for i in 0..metadata.num_desc as usize {
|
||||
let offset = desc_offset + i * size_of::<SevMetadataDesc>();
|
||||
|
@ -355,7 +356,7 @@ where
|
|||
let mut pointers = vec![];
|
||||
let mut checksums = vec![];
|
||||
|
||||
let mut xsdt: AcpiTableXsdt<3> = FromZeroes::new_zeroed();
|
||||
let mut xsdt: AcpiTableXsdt3 = AcpiTableXsdt3::new_zeroed();
|
||||
let offset_xsdt = 0;
|
||||
table_bytes.extend(xsdt.as_bytes());
|
||||
|
||||
|
@ -389,9 +390,9 @@ where
|
|||
debug_assert_eq!(offset_xsdt % 4, 0);
|
||||
let xsdt_entries = [offset_fadt as u64, offset_madt as u64, offset_mcfg as u64];
|
||||
xsdt = create_xsdt(xsdt_entries);
|
||||
xsdt.write_to_prefix(&mut table_bytes);
|
||||
xsdt.write_to_prefix(&mut table_bytes).unwrap();
|
||||
for index in 0..xsdt_entries.len() {
|
||||
pointers.push(offset_xsdt + offset_of!(AcpiTableXsdt<3>, entries) + index * 8);
|
||||
pointers.push(offset_xsdt + offset_of!(AcpiTableXsdt3, entries) + index * 8);
|
||||
}
|
||||
checksums.push((offset_xsdt, size_of_val(&xsdt)));
|
||||
|
||||
|
@ -481,7 +482,7 @@ const SEV_METADATA_GUID: [u8; GUID_SIZE] = [
|
|||
0x66, 0x65, 0x88, 0xdc, 0x4a, 0x98, 0x98, 0x47, 0xA7, 0x5e, 0x55, 0x85, 0xa7, 0xbf, 0x67, 0xcc,
|
||||
];
|
||||
|
||||
#[derive(Debug, FromZeroes, FromBytes, AsBytes)]
|
||||
#[derive(Debug, FromBytes, IntoBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
struct SevMetaData {
|
||||
signature: u32,
|
||||
|
@ -494,7 +495,7 @@ pub const SEV_DESC_TYPE_SNP_SEC_MEM: u32 = 1;
|
|||
pub const SEV_DESC_TYPE_SNP_SECRETS: u32 = 2;
|
||||
pub const SEV_DESC_TYPE_CPUID: u32 = 3;
|
||||
|
||||
#[derive(Debug, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, FromBytes, IntoBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
|
||||
struct SevMetadataDesc {
|
||||
|
@ -512,9 +513,9 @@ where
|
|||
return None;
|
||||
}
|
||||
let offset_table_len = offset_table_footer.checked_sub(size_of::<u16>())?;
|
||||
let table_len = u16::read_from_prefix(&blob[offset_table_len..])? as usize;
|
||||
let (table_len, _) = u16::read_from_prefix(&blob[offset_table_len..]).ok()?;
|
||||
let offset_table_end = offset_table_len.checked_sub(
|
||||
table_len
|
||||
(table_len as usize)
|
||||
.checked_sub(size_of::<u16>())?
|
||||
.checked_sub(GUID_SIZE)?,
|
||||
)?;
|
||||
|
@ -522,16 +523,18 @@ where
|
|||
while current > offset_table_end {
|
||||
let offset_len = current.checked_sub(GUID_SIZE + size_of::<u16>())?;
|
||||
if blob[(offset_len + 2)..].starts_with(guid) {
|
||||
return T::read_from_prefix(&blob[offset_len.checked_sub(size_of::<T>())?..]);
|
||||
return T::read_from_prefix(&blob[offset_len.checked_sub(size_of::<T>())?..])
|
||||
.map(|(n, _)| n)
|
||||
.ok();
|
||||
}
|
||||
let table_len = u16::read_from_prefix(&blob[offset_len..])? as usize;
|
||||
current = current.checked_sub(table_len)?;
|
||||
let (table_len, _) = u16::read_from_prefix(&blob[offset_len..]).ok()?;
|
||||
current = current.checked_sub(table_len as usize)?;
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, FromZeroes, FromBytes, AsBytes)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, FromBytes, IntoBytes, Immutable)]
|
||||
pub struct SnpCpuidFunc {
|
||||
pub eax_in: u32,
|
||||
pub ecx_in: u32,
|
||||
|
@ -545,7 +548,7 @@ pub struct SnpCpuidFunc {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Clone, FromZeroes, FromBytes, AsBytes)]
|
||||
#[derive(Debug, Clone, FromBytes, IntoBytes, Immutable)]
|
||||
pub struct SnpCpuidInfo {
|
||||
pub count: u32,
|
||||
pub _reserved1: u32,
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
use std::mem::{offset_of, size_of};
|
||||
|
||||
use zerocopy::AsBytes;
|
||||
use zerocopy::{Immutable, IntoBytes};
|
||||
|
||||
use crate::device::fw_cfg::{create_file_name, FwCfgContent, FwCfgItem, FILE_NAME_SIZE};
|
||||
use crate::firmware::acpi::bindings::{AcpiTableHeader, AcpiTableRsdp};
|
||||
|
@ -32,7 +32,7 @@ pub const FW_CFG_FILENAME_RSDP: &str = "acpi/rsdp";
|
|||
pub const FW_CFG_FILENAME_ACPI_TABLES: &str = "acpi/tables";
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, AsBytes)]
|
||||
#[derive(Debug, IntoBytes, Immutable)]
|
||||
pub struct Allocate {
|
||||
command: u32,
|
||||
file: [u8; FILE_NAME_SIZE],
|
||||
|
@ -42,7 +42,7 @@ pub struct Allocate {
|
|||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, AsBytes)]
|
||||
#[derive(Debug, IntoBytes, Immutable)]
|
||||
pub struct AddPointer {
|
||||
command: u32,
|
||||
dst: [u8; FILE_NAME_SIZE],
|
||||
|
@ -53,7 +53,7 @@ pub struct AddPointer {
|
|||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, AsBytes)]
|
||||
#[derive(Debug, IntoBytes, Immutable)]
|
||||
pub struct AddChecksum {
|
||||
command: u32,
|
||||
file: [u8; FILE_NAME_SIZE],
|
||||
|
|
|
@ -32,7 +32,7 @@ use parking_lot::Mutex;
|
|||
use serde::de::{self, MapAccess, Visitor};
|
||||
use serde::{Deserialize, Deserializer};
|
||||
use serde_aco::Help;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes};
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
use crate::arch::layout::{
|
||||
|
@ -175,7 +175,7 @@ pub struct FwCfg {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, AsBytes, FromBytes, FromZeroes, Layout)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable, Layout)]
|
||||
struct FwCfgDmaAccess {
|
||||
control_be: u32,
|
||||
length_be: u32,
|
||||
|
@ -194,13 +194,13 @@ bitfield! {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, AsBytes)]
|
||||
#[derive(Debug, IntoBytes, Immutable)]
|
||||
struct FwCfgFilesHeader {
|
||||
count_be: u32,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, AsBytes)]
|
||||
#[derive(Debug, IntoBytes, Immutable)]
|
||||
struct FwCfgFile {
|
||||
size_be: u32,
|
||||
select_be: u16,
|
||||
|
@ -281,8 +281,8 @@ impl FwCfg {
|
|||
#[cfg(target_arch = "x86_64")]
|
||||
pub fn add_kernel_data(&mut self, file: File) -> Result<()> {
|
||||
let mut buffer = vec![0u8; size_of::<BootParams>()];
|
||||
file.read_exact_at(buffer.as_bytes_mut(), 0)?;
|
||||
let bp = BootParams::mut_from(&mut buffer).unwrap();
|
||||
file.read_exact_at(&mut buffer, 0)?;
|
||||
let bp = BootParams::mut_from_bytes(&mut buffer).unwrap();
|
||||
if bp.hdr.setup_sects == 0 {
|
||||
bp.hdr.setup_sects = 4;
|
||||
}
|
||||
|
|
|
@ -17,28 +17,24 @@ pub mod reg;
|
|||
|
||||
use std::mem::{offset_of, size_of};
|
||||
|
||||
use zerocopy::{transmute, AsBytes, FromBytes};
|
||||
use zerocopy::{transmute, FromBytes, IntoBytes};
|
||||
|
||||
use crate::arch::layout::PCIE_CONFIG_START;
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
use crate::arch::layout::{
|
||||
APIC_START, IOAPIC_START, PORT_ACPI_RESET, PORT_ACPI_SLEEP_CONTROL, PORT_ACPI_SLEEP_STATUS,
|
||||
};
|
||||
use crate::unsafe_impl_zerocopy;
|
||||
use crate::utils::wrapping_sum;
|
||||
|
||||
use bindings::{
|
||||
AcpiGenericAddress, AcpiMadtIoApic, AcpiMadtLocalX2apic, AcpiMcfgAllocation,
|
||||
AcpiSubtableHeader, AcpiTableFadt, AcpiTableHeader, AcpiTableMadt, AcpiTableMcfg,
|
||||
AcpiTableRsdp, AcpiTableXsdt, FADT_MAJOR_VERSION, FADT_MINOR_VERSION, MADT_IO_APIC,
|
||||
AcpiSubtableHeader, AcpiTableFadt, AcpiTableHeader, AcpiTableMadt, AcpiTableMcfg1,
|
||||
AcpiTableRsdp, AcpiTableXsdt3, FADT_MAJOR_VERSION, FADT_MINOR_VERSION, MADT_IO_APIC,
|
||||
MADT_LOCAL_X2APIC, MADT_REVISION, MCFG_REVISION, RSDP_REVISION, SIG_FADT, SIG_MADT, SIG_MCFG,
|
||||
SIG_RSDP, SIG_XSDT, XSDT_REVISION,
|
||||
};
|
||||
use reg::FADT_RESET_VAL;
|
||||
|
||||
unsafe_impl_zerocopy!(AcpiTableMcfg<1>, FromBytes, FromZeroes, AsBytes);
|
||||
unsafe_impl_zerocopy!(AcpiTableXsdt<3>, FromBytes, FromZeroes, AsBytes);
|
||||
|
||||
const OEM_ID: [u8; 6] = *b"ALIOTH";
|
||||
|
||||
fn default_header() -> AcpiTableHeader {
|
||||
|
@ -66,10 +62,10 @@ pub fn create_rsdp(xsdt_addr: u64) -> AcpiTableRsdp {
|
|||
}
|
||||
|
||||
// https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/05_ACPI_Software_Programming_Model/ACPI_Software_Programming_Model.html#extended-system-description-table-fields-xsdt
|
||||
pub fn create_xsdt<const N: usize>(entries: [u64; N]) -> AcpiTableXsdt<N> {
|
||||
let total_length = size_of::<AcpiTableHeader>() + size_of::<u64>() * N;
|
||||
pub fn create_xsdt(entries: [u64; 3]) -> AcpiTableXsdt3 {
|
||||
let total_length = size_of::<AcpiTableHeader>() + size_of::<u64>() * 3;
|
||||
let entries = entries.map(|e| transmute!(e));
|
||||
AcpiTableXsdt {
|
||||
AcpiTableXsdt3 {
|
||||
header: AcpiTableHeader {
|
||||
signature: SIG_XSDT,
|
||||
length: total_length as u32,
|
||||
|
@ -171,11 +167,11 @@ pub fn create_madt(num_cpu: u32) -> (AcpiTableMadt, AcpiMadtIoApic, Vec<AcpiMadt
|
|||
(madt, io_apic, x2apics)
|
||||
}
|
||||
|
||||
pub fn create_mcfg() -> AcpiTableMcfg<1> {
|
||||
let mut mcfg = AcpiTableMcfg {
|
||||
pub fn create_mcfg() -> AcpiTableMcfg1 {
|
||||
let mut mcfg = AcpiTableMcfg1 {
|
||||
header: AcpiTableHeader {
|
||||
signature: SIG_MCFG,
|
||||
length: size_of::<AcpiTableMcfg<1>>() as u32,
|
||||
length: size_of::<AcpiTableMcfg1>() as u32,
|
||||
revision: MCFG_REVISION,
|
||||
..default_header()
|
||||
},
|
||||
|
@ -210,9 +206,9 @@ impl AcpiTable {
|
|||
self.rsdp.extended_checksum = self.rsdp.extended_checksum.wrapping_sub(ext_sum);
|
||||
|
||||
for pointer in self.table_pointers.iter() {
|
||||
let old_val: u64 = FromBytes::read_from_prefix(&self.tables[*pointer..]).unwrap();
|
||||
let (old_val, _) = u64::read_from_prefix(&self.tables[*pointer..]).unwrap();
|
||||
let new_val = old_val.wrapping_sub(old_addr).wrapping_add(table_addr);
|
||||
AsBytes::write_to_prefix(&new_val, &mut self.tables[*pointer..]).unwrap();
|
||||
IntoBytes::write_to_prefix(&new_val, &mut self.tables[*pointer..]).unwrap();
|
||||
}
|
||||
|
||||
for (start, len) in self.table_checksums.iter() {
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// limitations under the License.
|
||||
|
||||
use bitfield::bitfield;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes};
|
||||
|
||||
pub const SIG_RSDP: [u8; 8] = *b"RSD PTR ";
|
||||
pub const SIG_XSDT: [u8; 4] = *b"XSDT";
|
||||
|
@ -26,7 +26,7 @@ pub const SIG_DSDT: [u8; 4] = *b"DSDT";
|
|||
pub const RSDP_REVISION: u8 = 2;
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, Default, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiTableRsdp {
|
||||
pub signature: [u8; 8],
|
||||
pub checksum: u8,
|
||||
|
@ -40,7 +40,7 @@ pub struct AcpiTableRsdp {
|
|||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, Default, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiTableHeader {
|
||||
pub signature: [u8; 4],
|
||||
pub length: u32,
|
||||
|
@ -55,15 +55,22 @@ pub struct AcpiTableHeader {
|
|||
|
||||
pub const XSDT_REVISION: u8 = 1;
|
||||
|
||||
#[derive(Debug, FromBytes)]
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct AcpiTableXsdt<const N: usize> {
|
||||
pub header: AcpiTableHeader,
|
||||
pub entries: [[u32; 2]; N],
|
||||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, AsBytes, Default, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiTableXsdt3 {
|
||||
pub header: AcpiTableHeader,
|
||||
pub entries: [[u32; 2]; 3],
|
||||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiGenericAddress {
|
||||
pub space_id: u8,
|
||||
pub bit_width: u8,
|
||||
|
@ -76,7 +83,7 @@ pub const FADT_MAJOR_VERSION: u8 = 6;
|
|||
pub const FADT_MINOR_VERSION: u8 = 4;
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, Default, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiTableFadt {
|
||||
pub header: AcpiTableHeader,
|
||||
pub facs: u32,
|
||||
|
@ -141,7 +148,7 @@ pub struct AcpiTableFadt {
|
|||
pub const MADT_REVISION: u8 = 6;
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, Default, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiTableMadt {
|
||||
pub header: AcpiTableHeader,
|
||||
pub address: u32,
|
||||
|
@ -152,14 +159,14 @@ pub const MADT_IO_APIC: u8 = 1;
|
|||
pub const MADT_LOCAL_X2APIC: u8 = 9;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Clone, AsBytes, Default, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiSubtableHeader {
|
||||
pub type_: u8,
|
||||
pub length: u8,
|
||||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, AsBytes, Default, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiMadtLocalX2apic {
|
||||
pub header: AcpiSubtableHeader,
|
||||
pub reserved: u16,
|
||||
|
@ -169,7 +176,7 @@ pub struct AcpiMadtLocalX2apic {
|
|||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, AsBytes, Default, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiMadtIoApic {
|
||||
pub header: AcpiSubtableHeader,
|
||||
pub id: u8,
|
||||
|
@ -179,7 +186,7 @@ pub struct AcpiMadtIoApic {
|
|||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, AsBytes, Default, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiMcfgAllocation {
|
||||
pub address: [u32; 2],
|
||||
pub pci_segment: u16,
|
||||
|
@ -198,6 +205,22 @@ pub struct AcpiTableMcfg<const N: usize> {
|
|||
pub allocations: [AcpiMcfgAllocation; N],
|
||||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiTableMcfg1 {
|
||||
pub header: AcpiTableHeader,
|
||||
pub reserved: [u8; 8],
|
||||
pub allocations: [AcpiMcfgAllocation; 1],
|
||||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct AcpiTableMcfg3 {
|
||||
pub header: AcpiTableHeader,
|
||||
pub reserved: [u8; 8],
|
||||
pub allocations: [AcpiMcfgAllocation; 3],
|
||||
}
|
||||
|
||||
bitfield! {
|
||||
/// Sleep Control Register
|
||||
///
|
||||
|
@ -219,7 +242,7 @@ mod test {
|
|||
|
||||
use super::{
|
||||
AcpiGenericAddress, AcpiMadtIoApic, AcpiMadtLocalX2apic, AcpiMcfgAllocation, AcpiTableFadt,
|
||||
AcpiTableHeader, AcpiTableMadt, AcpiTableMcfg, AcpiTableRsdp, AcpiTableXsdt,
|
||||
AcpiTableHeader, AcpiTableMadt, AcpiTableMcfg1, AcpiTableRsdp, AcpiTableXsdt,
|
||||
};
|
||||
|
||||
#[test]
|
||||
|
@ -232,7 +255,7 @@ mod test {
|
|||
assert_eq!(size_of::<AcpiMadtIoApic>(), 12);
|
||||
assert_eq!(size_of::<AcpiMadtLocalX2apic>(), 16);
|
||||
assert_eq!(size_of::<AcpiMcfgAllocation>(), 16);
|
||||
assert_eq!(size_of::<AcpiTableMcfg<1>>(), 60);
|
||||
assert_eq!(size_of::<AcpiTableMcfg1>(), 60);
|
||||
assert_eq!(size_of::<AcpiTableXsdt<0>>(), 36);
|
||||
assert_eq!(size_of::<AcpiTableXsdt<4>>(), 36 + 4 * 8);
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
use std::collections::HashMap;
|
||||
use std::mem::size_of;
|
||||
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::align_up;
|
||||
use crate::firmware::dt::{DeviceTree, Node, PropVal};
|
||||
|
@ -77,7 +77,7 @@ impl PropVal {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(AsBytes, FromBytes, FromZeroes, Debug)]
|
||||
#[derive(IntoBytes, FromBytes, Immutable, Debug)]
|
||||
pub struct FdtHeader {
|
||||
magic: Bu32,
|
||||
total_size: Bu32,
|
||||
|
@ -91,14 +91,14 @@ pub struct FdtHeader {
|
|||
size_dt_struct: Bu32,
|
||||
}
|
||||
|
||||
#[derive(AsBytes, FromBytes, FromZeroes, Debug)]
|
||||
#[derive(IntoBytes, FromBytes, Immutable, Debug)]
|
||||
#[repr(C)]
|
||||
pub struct FdtProp {
|
||||
len: Bu32,
|
||||
name_off: Bu32,
|
||||
}
|
||||
|
||||
#[derive(AsBytes, FromBytes, FromZeroes, Debug)]
|
||||
#[derive(IntoBytes, FromBytes, Immutable, Debug)]
|
||||
#[repr(C)]
|
||||
struct FdtReserveEntry {
|
||||
address: Bu64,
|
||||
|
@ -199,7 +199,7 @@ impl DeviceTree {
|
|||
size_dt_strings: Bu32::from(size_dt_strings as u32),
|
||||
size_dt_struct: Bu32::from(size_dt_struct as u32),
|
||||
};
|
||||
header.write_to_prefix(&mut data);
|
||||
header.write_to_prefix(&mut data).unwrap();
|
||||
data
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,14 +12,14 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, IntoBytes, KnownLayout};
|
||||
|
||||
pub const ELF_HEADER_MAGIC: [u8; 4] = *b"\x7fELF";
|
||||
pub const ELF_IDENT_CLASS_64: u8 = 2;
|
||||
pub const ELF_IDENT_LITTLE_ENDIAN: u8 = 1;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, IntoBytes)]
|
||||
pub struct Elf64Header {
|
||||
pub ident_magic: [u8; 4],
|
||||
pub ident_class: u8,
|
||||
|
@ -43,7 +43,7 @@ pub struct Elf64Header {
|
|||
pub sh_str_ndx: u16,
|
||||
}
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, IntoBytes, KnownLayout)]
|
||||
pub struct Elf64ProgramHeader {
|
||||
pub type_: u32,
|
||||
pub flags: u32,
|
||||
|
@ -58,7 +58,7 @@ pub struct Elf64ProgramHeader {
|
|||
pub const SHT_NOTE: u32 = 7;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, IntoBytes)]
|
||||
pub struct Elf64SectionHeader {
|
||||
pub name: u32,
|
||||
pub type_: u32,
|
||||
|
@ -76,7 +76,7 @@ pub const PT_LOAD: u32 = 1;
|
|||
pub const PT_NOTE: u32 = 4;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, IntoBytes)]
|
||||
pub struct Elf64Note {
|
||||
pub name_sz: u32,
|
||||
pub desc_sz: u32,
|
||||
|
|
|
@ -17,7 +17,7 @@ use std::io::{BufReader, Read, Seek, SeekFrom};
|
|||
use std::path::Path;
|
||||
|
||||
use snafu::ResultExt;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::arch::layout::{DEVICE_TREE_START, KERNEL_IMAGE_START};
|
||||
use crate::arch::reg::{Pstate, Reg};
|
||||
|
@ -26,7 +26,7 @@ use crate::mem::mapped::RamBus;
|
|||
use crate::mem::MemRegionEntry;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, FromBytes, Immutable, IntoBytes)]
|
||||
struct ImageHeader {
|
||||
code0: u32,
|
||||
code1: u32,
|
||||
|
@ -57,7 +57,7 @@ pub fn load<P: AsRef<Path>>(
|
|||
let mut kernel = BufReader::new(kernel);
|
||||
let mut header = ImageHeader::new_zeroed();
|
||||
kernel
|
||||
.read_exact(header.as_bytes_mut())
|
||||
.read_exact(header.as_mut_bytes())
|
||||
.context(access_kernel)?;
|
||||
if header.magic != IMAGE_MAGIC {
|
||||
return error::MissingMagic {
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// limitations under the License.
|
||||
|
||||
use bitflags::bitflags;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
|
||||
|
||||
pub const MAGIC_AA55: u16 = 0xaa55;
|
||||
pub const MAGIC_HDRS: u32 = 0x53726448; // "HdrS"
|
||||
|
@ -45,7 +45,7 @@ bitflags! {
|
|||
}
|
||||
|
||||
#[repr(C, packed)]
|
||||
#[derive(Debug, Copy, Clone, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Copy, Clone, IntoBytes, FromBytes, Immutable)]
|
||||
pub struct SetupHeader {
|
||||
pub setup_sects: u8,
|
||||
pub root_flags: u16,
|
||||
|
@ -97,7 +97,7 @@ pub const E820_PMEM: u32 = 7;
|
|||
pub const E820_RESERVED_KERN: u32 = 128;
|
||||
|
||||
#[repr(C, packed)]
|
||||
#[derive(Debug, Copy, Clone, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Copy, Clone, IntoBytes, FromBytes, Immutable)]
|
||||
pub struct BootE820Entry {
|
||||
pub addr: u64,
|
||||
pub size: u64,
|
||||
|
@ -105,7 +105,7 @@ pub struct BootE820Entry {
|
|||
}
|
||||
|
||||
#[repr(C, packed)]
|
||||
#[derive(Debug, Copy, Clone, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Copy, Clone, IntoBytes, FromBytes, Immutable, KnownLayout)]
|
||||
pub struct BootParams {
|
||||
pub screen_info: [u8; 64],
|
||||
pub apm_bios_info: [u8; 20],
|
||||
|
|
|
@ -24,7 +24,7 @@ use crate::arch::reg::{
|
|||
};
|
||||
use crate::mem::mapped::RamBus;
|
||||
use snafu::ResultExt;
|
||||
use zerocopy::{AsBytes, FromZeroes};
|
||||
use zerocopy::{FromZeros, IntoBytes};
|
||||
|
||||
use crate::arch::layout::{
|
||||
BOOT_GDT_START, BOOT_PAGING_START, EBDA_START, KERNEL_CMD_LINE_LIMIT, KERNEL_CMD_LINE_START,
|
||||
|
@ -60,7 +60,7 @@ pub fn load<P: AsRef<Path>>(
|
|||
.seek(SeekFrom::Start(SETUP_HEADER_OFFSET))
|
||||
.context(access_kernel)?;
|
||||
kernel
|
||||
.read_exact(boot_params.hdr.as_bytes_mut())
|
||||
.read_exact(boot_params.hdr.as_mut_bytes())
|
||||
.context(access_kernel)?;
|
||||
|
||||
// For backwards compatibility, if the setup_sects field contains 0,
|
||||
|
|
|
@ -11,13 +11,13 @@
|
|||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromZeros, Immutable, IntoBytes};
|
||||
|
||||
pub const XEN_HVM_START_MAGIC_VALUE: u32 = 0x336ec578;
|
||||
pub const XEN_HVM_START_INFO_V1: u32 = 1;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Clone, Default, AsBytes, FromZeroes, FromBytes)]
|
||||
#[derive(Debug, Clone, Default, IntoBytes, FromZeros, Immutable)]
|
||||
pub struct HvmStartInfo {
|
||||
pub magic: u32,
|
||||
pub version: u32,
|
||||
|
@ -32,7 +32,7 @@ pub struct HvmStartInfo {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Clone, Default, AsBytes, FromZeroes, FromBytes)]
|
||||
#[derive(Debug, Clone, Default, IntoBytes, FromZeros, Immutable)]
|
||||
pub struct HvmModlistEntry {
|
||||
pub paddr: u64,
|
||||
pub size: u64,
|
||||
|
@ -49,7 +49,7 @@ pub const XEN_HVM_MEMMAP_TYPE_DISABLED: u32 = 6;
|
|||
pub const XEN_HVM_MEMMAP_TYPE_PMEM: u32 = 7;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Clone, Default, AsBytes, FromZeroes, FromBytes)]
|
||||
#[derive(Debug, Clone, Default, IntoBytes, FromZeros, Immutable)]
|
||||
pub struct HvmMemmapTableEntry {
|
||||
pub addr: u64,
|
||||
pub size: u64,
|
||||
|
|
|
@ -18,7 +18,7 @@ use std::mem::{offset_of, size_of, size_of_val};
|
|||
use std::path::Path;
|
||||
|
||||
use snafu::ResultExt;
|
||||
use zerocopy::{AsBytes, FromZeroes};
|
||||
use zerocopy::{FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::align_up;
|
||||
use crate::arch::layout::{
|
||||
|
@ -44,7 +44,7 @@ use start_info::{HvmMemmapTableEntry, HvmModlistEntry, HvmStartInfo};
|
|||
pub const XEN_ELFNOTE_PHYS32_ENTRY: u32 = 18;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, AsBytes, Default)]
|
||||
#[derive(Debug, IntoBytes, Default, Immutable)]
|
||||
struct StartInfoPage {
|
||||
start_info: HvmStartInfo,
|
||||
initramfs: HvmModlistEntry,
|
||||
|
@ -61,7 +61,7 @@ fn search_pvh_note<F: Read + Seek>(
|
|||
while pos < size {
|
||||
file.seek(SeekFrom::Start(offset + pos))?;
|
||||
let mut header = Elf64Note::new_zeroed();
|
||||
file.read_exact(header.as_bytes_mut())?;
|
||||
file.read_exact(header.as_mut_bytes())?;
|
||||
pos += size_of::<Elf64Note>() as u64;
|
||||
pos += align_up!(header.desc_sz as u64, align);
|
||||
pos += align_up!(header.name_sz as u64, align);
|
||||
|
@ -74,12 +74,12 @@ fn search_pvh_note<F: Read + Seek>(
|
|||
match header.desc_sz {
|
||||
4 => {
|
||||
let mut entry_point = 0u32;
|
||||
file.read_exact(entry_point.as_bytes_mut())?;
|
||||
file.read_exact(entry_point.as_mut_bytes())?;
|
||||
return Ok(Some(entry_point as u64));
|
||||
}
|
||||
8 => {
|
||||
let mut entry_point = 0u64;
|
||||
file.read_exact(entry_point.as_bytes_mut())?;
|
||||
file.read_exact(entry_point.as_mut_bytes())?;
|
||||
return Ok(Some(entry_point));
|
||||
}
|
||||
_ => {}
|
||||
|
@ -105,7 +105,7 @@ pub fn load<P: AsRef<Path>>(
|
|||
// load kernel
|
||||
let mut elf_header = Elf64Header::new_zeroed();
|
||||
kernel
|
||||
.read_exact(elf_header.as_bytes_mut())
|
||||
.read_exact(elf_header.as_mut_bytes())
|
||||
.context(access_kernel)?;
|
||||
if elf_header.ident_magic != ELF_HEADER_MAGIC {
|
||||
return error::MissingMagic {
|
||||
|
@ -124,9 +124,10 @@ pub fn load<P: AsRef<Path>>(
|
|||
kernel
|
||||
.seek(SeekFrom::Start(elf_header.ph_off))
|
||||
.context(access_kernel)?;
|
||||
let mut program_header = Elf64ProgramHeader::new_vec_zeroed(elf_header.ph_num as usize);
|
||||
let mut program_header =
|
||||
Elf64ProgramHeader::new_vec_zeroed(elf_header.ph_num as usize).unwrap();
|
||||
kernel
|
||||
.read_exact(program_header.as_bytes_mut())
|
||||
.read_exact(program_header.as_mut_bytes())
|
||||
.context(access_kernel)?;
|
||||
for program_header in program_header.iter() {
|
||||
if program_header.type_ == PT_NOTE && pvh_entry.is_none() {
|
||||
|
@ -153,9 +154,9 @@ pub fn load<P: AsRef<Path>>(
|
|||
kernel
|
||||
.seek(SeekFrom::Start(elf_header.sh_off))
|
||||
.context(access_kernel)?;
|
||||
let mut sections = Elf64SectionHeader::new_vec_zeroed(elf_header.sh_num as usize);
|
||||
let mut sections = Elf64SectionHeader::new_vec_zeroed(elf_header.sh_num as usize).unwrap();
|
||||
kernel
|
||||
.read_exact(sections.as_bytes_mut())
|
||||
.read_exact(sections.as_mut_bytes())
|
||||
.context(access_kernel)?;
|
||||
for section in sections.iter() {
|
||||
if section.type_ != SHT_NOTE {
|
||||
|
|
|
@ -68,15 +68,23 @@ macro_rules! impl_mmio_for_zerocopy {
|
|||
}
|
||||
|
||||
fn read(&self, offset: u64, size: u8) -> $crate::mem::Result<u64> {
|
||||
let bytes = AsBytes::as_bytes(self);
|
||||
fn read_from_prefix<T: ::zerocopy::FromBytes + Into<u64>>(
|
||||
bytes: &[u8],
|
||||
) -> ::core::option::Option<u64> {
|
||||
let (n, _) = T::read_from_prefix(bytes).ok()?;
|
||||
Some(n.into())
|
||||
}
|
||||
|
||||
let bytes = ::zerocopy::IntoBytes::as_bytes(self);
|
||||
let offset = offset as usize;
|
||||
let val = match size {
|
||||
1 => bytes.get(offset).map(|b| *b as u64),
|
||||
2 => u16::read_from_prefix(&bytes[offset..]).map(|w| w as u64),
|
||||
4 => u32::read_from_prefix(&bytes[offset..]).map(|d| d as u64),
|
||||
8 => u64::read_from_prefix(&bytes[offset..]),
|
||||
2 => bytes.get(offset..).and_then(read_from_prefix::<u16>),
|
||||
4 => bytes.get(offset..).and_then(read_from_prefix::<u32>),
|
||||
8 => bytes.get(offset..).and_then(read_from_prefix::<u64>),
|
||||
_ => ::core::option::Option::None,
|
||||
};
|
||||
|
||||
if let ::core::option::Option::Some(val) = val {
|
||||
::core::result::Result::Ok(val)
|
||||
} else {
|
||||
|
|
|
@ -33,7 +33,7 @@ use libc::{
|
|||
use libc::{madvise, MADV_HUGEPAGE, MFD_CLOEXEC};
|
||||
use parking_lot::{RwLock, RwLockReadGuard};
|
||||
use snafu::ResultExt;
|
||||
use zerocopy::{AsBytes, FromBytes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes};
|
||||
|
||||
use crate::ffi;
|
||||
use crate::mem::addressable::{Addressable, SlotBackend};
|
||||
|
@ -163,28 +163,28 @@ impl ArcMemPages {
|
|||
T: FromBytes,
|
||||
{
|
||||
let s = self.get_partial_slice(offset, size_of::<T>())?;
|
||||
match FromBytes::read_from(s) {
|
||||
None => error::ExceedsLimit {
|
||||
match FromBytes::read_from_bytes(s) {
|
||||
Err(_) => error::ExceedsLimit {
|
||||
addr: offset as u64,
|
||||
size: size_of::<T>() as u64,
|
||||
}
|
||||
.fail(),
|
||||
Some(v) => Ok(v),
|
||||
Ok(v) => Ok(v),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write<T>(&self, offset: usize, val: &T) -> Result<(), Error>
|
||||
where
|
||||
T: AsBytes,
|
||||
T: IntoBytes + Immutable,
|
||||
{
|
||||
let s = self.get_partial_slice_mut(offset, size_of::<T>())?;
|
||||
match AsBytes::write_to(val, s) {
|
||||
None => error::ExceedsLimit {
|
||||
match IntoBytes::write_to(val, s) {
|
||||
Err(_) => error::ExceedsLimit {
|
||||
addr: offset as u64,
|
||||
size: size_of::<T>() as u64,
|
||||
}
|
||||
.fail(),
|
||||
Some(()) => Ok(()),
|
||||
Ok(()) => Ok(()),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -335,10 +335,10 @@ impl Ram {
|
|||
|
||||
pub fn read<T>(&self, gpa: u64) -> Result<T, Error>
|
||||
where
|
||||
T: FromBytes + AsBytes,
|
||||
T: FromBytes + IntoBytes,
|
||||
{
|
||||
let mut val = T::new_zeroed();
|
||||
let buf = val.as_bytes_mut();
|
||||
let buf = val.as_mut_bytes();
|
||||
let host_ref = self.get_partial_slice(gpa, size_of::<T>() as u64)?;
|
||||
if host_ref.len() == buf.len() {
|
||||
buf.copy_from_slice(host_ref);
|
||||
|
@ -357,7 +357,7 @@ impl Ram {
|
|||
|
||||
pub fn write<T>(&self, gpa: u64, val: &T) -> Result<(), Error>
|
||||
where
|
||||
T: AsBytes,
|
||||
T: IntoBytes + Immutable,
|
||||
{
|
||||
let buf = val.as_bytes();
|
||||
let host_ref = self.get_partial_slice_mut(gpa, size_of::<T>() as u64)?;
|
||||
|
@ -438,7 +438,7 @@ impl RamBus {
|
|||
|
||||
pub fn read<T>(&self, gpa: u64) -> Result<T, Error>
|
||||
where
|
||||
T: FromBytes + AsBytes,
|
||||
T: FromBytes + IntoBytes,
|
||||
{
|
||||
let ram = self.ram.read();
|
||||
ram.read(gpa)
|
||||
|
@ -446,7 +446,7 @@ impl RamBus {
|
|||
|
||||
pub fn write<T>(&self, gpa: u64, val: &T) -> Result<(), Error>
|
||||
where
|
||||
T: AsBytes,
|
||||
T: IntoBytes + Immutable,
|
||||
{
|
||||
let ram = self.ram.read();
|
||||
ram.write(gpa, val)
|
||||
|
@ -504,11 +504,11 @@ mod test {
|
|||
use std::mem::size_of;
|
||||
|
||||
use libc::{PROT_READ, PROT_WRITE};
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes};
|
||||
|
||||
use super::{ArcMemPages, RamBus};
|
||||
|
||||
#[derive(Debug, AsBytes, FromBytes, FromZeroes, PartialEq, Eq)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable, PartialEq, Eq)]
|
||||
#[repr(C)]
|
||||
struct MyStruct {
|
||||
data: [u32; 8],
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
use serde::de::{self, Visitor};
|
||||
use serde::Deserialize;
|
||||
use serde_aco::{Help, TypedHelp};
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes};
|
||||
|
||||
#[derive(Debug, Default, FromBytes, FromZeroes, AsBytes, PartialEq, Eq)]
|
||||
#[derive(Debug, Default, FromBytes, Immutable, IntoBytes, PartialEq, Eq)]
|
||||
#[repr(transparent)]
|
||||
pub struct MacAddr([u8; 6]);
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ use std::mem::size_of;
|
|||
use bitfield::bitfield;
|
||||
use macros::Layout;
|
||||
use parking_lot::{RwLock, RwLockWriteGuard};
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
|
||||
|
||||
use crate::hv::IrqFd;
|
||||
use crate::mem::addressable::SlotBackend;
|
||||
|
@ -36,7 +36,7 @@ pub enum PciCapId {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, FromZeroes, AsBytes, Layout)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, Immutable, IntoBytes, KnownLayout, Layout)]
|
||||
pub struct PciCapHdr {
|
||||
pub id: u8,
|
||||
pub next: u8,
|
||||
|
@ -53,7 +53,7 @@ bitfield! {
|
|||
}
|
||||
|
||||
bitfield! {
|
||||
#[derive(Copy, Clone, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Copy, Clone, Default, FromBytes, Immutable, IntoBytes, KnownLayout)]
|
||||
#[repr(C)]
|
||||
pub struct MsixMsgCtrl(u16);
|
||||
impl Debug;
|
||||
|
@ -70,7 +70,7 @@ impl MsixMsgCtrl {
|
|||
}
|
||||
|
||||
bitfield! {
|
||||
#[derive(Copy, Clone, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Copy, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
#[repr(C)]
|
||||
pub struct MsixCapOffset(u32);
|
||||
impl Debug;
|
||||
|
@ -87,7 +87,7 @@ impl MsixCapOffset {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, Clone, FromBytes, FromZeroes, AsBytes, Layout)]
|
||||
#[derive(Debug, Default, Clone, FromBytes, Immutable, IntoBytes, Layout)]
|
||||
#[repr(C)]
|
||||
pub struct MsixCap {
|
||||
pub header: PciCapHdr,
|
||||
|
|
|
@ -19,16 +19,19 @@ use std::sync::Arc;
|
|||
use bitflags::bitflags;
|
||||
use macros::Layout;
|
||||
use parking_lot::RwLock;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
|
||||
|
||||
use crate::mem::emulated::{Action, ChangeLayout, Mmio};
|
||||
use crate::pci::cap::PciCapList;
|
||||
use crate::pci::{Bdf, PciBar};
|
||||
use crate::{assign_bits, mask_bits, mem, unsafe_impl_zerocopy};
|
||||
use crate::{assign_bits, impl_mmio_for_zerocopy, mask_bits, mem};
|
||||
|
||||
#[derive(Clone, Copy, Default, IntoBytes, FromBytes, KnownLayout, Immutable)]
|
||||
#[repr(transparent)]
|
||||
pub struct Command(u16);
|
||||
|
||||
bitflags! {
|
||||
#[derive(Debug, Clone, Copy, Default)]
|
||||
pub struct Command: u16 {
|
||||
impl Command: u16 {
|
||||
const INTX_DISABLE = 1 << 10;
|
||||
const SERR = 1 << 8;
|
||||
const PARITY_ERR = 1 << 6;
|
||||
|
@ -43,11 +46,19 @@ bitflags! {
|
|||
| Self::IO.bits();
|
||||
}
|
||||
}
|
||||
unsafe_impl_zerocopy!(Command, FromBytes, FromZeroes, AsBytes);
|
||||
|
||||
impl std::fmt::Debug for Command {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
bitflags::parser::to_writer(self, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Default, IntoBytes, FromBytes, KnownLayout, Immutable)]
|
||||
#[repr(transparent)]
|
||||
pub struct Status(u16);
|
||||
|
||||
bitflags! {
|
||||
#[derive(Debug, Clone, Copy, Default)]
|
||||
pub struct Status: u16 {
|
||||
impl Status: u16 {
|
||||
const PARITY_ERR = 1 << 15;
|
||||
const SYSTEM_ERR = 1 << 14;
|
||||
const RECEIVED_MASTER_ABORT = 1 << 13;
|
||||
|
@ -65,7 +76,12 @@ bitflags! {
|
|||
| Self::MASTER_PARITY_ERR.bits();
|
||||
}
|
||||
}
|
||||
unsafe_impl_zerocopy!(Status, FromBytes, FromZeroes, AsBytes);
|
||||
|
||||
impl std::fmt::Debug for Status {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
bitflags::parser::to_writer(self, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
#[repr(u8)]
|
||||
|
@ -74,7 +90,7 @@ pub enum HeaderType {
|
|||
Bridge = 1,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Default, FromBytes, FromZeroes, AsBytes, Layout)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, KnownLayout, IntoBytes, Layout)]
|
||||
#[repr(C, align(8))]
|
||||
pub struct CommonHeader {
|
||||
pub vendor: u16,
|
||||
|
@ -91,7 +107,7 @@ pub struct CommonHeader {
|
|||
pub bist: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Default, FromBytes, FromZeroes, AsBytes, Layout)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, KnownLayout, IntoBytes, Layout)]
|
||||
#[repr(C, align(8))]
|
||||
pub struct DeviceHeader {
|
||||
pub common: CommonHeader,
|
||||
|
@ -107,6 +123,7 @@ pub struct DeviceHeader {
|
|||
pub min_gnt: u8,
|
||||
pub max_lat: u8,
|
||||
}
|
||||
impl_mmio_for_zerocopy!(DeviceHeader);
|
||||
|
||||
pub const OFFSET_BAR0: usize = DeviceHeader::OFFSET_BARS;
|
||||
pub const OFFSET_BAR5: usize = OFFSET_BAR0 + 5 * size_of::<u32>();
|
||||
|
@ -376,19 +393,10 @@ impl Mmio for EmulatedHeader {
|
|||
}
|
||||
|
||||
fn read(&self, offset: u64, size: u8) -> mem::Result<u64> {
|
||||
let offset = offset as usize;
|
||||
let data = self.data.read();
|
||||
let bytes = match &data.header {
|
||||
ConfigHeader::Device(header) => AsBytes::as_bytes(header),
|
||||
};
|
||||
let ret = match size {
|
||||
1 => bytes.get(offset).map(|b| *b as u64),
|
||||
2 => u16::read_from_prefix(&bytes[offset..]).map(|w| w as u64),
|
||||
4 => u32::read_from_prefix(&bytes[offset..]).map(|d| d as u64),
|
||||
8 => u64::read_from_prefix(&bytes[offset..]),
|
||||
_ => Some(0),
|
||||
};
|
||||
Ok(ret.unwrap_or(0))
|
||||
match &data.header {
|
||||
ConfigHeader::Device(header) => Mmio::read(header, offset, size),
|
||||
}
|
||||
}
|
||||
|
||||
fn write(&self, offset: u64, size: u8, val: u64) -> mem::Result<Action> {
|
||||
|
|
|
@ -16,7 +16,7 @@ macro_rules! endian_impl {
|
|||
($ne_type:ident, $ed_type:ident, $endian:expr, $opposite:expr) => {
|
||||
#[repr(transparent)]
|
||||
#[derive(
|
||||
::zerocopy::AsBytes, ::zerocopy::FromBytes, ::zerocopy::FromZeroes, Copy, Clone,
|
||||
::zerocopy::Immutable, ::zerocopy::IntoBytes, ::zerocopy::FromBytes, Copy, Clone,
|
||||
)]
|
||||
pub struct $ed_type {
|
||||
v: $ne_type,
|
||||
|
|
|
@ -172,21 +172,6 @@ macro_rules! c_enum {
|
|||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! unsafe_impl_zerocopy {
|
||||
($ty:ty, $($name:ident), +) => {
|
||||
$(
|
||||
unsafe impl ::zerocopy::$name for $ty {
|
||||
fn only_derive_is_allowed_to_implement_this_trait()
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
}
|
||||
}
|
||||
)+
|
||||
};
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
#[test]
|
||||
|
|
|
@ -420,14 +420,13 @@ where
|
|||
let mut buf: [u8; 4096] = transmute!([0u32; 1024]);
|
||||
cdev.dev.fd().read_at(&mut buf, region_config.offset)?;
|
||||
|
||||
let header = CommonHeader::ref_from_prefix(&buf).unwrap();
|
||||
if header.header_type != HeaderType::Device as u8 {
|
||||
let (mut dev_header, _) = DeviceHeader::read_from_prefix(&buf).unwrap();
|
||||
if dev_header.common.header_type != HeaderType::Device as u8 {
|
||||
return error::NotSupportedHeader {
|
||||
ty: header.header_type,
|
||||
ty: dev_header.common.header_type,
|
||||
}
|
||||
.fail();
|
||||
}
|
||||
let mut dev_header = DeviceHeader::read_from_prefix(&buf).unwrap();
|
||||
dev_header.intx_pin = 0;
|
||||
dev_header.common.command = Command::empty();
|
||||
|
||||
|
@ -438,9 +437,11 @@ where
|
|||
if dev_header.common.status.contains(Status::CAP) {
|
||||
let mut cap_offset = dev_header.capability_pointer as usize;
|
||||
while cap_offset != 0 {
|
||||
let cap_header = PciCapHdr::ref_from_prefix(&buf[cap_offset..]).unwrap();
|
||||
let (cap_header, _) = PciCapHdr::ref_from_prefix(&buf[cap_offset..]).unwrap();
|
||||
if cap_header.id == PciCapId::Msix as u8 {
|
||||
msix_cap = MsixCap::read_from_prefix(&buf[cap_offset..]);
|
||||
if let Ok((c, _)) = MsixCap::read_from_prefix(&buf[cap_offset..]) {
|
||||
msix_cap = Some(c)
|
||||
}
|
||||
msix_msg_ctrl_offset = cap_offset + MsixCap::OFFSET_CONTROL;
|
||||
} else if cap_header.id == PciCapId::Msi as u8 {
|
||||
log::trace!("{}: hiding MSI cap at {cap_offset:#x}", cdev.name);
|
||||
|
|
|
@ -34,7 +34,7 @@ use mio::Registry;
|
|||
use serde::Deserialize;
|
||||
use serde_aco::Help;
|
||||
use snafu::ResultExt;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::hv::IoeventFd;
|
||||
use crate::mem::mapped::{Ram, RamBus};
|
||||
|
@ -49,7 +49,7 @@ use crate::virtio::{error, DeviceId, IrqSender, Result, FEATURE_BUILT_IN};
|
|||
use crate::{c_enum, impl_mmio_for_zerocopy};
|
||||
|
||||
c_enum! {
|
||||
#[derive(FromBytes, FromZeroes)]
|
||||
#[derive(FromBytes)]
|
||||
pub struct RequestType(u32);
|
||||
{
|
||||
IN = 0;
|
||||
|
@ -64,7 +64,7 @@ c_enum! {
|
|||
}
|
||||
|
||||
c_enum! {
|
||||
#[derive(FromBytes, FromZeroes)]
|
||||
#[derive(FromBytes)]
|
||||
pub struct Status(u8);
|
||||
{
|
||||
OK = 0;
|
||||
|
@ -74,7 +74,7 @@ c_enum! {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, FromZeroes, FromBytes)]
|
||||
#[derive(Debug, FromBytes)]
|
||||
pub struct Request {
|
||||
type_: RequestType,
|
||||
reserved: u32,
|
||||
|
@ -104,7 +104,7 @@ bitflags! {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, FromZeros, Immutable, IntoBytes)]
|
||||
#[repr(C)]
|
||||
pub struct BlockConfig {
|
||||
capacity: u64,
|
||||
|
@ -222,7 +222,7 @@ impl Block {
|
|||
let [hdr, data_out @ ..] = &desc.readable[..] else {
|
||||
return error::InvalidBuffer.fail();
|
||||
};
|
||||
let Some(request) = Request::read_from(hdr) else {
|
||||
let Ok(request) = Request::read_from_bytes(hdr) else {
|
||||
return error::InvalidBuffer.fail();
|
||||
};
|
||||
let [data_in @ .., status_buf] = &mut desc.writable[..] else {
|
||||
|
|
|
@ -32,7 +32,7 @@ use mio::unix::SourceFd;
|
|||
use mio::{Interest, Registry, Token};
|
||||
use serde::Deserialize;
|
||||
use serde_aco::Help;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::hv::IoeventFd;
|
||||
use crate::mem::mapped::{ArcMemPages, Ram, RamBus};
|
||||
|
@ -48,7 +48,7 @@ use crate::virtio::{error, DeviceId, IrqSender, Result, VirtioFeature};
|
|||
use crate::{align_up, ffi, impl_mmio_for_zerocopy};
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct FsConfig {
|
||||
tag: [u8; 36],
|
||||
num_request_queues: u32,
|
||||
|
@ -64,7 +64,7 @@ bitflags! {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Clone, FromBytes, Immutable, IntoBytes)]
|
||||
#[repr(C)]
|
||||
struct VuFsMap {
|
||||
pub fd_offset: [u64; 8],
|
||||
|
@ -135,7 +135,7 @@ impl VuFs {
|
|||
let mut empty_cfg = DeviceConfig::new_zeroed();
|
||||
empty_cfg.size = size_of_val(&empty_cfg.region) as _;
|
||||
let dev_config = vu_dev.get_config(&empty_cfg)?;
|
||||
FsConfig::read_from_prefix(&dev_config.region).unwrap()
|
||||
FsConfig::read_from_prefix(&dev_config.region).unwrap().0
|
||||
};
|
||||
let dax_region = if param.dax_window > 0 {
|
||||
vu_dev.setup_channel()?;
|
||||
|
@ -345,7 +345,7 @@ impl VirtioMio for VuFs {
|
|||
let mut fds = [None, None, None, None, None, None, None, None];
|
||||
let ret = self
|
||||
.vu_dev
|
||||
.receive_from_channel(fs_map.as_bytes_mut(), &mut fds);
|
||||
.receive_from_channel(fs_map.as_mut_bytes(), &mut fds);
|
||||
let (request, size) = match ret {
|
||||
Ok((r, s)) => (r, s),
|
||||
Err(Error::System { error, .. }) if error.kind() == ErrorKind::WouldBlock => break,
|
||||
|
|
|
@ -34,7 +34,7 @@ use mio::unix::SourceFd;
|
|||
use mio::{Interest, Registry, Token};
|
||||
use serde::Deserialize;
|
||||
use serde_aco::Help;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes};
|
||||
|
||||
use crate::hv::IoeventFd;
|
||||
use crate::mem::mapped::{Ram, RamBus};
|
||||
|
@ -53,7 +53,7 @@ pub mod tap;
|
|||
use tap::{tun_set_iff, tun_set_offload, tun_set_vnet_hdr_sz, TunFeature};
|
||||
|
||||
#[repr(C, align(8))]
|
||||
#[derive(Debug, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct NetConfig {
|
||||
mac: MacAddr,
|
||||
status: u16,
|
||||
|
@ -69,7 +69,7 @@ pub struct NetConfig {
|
|||
impl_mmio_for_zerocopy!(NetConfig);
|
||||
|
||||
c_enum! {
|
||||
#[derive(FromBytes, FromZeroes)]
|
||||
#[derive(Default, FromBytes, Immutable, IntoBytes)]
|
||||
struct CtrlAck(u8);
|
||||
{
|
||||
OK = 0;
|
||||
|
@ -78,7 +78,7 @@ c_enum! {
|
|||
}
|
||||
|
||||
c_enum! {
|
||||
#[derive(FromBytes, FromZeroes)]
|
||||
#[derive(Default, FromBytes, Immutable, IntoBytes)]
|
||||
struct CtrlClass(u8);
|
||||
{
|
||||
MQ = 4;
|
||||
|
@ -86,6 +86,7 @@ c_enum! {
|
|||
}
|
||||
|
||||
c_enum! {
|
||||
#[derive(Default, FromBytes, Immutable, IntoBytes)]
|
||||
struct CtrlMq(u8);
|
||||
{
|
||||
VQ_PARIS_SET = 0;
|
||||
|
@ -93,13 +94,13 @@ c_enum! {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Default, FromBytes, Immutable, IntoBytes)]
|
||||
struct CtrlMqParisSet {
|
||||
virtq_pairs: u16,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, Default, FromBytes, Immutable, IntoBytes)]
|
||||
struct CtrlHdr {
|
||||
class: CtrlClass,
|
||||
command: u8,
|
||||
|
@ -241,7 +242,11 @@ impl Net {
|
|||
desc: &mut Descriptor,
|
||||
registry: Option<&Registry>,
|
||||
) -> Result<usize> {
|
||||
let Some(header) = desc.readable.first().and_then(|b| CtrlHdr::ref_from(b)) else {
|
||||
let Some(header) = desc
|
||||
.readable
|
||||
.first()
|
||||
.and_then(|b| CtrlHdr::read_from_bytes(b).ok())
|
||||
else {
|
||||
return error::InvalidBuffer.fail();
|
||||
};
|
||||
let Some(ack_byte) = desc.writable.first_mut().and_then(|v| v.first_mut()) else {
|
||||
|
@ -250,7 +255,7 @@ impl Net {
|
|||
let ack = match header.class {
|
||||
CtrlClass::MQ => match CtrlMq(header.command) {
|
||||
CtrlMq::VQ_PARIS_SET => {
|
||||
let to_set = |b: &IoSlice| CtrlMqParisSet::read_from(b);
|
||||
let to_set = |b: &IoSlice| CtrlMqParisSet::read_from_bytes(b).ok();
|
||||
let Some(data) = desc.readable.get(1).and_then(to_set) else {
|
||||
return error::InvalidBuffer.fail();
|
||||
};
|
||||
|
@ -500,7 +505,7 @@ fn setup_socket(file: &mut File, if_name: Option<&str>, mq: bool) -> Result<()>
|
|||
|
||||
if let Some(name) = if_name {
|
||||
let name_len = std::cmp::min(tap_ifconfig.ifr_name.len() - 1, name.len());
|
||||
tap_ifconfig.ifr_name.as_bytes_mut()[0..name_len]
|
||||
tap_ifconfig.ifr_name.as_mut_bytes()[0..name_len]
|
||||
.copy_from_slice(&name.as_bytes()[0..name_len]);
|
||||
}
|
||||
|
||||
|
|
|
@ -15,13 +15,13 @@
|
|||
mod vhost_vsock;
|
||||
|
||||
use bitflags::bitflags;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::impl_mmio_for_zerocopy;
|
||||
|
||||
pub use vhost_vsock::{VhostVsock, VhostVsockParam};
|
||||
|
||||
#[derive(Debug, Clone, Copy, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Clone, Copy, Default, FromZeros, Immutable, IntoBytes)]
|
||||
#[repr(C)]
|
||||
pub struct VsockConfig {
|
||||
pub guest_cid: u32,
|
||||
|
|
|
@ -21,7 +21,7 @@ use std::sync::Arc;
|
|||
|
||||
use macros::Layout;
|
||||
use parking_lot::{Mutex, RwLock};
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::hv::{IoeventFd, IoeventFdRegistry, IrqFd, MsiSender};
|
||||
use crate::mem::emulated::{Action, Mmio};
|
||||
|
@ -577,7 +577,7 @@ pub enum VirtioPciCfg {
|
|||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, FromZeros, Immutable, IntoBytes)]
|
||||
pub struct VirtioPciCap {
|
||||
header: PciCapHdr,
|
||||
cap_len: u8,
|
||||
|
@ -599,7 +599,7 @@ impl PciCap for VirtioPciCap {
|
|||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, FromZeros, Immutable, IntoBytes)]
|
||||
pub struct VirtioPciCap64 {
|
||||
cap: VirtioPciCap,
|
||||
offset_hi: u32,
|
||||
|
@ -615,7 +615,7 @@ impl PciCap for VirtioPciCap64 {
|
|||
}
|
||||
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Debug, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Default, FromZeros, Immutable, IntoBytes)]
|
||||
pub struct VirtioPciNotifyCap {
|
||||
cap: VirtioPciCap,
|
||||
multiplier: u32,
|
||||
|
|
|
@ -17,14 +17,14 @@ use std::sync::atomic::{fence, Ordering};
|
|||
|
||||
use bitflags::bitflags;
|
||||
use macros::Layout;
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, Immutable, IntoBytes};
|
||||
|
||||
use crate::mem::mapped::Ram;
|
||||
use crate::virtio::queue::{Descriptor, Queue, VirtQueue};
|
||||
use crate::virtio::{error, Result, VirtioFeature};
|
||||
|
||||
#[repr(C, align(16))]
|
||||
#[derive(Debug, Clone, Default, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)]
|
||||
pub struct Desc {
|
||||
pub addr: u64,
|
||||
pub len: u32,
|
||||
|
|
|
@ -25,7 +25,7 @@ use bitfield::bitfield;
|
|||
use bitflags::bitflags;
|
||||
use parking_lot::Mutex;
|
||||
use snafu::{ResultExt, Snafu};
|
||||
use zerocopy::{AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes};
|
||||
|
||||
use crate::errors::{boxed_debug_trace, trace_error, DebugTrace};
|
||||
use crate::mem::mapped::ArcMemPages;
|
||||
|
@ -104,7 +104,7 @@ pub const VHOST_USER_SET_DEVICE_STATE_FD: u32 = 42;
|
|||
pub const VHOST_USER_CHECK_DEVICE_STATE: u32 = 43;
|
||||
|
||||
bitfield! {
|
||||
#[derive(Copy, Clone, Default, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Copy, Clone, Default, IntoBytes, FromBytes, Immutable)]
|
||||
#[repr(transparent)]
|
||||
pub struct MessageFlag(u32);
|
||||
impl Debug;
|
||||
|
@ -125,14 +125,14 @@ impl MessageFlag {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
pub struct VirtqState {
|
||||
pub index: u32,
|
||||
pub val: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
pub struct VirtqAddr {
|
||||
pub index: u32,
|
||||
|
@ -143,7 +143,7 @@ pub struct VirtqAddr {
|
|||
pub log_guest_addr: u64,
|
||||
}
|
||||
|
||||
#[derive(Debug, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
pub struct MemoryRegion {
|
||||
pub gpa: u64,
|
||||
|
@ -152,14 +152,14 @@ pub struct MemoryRegion {
|
|||
pub mmap_offset: u64,
|
||||
}
|
||||
|
||||
#[derive(Debug, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
pub struct MemorySingleRegion {
|
||||
pub _padding: u64,
|
||||
pub region: MemoryRegion,
|
||||
}
|
||||
|
||||
#[derive(Debug, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
pub struct MemoryMultipleRegion {
|
||||
pub num: u32,
|
||||
|
@ -167,7 +167,7 @@ pub struct MemoryMultipleRegion {
|
|||
pub regions: [MemoryRegion; 8],
|
||||
}
|
||||
|
||||
#[derive(Debug, AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
pub struct DeviceConfig {
|
||||
pub offset: u32,
|
||||
|
@ -176,7 +176,7 @@ pub struct DeviceConfig {
|
|||
pub region: [u8; 256],
|
||||
}
|
||||
|
||||
#[derive(AsBytes, FromBytes, FromZeroes)]
|
||||
#[derive(Debug, IntoBytes, FromBytes, Immutable)]
|
||||
#[repr(C)]
|
||||
pub struct Message {
|
||||
pub request: u32,
|
||||
|
@ -251,7 +251,7 @@ impl VuDev {
|
|||
self.channel.as_ref()
|
||||
}
|
||||
|
||||
fn send_msg<T: AsBytes, R: FromBytes + AsBytes>(
|
||||
fn send_msg<T: IntoBytes + Immutable, R: FromBytes + IntoBytes>(
|
||||
&self,
|
||||
req: u32,
|
||||
payload: &T,
|
||||
|
@ -306,13 +306,13 @@ impl VuDev {
|
|||
let mut ret_code = u64::MAX;
|
||||
let mut bufs = if size_of::<R>() == 0 {
|
||||
[
|
||||
IoSliceMut::new(resp.as_bytes_mut()),
|
||||
IoSliceMut::new(ret_code.as_bytes_mut()),
|
||||
IoSliceMut::new(resp.as_mut_bytes()),
|
||||
IoSliceMut::new(ret_code.as_mut_bytes()),
|
||||
]
|
||||
} else {
|
||||
[
|
||||
IoSliceMut::new(resp.as_bytes_mut()),
|
||||
IoSliceMut::new(payload.as_bytes_mut()),
|
||||
IoSliceMut::new(resp.as_mut_bytes()),
|
||||
IoSliceMut::new(payload.as_mut_bytes()),
|
||||
]
|
||||
};
|
||||
let read_size = conn.read_vectored(&mut bufs)?;
|
||||
|
@ -425,7 +425,7 @@ impl VuDev {
|
|||
fds: &mut [Option<OwnedFd>],
|
||||
) -> Result<(u32, u32)> {
|
||||
let mut msg = Message::new_zeroed();
|
||||
let mut bufs = [IoSliceMut::new(msg.as_bytes_mut()), IoSliceMut::new(buf)];
|
||||
let mut bufs = [IoSliceMut::new(msg.as_mut_bytes()), IoSliceMut::new(buf)];
|
||||
const CMSG_BUF_LEN: usize = unsafe { libc::CMSG_SPACE(8) } as usize;
|
||||
debug_assert_eq!(CMSG_BUF_LEN % size_of::<u64>(), 0);
|
||||
let mut cmsg_buf = [0u64; CMSG_BUF_LEN / size_of::<u64>()];
|
||||
|
@ -480,7 +480,7 @@ impl VuDev {
|
|||
Ok((msg.request, msg.size))
|
||||
}
|
||||
|
||||
pub fn ack_request<T: AsBytes>(&self, req: u32, payload: &T) -> Result<()> {
|
||||
pub fn ack_request<T: IntoBytes + Immutable>(&self, req: u32, payload: &T) -> Result<()> {
|
||||
let Some(channel) = &self.channel else {
|
||||
return error::ProtocolFeature {
|
||||
feature: VuFeature::BACKEND_REQ,
|
||||
|
|
Loading…
Reference in a new issue