115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  * Copyright (C) 2021 The Android Open Source Project
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *      http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| #pragma once
 | |
| 
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| #include "host/libs/vm_manager/vm_manager.h"
 | |
| 
 | |
| #include "common/libs/fs/shared_fd.h"
 | |
| 
 | |
| namespace cuttlefish {
 | |
| namespace vm_manager {
 | |
| 
 | |
| // Starts a guest VM using the gem5 command directly. It requires the host
 | |
| // package to support the gem5 capability.
 | |
| class Gem5Manager : public VmManager {
 | |
|  public:
 | |
|   static std::string name() { return "gem5"; }
 | |
| 
 | |
|   Gem5Manager(Arch);
 | |
|   virtual ~Gem5Manager() = default;
 | |
| 
 | |
|   bool IsSupported() override;
 | |
|   std::vector<std::string> ConfigureGraphics(
 | |
|       const CuttlefishConfig& config) override;
 | |
|   std::string ConfigureBootDevices(int num_disks) override;
 | |
| 
 | |
|   std::vector<cuttlefish::Command> StartCommands(
 | |
|       const CuttlefishConfig& config) override;
 | |
| 
 | |
|  private:
 | |
|   Arch arch_;
 | |
| };
 | |
| 
 | |
| const std::string fs_header = R"CPP_STR_END(import argparse
 | |
| import devices
 | |
| import os
 | |
| import m5
 | |
| from m5.util import addToPath
 | |
| from m5.objects import *
 | |
| from m5.options import *
 | |
| from common import SysPaths
 | |
| from common import ObjectList
 | |
| from common import MemConfig
 | |
| from common.cores.arm import HPI
 | |
| m5.util.addToPath('../..')
 | |
| )CPP_STR_END";
 | |
| 
 | |
| const std::string fs_mem_pci = R"CPP_STR_END(
 | |
|   MemConfig.config_mem(args, root.system)
 | |
| 
 | |
|   pci_devices = []
 | |
|   pci_devices.append(PciVirtIO(vio=VirtIOConsole(device=Terminal(number=0))))
 | |
|   pci_devices.append(PciVirtIO(vio=VirtIOConsole(device=Terminal(number=1, outfile="none"))))
 | |
|   pci_devices.append(PciVirtIO(vio=VirtIOConsole(device=Terminal(number=2))))
 | |
|   pci_devices.append(PciVirtIO(vio=VirtIOConsole(device=Terminal(number=3, outfile="none"))))
 | |
|   pci_devices.append(PciVirtIO(vio=VirtIOConsole(device=Terminal(number=4, outfile="none"))))
 | |
|   pci_devices.append(PciVirtIO(vio=VirtIOConsole(device=Terminal(number=5, outfile="none"))))
 | |
|   pci_devices.append(PciVirtIO(vio=VirtIOConsole(device=Terminal(number=6, outfile="none"))))
 | |
| 
 | |
|   for each_item in args.disk_image:
 | |
|     disk_image = CowDiskImage()
 | |
|     disk_image.child.image_file = SysPaths.disk(each_item)
 | |
|     pci_devices.append(PciVirtIO(vio=VirtIOBlock(image=disk_image)))
 | |
| 
 | |
|   root.system.pci_devices = pci_devices
 | |
|   for pci_device in root.system.pci_devices:
 | |
|     root.system.attach_pci(pci_device)
 | |
| 
 | |
|   root.system.connect()
 | |
| )CPP_STR_END";
 | |
| 
 | |
| const std::string fs_kernel_cmd = R"CPP_STR_END(
 | |
|   kernel_cmd = [
 | |
|     "lpj=19988480",
 | |
|     "norandmaps",
 | |
|     "mem=%s" % args.mem_size,
 | |
|     "console=hvc0",
 | |
|     "panic=-1",
 | |
|     "earlycon=pl011,mmio32,0x1c090000",
 | |
|     "audit=1",
 | |
|     "printk.devkmsg=on",
 | |
|     "firmware_class.path=/vendor/etc/",
 | |
|     "kfence.sample_interval=500",
 | |
|     "loop.max_part=7",
 | |
|     "bootconfig",
 | |
|     "androidboot.force_normal_boot=1",
 | |
|   ]
 | |
|   root.system.workload.command_line = " ".join(kernel_cmd)
 | |
|   m5.instantiate()
 | |
|   sys.exit(m5.simulate().getCode())
 | |
| )CPP_STR_END";
 | |
| 
 | |
| const std::string fs_exe_main = R"CPP_STR_END(
 | |
| if __name__ == "__m5_main__":
 | |
|   main()
 | |
| )CPP_STR_END";
 | |
| 
 | |
| } // namespace vm_manager
 | |
| } // namespace cuttlefish
 |