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