xref: /aosp_15_r20/external/crosvm/arch/src/pstore.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::OpenOptions;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::bail;
8*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Context;
9*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Result;
10*bb4ee6a4SAndroid Build Coastguard Worker use base::MemoryMappingBuilder;
11*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::MemCacheType;
12*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::Vm;
13*bb4ee6a4SAndroid Build Coastguard Worker use resources::AddressRange;
14*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::GuestAddress;
15*bb4ee6a4SAndroid Build Coastguard Worker 
16*bb4ee6a4SAndroid Build Coastguard Worker use crate::Pstore;
17*bb4ee6a4SAndroid Build Coastguard Worker 
18*bb4ee6a4SAndroid Build Coastguard Worker mod sys;
19*bb4ee6a4SAndroid Build Coastguard Worker 
20*bb4ee6a4SAndroid Build Coastguard Worker pub struct RamoopsRegion {
21*bb4ee6a4SAndroid Build Coastguard Worker     pub address: u64,
22*bb4ee6a4SAndroid Build Coastguard Worker     pub size: u32,
23*bb4ee6a4SAndroid Build Coastguard Worker }
24*bb4ee6a4SAndroid Build Coastguard Worker 
25*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a mmio memory region for pstore.
create_memory_region( vm: &mut impl Vm, region: AddressRange, pstore: &Pstore, ) -> Result<RamoopsRegion>26*bb4ee6a4SAndroid Build Coastguard Worker pub fn create_memory_region(
27*bb4ee6a4SAndroid Build Coastguard Worker     vm: &mut impl Vm,
28*bb4ee6a4SAndroid Build Coastguard Worker     region: AddressRange,
29*bb4ee6a4SAndroid Build Coastguard Worker     pstore: &Pstore,
30*bb4ee6a4SAndroid Build Coastguard Worker ) -> Result<RamoopsRegion> {
31*bb4ee6a4SAndroid Build Coastguard Worker     let region_size = region.len().context("failed to get region len")?;
32*bb4ee6a4SAndroid Build Coastguard Worker     if region_size < pstore.size.into() {
33*bb4ee6a4SAndroid Build Coastguard Worker         bail!("insufficient space for pstore {} {}", region, pstore.size);
34*bb4ee6a4SAndroid Build Coastguard Worker     }
35*bb4ee6a4SAndroid Build Coastguard Worker 
36*bb4ee6a4SAndroid Build Coastguard Worker     let mut open_opts = OpenOptions::new();
37*bb4ee6a4SAndroid Build Coastguard Worker     open_opts.read(true).write(true).create(true);
38*bb4ee6a4SAndroid Build Coastguard Worker     sys::set_extra_open_opts(&mut open_opts);
39*bb4ee6a4SAndroid Build Coastguard Worker 
40*bb4ee6a4SAndroid Build Coastguard Worker     let file = open_opts
41*bb4ee6a4SAndroid Build Coastguard Worker         .open(&pstore.path)
42*bb4ee6a4SAndroid Build Coastguard Worker         .context("failed to open pstore")?;
43*bb4ee6a4SAndroid Build Coastguard Worker     file.set_len(pstore.size as u64)
44*bb4ee6a4SAndroid Build Coastguard Worker         .context("failed to set pstore length")?;
45*bb4ee6a4SAndroid Build Coastguard Worker 
46*bb4ee6a4SAndroid Build Coastguard Worker     let memory_mapping = MemoryMappingBuilder::new(pstore.size as usize)
47*bb4ee6a4SAndroid Build Coastguard Worker         .from_file(&file)
48*bb4ee6a4SAndroid Build Coastguard Worker         .build()
49*bb4ee6a4SAndroid Build Coastguard Worker         .context("failed to mmap pstore")?;
50*bb4ee6a4SAndroid Build Coastguard Worker 
51*bb4ee6a4SAndroid Build Coastguard Worker     vm.add_memory_region(
52*bb4ee6a4SAndroid Build Coastguard Worker         GuestAddress(region.start),
53*bb4ee6a4SAndroid Build Coastguard Worker         Box::new(memory_mapping),
54*bb4ee6a4SAndroid Build Coastguard Worker         false,
55*bb4ee6a4SAndroid Build Coastguard Worker         false,
56*bb4ee6a4SAndroid Build Coastguard Worker         MemCacheType::CacheCoherent,
57*bb4ee6a4SAndroid Build Coastguard Worker     )
58*bb4ee6a4SAndroid Build Coastguard Worker     .context("failed to add pstore region")?;
59*bb4ee6a4SAndroid Build Coastguard Worker 
60*bb4ee6a4SAndroid Build Coastguard Worker     Ok(RamoopsRegion {
61*bb4ee6a4SAndroid Build Coastguard Worker         address: region.start,
62*bb4ee6a4SAndroid Build Coastguard Worker         size: pstore.size,
63*bb4ee6a4SAndroid Build Coastguard Worker     })
64*bb4ee6a4SAndroid Build Coastguard Worker }
65*bb4ee6a4SAndroid Build Coastguard Worker 
add_ramoops_kernel_cmdline( cmdline: &mut kernel_cmdline::Cmdline, ramoops_region: &RamoopsRegion, ) -> std::result::Result<(), kernel_cmdline::Error>66*bb4ee6a4SAndroid Build Coastguard Worker pub fn add_ramoops_kernel_cmdline(
67*bb4ee6a4SAndroid Build Coastguard Worker     cmdline: &mut kernel_cmdline::Cmdline,
68*bb4ee6a4SAndroid Build Coastguard Worker     ramoops_region: &RamoopsRegion,
69*bb4ee6a4SAndroid Build Coastguard Worker ) -> std::result::Result<(), kernel_cmdline::Error> {
70*bb4ee6a4SAndroid Build Coastguard Worker     // It seems that default record_size is only 4096 byte even if crosvm allocates
71*bb4ee6a4SAndroid Build Coastguard Worker     // more memory. It means that one crash can only 4096 byte.
72*bb4ee6a4SAndroid Build Coastguard Worker     // Set record_size and console_size to 1/4 of allocated memory size.
73*bb4ee6a4SAndroid Build Coastguard Worker     // This configulation is same as the host.
74*bb4ee6a4SAndroid Build Coastguard Worker     let ramoops_opts = [
75*bb4ee6a4SAndroid Build Coastguard Worker         ("mem_address", ramoops_region.address),
76*bb4ee6a4SAndroid Build Coastguard Worker         ("mem_size", ramoops_region.size as u64),
77*bb4ee6a4SAndroid Build Coastguard Worker     ];
78*bb4ee6a4SAndroid Build Coastguard Worker     for (name, val) in &ramoops_opts {
79*bb4ee6a4SAndroid Build Coastguard Worker         cmdline.insert_str(format!("ramoops.{}={:#x}", name, val))?;
80*bb4ee6a4SAndroid Build Coastguard Worker     }
81*bb4ee6a4SAndroid Build Coastguard Worker     Ok(())
82*bb4ee6a4SAndroid Build Coastguard Worker }
83