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