vmm_vhost/backend.rs
1// Copyright (C) 2019-2021 Alibaba Cloud. All rights reserved.
2// SPDX-License-Identifier: Apache-2.0 or BSD-3-Clause
3//
4// Portions Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
5//
6// Portions Copyright 2017 The Chromium OS Authors. All rights reserved.
7// Use of this source code is governed by a BSD-style license that can be
8// found in the LICENSE-BSD-Google file.
9
10//! Common traits and structs for vhost-user backend drivers.
11
12use base::RawDescriptor;
13
14/// Maximum number of memory regions supported.
15pub const VHOST_MAX_MEMORY_REGIONS: usize = 255;
16
17/// Vring configuration data.
18pub struct VringConfigData {
19 /// Actual queue size negotiated by the driver.
20 pub queue_size: u16,
21 /// Bitmask of vring flags.
22 pub flags: u32,
23 /// Descriptor table address.
24 pub desc_table_addr: u64,
25 /// Used ring buffer address.
26 pub used_ring_addr: u64,
27 /// Available ring buffer address.
28 pub avail_ring_addr: u64,
29 /// Optional address for logging.
30 pub log_addr: Option<u64>,
31}
32
33impl VringConfigData {
34 /// Check whether the log (flag, address) pair is valid.
35 pub fn is_log_addr_valid(&self) -> bool {
36 if self.flags & 0x1 != 0 && self.log_addr.is_none() {
37 return false;
38 }
39
40 true
41 }
42
43 /// Get the log address, default to zero if not available.
44 pub fn get_log_addr(&self) -> u64 {
45 if self.flags & 0x1 != 0 && self.log_addr.is_some() {
46 self.log_addr.unwrap()
47 } else {
48 0
49 }
50 }
51}
52
53/// Memory region configuration data.
54pub struct VhostUserMemoryRegionInfo {
55 /// Guest physical address of the memory region.
56 pub guest_phys_addr: u64,
57 /// Size of the memory region.
58 pub memory_size: u64,
59 /// Virtual address in the current process.
60 pub userspace_addr: u64,
61 /// Offset where region starts in the mapped memory.
62 pub mmap_offset: u64,
63 /// File descriptor for mmap.
64 pub mmap_handle: RawDescriptor,
65}
66
67#[cfg(test)]
68mod tests {
69 use super::*;
70
71 #[test]
72 fn test_vring_config_data() {
73 let mut config = VringConfigData {
74 queue_size: 0x2000,
75 flags: 0x0,
76 desc_table_addr: 0x4000,
77 used_ring_addr: 0x5000,
78 avail_ring_addr: 0x6000,
79 log_addr: None,
80 };
81
82 assert!(config.is_log_addr_valid());
83 assert_eq!(config.get_log_addr(), 0);
84
85 config.flags = 0x1;
86 assert!(!config.is_log_addr_valid());
87 assert_eq!(config.get_log_addr(), 0);
88
89 config.log_addr = Some(0x7000);
90 assert!(config.is_log_addr_valid());
91 assert_eq!(config.get_log_addr(), 0x7000);
92
93 config.flags = 0x0;
94 assert!(config.is_log_addr_valid());
95 assert_eq!(config.get_log_addr(), 0);
96 }
97}