summary refs log tree commit diff
path: root/x86_64
diff options
context:
space:
mode:
authorKansho Nishida <kansho@google.com>2019-12-18 13:13:14 +0900
committerCommit Bot <commit-bot@chromium.org>2020-02-03 05:45:14 +0000
commit282115bcdb3842e507357ec131d1c3685551fb1b (patch)
treecdf9e5068b1b913cf8be1fd8189851c388ecefbe /x86_64
parent95885316c25147ffe85700e4db5477aa8e516005 (diff)
downloadcrosvm-282115bcdb3842e507357ec131d1c3685551fb1b.tar
crosvm-282115bcdb3842e507357ec131d1c3685551fb1b.tar.gz
crosvm-282115bcdb3842e507357ec131d1c3685551fb1b.tar.bz2
crosvm-282115bcdb3842e507357ec131d1c3685551fb1b.tar.lz
crosvm-282115bcdb3842e507357ec131d1c3685551fb1b.tar.xz
crosvm-282115bcdb3842e507357ec131d1c3685551fb1b.tar.zst
crosvm-282115bcdb3842e507357ec131d1c3685551fb1b.zip
crosvm: pstore works for ARCVM on x86_64
Adds support for pstore on ARCVM on x86_64.
The backend file of the buffer will be passed via argument of the crosvm.

BUG=b:144962428
TEST=kernel crash on eve-arcvm, check /sys/fs/pstore/console-ramoops-0
     Launch crostini manually on eve-arcvm

Change-Id: I29492ac7a9067aa2ae23eb03fbb942ab7dd3aa8d
Signed-off-by: Kansho Nishida <kansho@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1973391
Reviewed-by: Keiichi Watanabe <keiichiw@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Kansho Nishida <kansho@chromium.org>
Diffstat (limited to 'x86_64')
-rw-r--r--x86_64/src/lib.rs29
1 files changed, 29 insertions, 0 deletions
diff --git a/x86_64/src/lib.rs b/x86_64/src/lib.rs
index fa5bc85..84f7dfd 100644
--- a/x86_64/src/lib.rs
+++ b/x86_64/src/lib.rs
@@ -87,6 +87,7 @@ pub enum Error {
     LoadCmdline(kernel_loader::Error),
     LoadInitrd(arch::LoadImageError),
     LoadKernel(kernel_loader::Error),
+    Pstore(arch::pstore::Error),
     RegisterIrqfd(sys_util::Error),
     RegisterVsock(arch::DeviceRegistrationError),
     SetLint(interrupts::Error),
@@ -132,6 +133,7 @@ impl Display for Error {
             LoadCmdline(e) => write!(f, "error loading command line: {}", e),
             LoadInitrd(e) => write!(f, "error loading initrd: {}", e),
             LoadKernel(e) => write!(f, "error loading Kernel: {}", e),
+            Pstore(e) => write!(f, "failed to allocate pstore region: {}", e),
             RegisterIrqfd(e) => write!(f, "error registering an IrqFd: {}", e),
             RegisterVsock(e) => write!(f, "error registering virtual socket device: {}", e),
             SetLint(e) => write!(f, "failed to set interrupts: {}", e),
@@ -369,6 +371,14 @@ impl arch::LinuxArch for X8664arch {
         let stdio_serial_num =
             Self::setup_serial_devices(&mut vm, &mut io_bus, serial_parameters, serial_jail)?;
 
+        let ramoops_region = match components.pstore {
+            Some(pstore) => Some(
+                arch::pstore::create_memory_region(&mut vm, &mut resources, &pstore)
+                    .map_err(Error::Pstore)?,
+            ),
+            None => None,
+        };
+
         match components.vm_image {
             VmImage::Bios(ref mut bios) => Self::load_bios(&mem, bios)?,
             VmImage::Kernel(ref mut kernel_image) => {
@@ -377,6 +387,25 @@ impl arch::LinuxArch for X8664arch {
                     cmdline.insert_str(&param).map_err(Error::Cmdline)?;
                 }
 
+                // It seems that default record_size is only 4096 byte even if crosvm allocates
+                // more memory. It means that one crash can only 4096 byte.
+                // Set record_size and console_size to 1/4 of allocated memory size.
+                // This configulation is same as the host.
+                if let Some(ramoops_region) = ramoops_region {
+                    let ramoops_opts = [
+                        ("mem_address", ramoops_region.address),
+                        ("mem_size", ramoops_region.size as u64),
+                        ("console_size", (ramoops_region.size / 4) as u64),
+                        ("record_size", (ramoops_region.size / 4) as u64),
+                        ("dump_oops", 1_u64),
+                    ];
+                    for (name, val) in &ramoops_opts {
+                        cmdline
+                            .insert_str(format!("ramoops.{}={:#x}", name, val))
+                            .map_err(Error::Cmdline)?;
+                    }
+                }
+
                 // separate out load_kernel from other setup to get a specific error for
                 // kernel loading
                 let (params, kernel_end) = Self::load_kernel(&mem, kernel_image)?;