base: panic_handler: abort in memfd panic hook

The default behavior when handling a panic in a multi-threaded Rust
program is to terminate only the thread that panicked; other threads
continue running.

In order to get a crash dump (and to prevent the program from continuing
to run in an inconsistent state), add a call to abort the whole program
at the end of the panic hook installed by install_memfd_handler().

The crosvm panic hook configured by set_panic_hook() already behaves
this way, but adding this behavior to install_memfd_handler() will cause
it to be used in all ChromeOS Rust programs that use the hook from
libchromeos.

Test program:

```
fn main() {
    println!("hello world");
    install_memfd_handler();

    thread::Builder::new()
        .name("crashtest".into())
        .spawn(|| {
            println!("about to panic");
            panic!("test panic");
        })
        .unwrap();
    }

    println!("continuing to run main");
    thread::sleep(Duration::from_secs(1));
}
```

BUG=b:234093439
TEST=panic in multithreaded test program; observe core

Change-Id: I2340b2f54607651fe577ebf44a0ecb12e409cef4
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4190031
Reviewed-by: Allen Webb <allenwebb@google.com>
Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
1 file changed
tree: 47d2224522abe7534c0f7030a3063b94c77086c1
  1. .cargo/
  2. .devcontainer/
  3. .github/
  4. .vscode/
  5. aarch64/
  6. acpi_tables/
  7. anti_tamper/
  8. arch/
  9. argh_helpers/
  10. base/
  11. bit_field/
  12. broker_ipc/
  13. common/
  14. crash_report/
  15. cros_async/
  16. cros_fdt/
  17. cros_tracing/
  18. crosvm-fuzz/
  19. crosvm_cli/
  20. crosvm_control/
  21. crosvm_plugin/
  22. devices/
  23. disk/
  24. docs/
  25. e2e_tests/
  26. fuse/
  27. gpu_display/
  28. hypervisor/
  29. infra/
  30. io_uring/
  31. kernel_cmdline/
  32. kernel_loader/
  33. kvm/
  34. kvm_sys/
  35. libcras_stub/
  36. linux_input_sys/
  37. logo/
  38. media/
  39. metrics/
  40. net_sys/
  41. net_util/
  42. power_monitor/
  43. prebuilts/
  44. proto_build_tools/
  45. protos/
  46. qcow_utils/
  47. resources/
  48. rutabaga_gfx/
  49. sandbox/
  50. seccomp/
  51. serde_keyvalue/
  52. src/
  53. swap/
  54. system_api/
  55. tests/
  56. third_party/
  57. tools/
  58. tpm2/
  59. tpm2-sys/
  60. tube_transporter/
  61. usb_sys/
  62. usb_util/
  63. vfio_sys/
  64. vhost/
  65. virtio_sys/
  66. vm_control/
  67. vm_memory/
  68. win_audio/
  69. win_util/
  70. x86_64/
  71. .dockerignore
  72. .gitignore
  73. .gitmodules
  74. .rustfmt.toml
  75. ARCHITECTURE.md
  76. build.rs
  77. Cargo.lock
  78. Cargo.toml
  79. CONTRIBUTING.md
  80. DIR_METADATA
  81. LICENSE
  82. mypy.ini
  83. OWNERS
  84. OWNERS_COUNCIL
  85. PRESUBMIT.cfg
  86. pyproject.toml
  87. README.chromeos.md
  88. README.md
  89. rust-toolchain
README.md

crosvm - The ChromeOS Virtual Machine Monitor

crosvm is a virtual machine monitor (VMM) based on Linux’s KVM hypervisor, with a focus on simplicity, security, and speed. crosvm is intended to run Linux guests, originally as a security boundary for running native applications on the ChromeOS platform. Compared to QEMU, crosvm doesn’t emulate architectures or real hardware, instead concentrating on paravirtualized devices, such as the virtio standard.

crosvm is currently used to run Linux/Android guests on ChromeOS devices.

Logo