base: Add more safety nets for checking cpu online status

To see if a cpu is online, in descending order:

1. Parse `/sys/devices/system/cpu/online`
  - This is usually globally readable
  - Might only exist on Linux Kernel 2.6.20 (~2007) or later

2. Check `/sys/devices/system/cpu/cpuX/online`
  - Usually more restricted and some users can't read this file
  - x86 and ARM might not have one for CPU 0 since it's special and
    can't be offlined
  - Might not exist if CONFIG_HOTPLUG_CPU isn't enabled

3. Assume CPU online
  - Logs a warning and just guess. This could cause issues later down
    the road if we try to probe other sys props of an offline CPU
    (b/478085580), so it could just be delaying the crash. Or we could
    get lucky and it's actually online.

Cache the cpu online info once at startup so we don't read the files
each time. crosvm currently doesn't handle hotplugged CPUs at runtime
anyways since much of our internal state is only initialized once.

BUG=498448415, 502869543
TEST=./tools/dev_container ./tools/presubmit

Change-Id: Ie28cbbf6290b757e09601c5b33a995d134093237
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/7768126
Commit-Queue: Cassie Wang <cassiewang@google.com>
Reviewed-by: Keiichi Watanabe <keiichiw@chromium.org>
4 files changed
tree: 6c497cff71591df76e058fd3a48774353496c7b5
  1. .cargo/
  2. .config/
  3. .devcontainer/
  4. .github/
  5. .vscode/
  6. aarch64/
  7. aarch64_sys_reg/
  8. acpi_tables/
  9. android_audio/
  10. arch/
  11. argh_helpers/
  12. audio_streams_conformance_test/
  13. audio_util/
  14. base/
  15. base_tokio/
  16. bit_field/
  17. common/
  18. cros_async/
  19. cros_fdt/
  20. cros_tracing/
  21. cros_tracing_types/
  22. crosvm_cli/
  23. crosvm_control/
  24. devices/
  25. disk/
  26. docs/
  27. e2e_tests/
  28. ext2/
  29. fuse/
  30. fuzz/
  31. gpu_display/
  32. hypervisor/
  33. infra/
  34. io_uring/
  35. jail/
  36. kernel_cmdline/
  37. kernel_loader/
  38. kvm_sys/
  39. libcras_stub/
  40. linux_input_sys/
  41. logo/
  42. media/
  43. metrics/
  44. metrics_events/
  45. net_sys/
  46. net_util/
  47. perfetto/
  48. power_monitor/
  49. prebuilts/
  50. proc_init/
  51. proto_build_tools/
  52. protos/
  53. resources/
  54. riscv64/
  55. sandbox/
  56. serde_keyvalue/
  57. snapshot/
  58. src/
  59. swap/
  60. system_api/
  61. tests/
  62. third_party/
  63. tools/
  64. tube_transporter/
  65. usb_sys/
  66. usb_util/
  67. vendor/
  68. vfio_sys/
  69. vhost/
  70. virtio_sys/
  71. vm_control/
  72. vm_memory/
  73. win_audio/
  74. win_util/
  75. x86_64/
  76. .dockerignore
  77. .envrc
  78. .gitattributes
  79. .gitignore
  80. .gitmodules
  81. .rustfmt.toml
  82. ARCHITECTURE.md
  83. Cargo.lock
  84. Cargo.toml
  85. CONTRIBUTING.md
  86. DIR_METADATA
  87. LICENSE
  88. mypy.ini
  89. OWNERS
  90. OWNERS_COUNCIL
  91. PRESUBMIT.cfg
  92. pyproject.toml
  93. README.chromeos.md
  94. README.md
  95. rust-toolchain
README.md

crosvm

crosvm logo

The ChromeOS Virtual Machine Monitor

License Documentation Matrix


crosvm is a secure, lightweight, and performant Virtual Machine Monitor (VMM) written in Rust. Originally developed for ChromeOS to run Linux (Crostini) and Android guests (ARCVM). It is now used across multiple products and platforms such as TerminalApp on Android, Cuttlefish and Windows.

crosvm focuses on security through strong isolation and a modern, memory-safe implementation. It leverages hardware-assisted virtualization to provide a robust execution environment for untrusted code.

🌟 Core Philosophy

  • Security First: Built with Rust's memory safety guarantees. Each virtual device can be run in its own sandboxed process with restricted system access.
  • Isolation: Uses Linux namespaces, seccomp filters, and Minijail to create a multi-layered security boundary.
  • Performance: Optimized for modern workloads with features like io_uring, vhost, and an internal async runtime (cros_async).
  • Portability: Supports multiple CPU architectures and hypervisor backends.

🛠️ Technical Specifications

Supported Architectures

  • x86_64
  • aarch64
  • riscv64

Supported Hypervisors

  • Linux/Android: KVM, Gunyah (Qualcomm), GenieZone (MediaTek), Halla (Exynos).
  • Windows: WHPX (Windows Hypervisor Platform), HAXM (Intel).

Virtio Device Support

crosvm implements a wide range of paravirtualized devices via the virtio standard:

  • Network: virtio-net with optional vhost and slirp backends.
  • Storage: virtio-block supporting raw, qcow2, zstd, and Android sparse formats.
  • Graphics: virtio-gpu with 2D and 3D acceleration (via virglrenderer, gfxstream, or vulkano).
  • Display/Input: Integrated virtio gpu cross domain support for wayland passthrough
  • Audio: virtio-snd with backends for CRAS (ChromeOS), AAudio (Android), and more.
  • File System: virtio-fs and virtio-9p.
  • Other: Console, RNG, Balloon, Vsock, TPM, Pmem, Video Decoder/Encoder, etc.

🔒 Security Architecture

crosvm is designed with a “process-per-device” model:

  1. Main Process: Handles VM initialization and core orchestration.
  2. Device Processes: Each virtio device can be forked into its own process.
  3. Sandboxing: Each device process is jailed using Minijail:
    • Namespaces: VFS (pivot_root), PID, User, and Network isolation.
    • Seccomp: Strict BPF filters restrict syscalls to only those required by the specific device.
    • Capabilities: All unnecessary Linux capabilities are dropped.

📖 Documentation

🚀 Getting Started

The recommended way to build and develop crosvm is using the provided development container.

Prerequisites

  • Linux: A modern kernel (5.x+) with KVM access.
  • Podman or Docker: Installed and configured.

Building

Use the dev container to build a release version of crosvm:

./tools/dev_container ./tools/build_release

Basic Usage

Follow this example usage to run a simple Linux guest.

🤝 Community & Support


crosvm is an open-source project licensed under the BSD-3-Clause License.