Bobby R. Bruce has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/51949 )
Change subject: stdlib: Create 'KernelDiskWorkload' abstract class
......................................................................
stdlib: Create 'KernelDiskWorkload' abstract class
The purpose of this class is to:
* Create a standard way to set a typical kernel/disk image workload.
* Cleans up the manner in which readfile values/contents are set.
* Allows a user to specify their own kernel arguments, but still sets
sensible defaults.
As of this commit, this interface has been added to the X86Board and the
RISCVBoard.
Change-Id: I34f4c2b829f1ae5c1cae12039436cbb345a89d09
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/51949
Reviewed-by: Bobby R. Bruce <bbr...@ucdavis.edu>
Maintainer: Bobby R. Bruce <bbr...@ucdavis.edu>
Tested-by: kokoro <noreply+kok...@google.com>
---
M configs/example/gem5_library/riscv-fs.py
M src/python/gem5/components/boards/riscv_board.py
M tests/gem5/configs/boot_kvm_fork_run.py
M tests/gem5/configs/parsec_disk_run.py
M tests/gem5/configs/boot_kvm_switch_exit.py
M src/python/SConscript
M configs/example/gem5_library/x86-ubuntu-run.py
M src/python/gem5/components/boards/x86_board.py
M tests/gem5/configs/riscv_boot_exit_run.py
A src/python/gem5/components/boards/kernel_disk_workload.py
M tests/gem5/configs/x86_boot_exit_run.py
11 files changed, 290 insertions(+), 173 deletions(-)
Approvals:
Bobby R. Bruce: Looks good to me, approved; Looks good to me, approved
kokoro: Regressions pass
diff --git a/configs/example/gem5_library/riscv-fs.py
b/configs/example/gem5_library/riscv-fs.py
index 762743c..35a7250 100644
--- a/configs/example/gem5_library/riscv-fs.py
+++ b/configs/example/gem5_library/riscv-fs.py
@@ -81,8 +81,10 @@
board.connect_things()
# Set the Full System workload.
-board.set_workload(disk_image=Resource("riscv-disk-img"),
- bootloader=Resource("riscv-bootloader-vmlinux-5.10"))
+board.set_kernel_disk_workload(
+ kernel=Resource("riscv-bootloader-vmlinux-5.10"),
+ disk_image=Resource("riscv-disk-img"),
+)
root = Root(full_system=True, system=board)
diff --git a/configs/example/gem5_library/x86-ubuntu-run.py
b/configs/example/gem5_library/x86-ubuntu-run.py
index 17cabcb..860707a 100644
--- a/configs/example/gem5_library/x86-ubuntu-run.py
+++ b/configs/example/gem5_library/x86-ubuntu-run.py
@@ -107,8 +107,8 @@
board.connect_things()
# Here we set the Full System workload.
-# The `set_workload` function for the X86Board takes a kernel, a disk
image,
-# and, optionally, a command to run.
+# The `set_kernel_disk_workload` function for the X86Board takes a kernel,
a
+# disk image, and, optionally, a command to run.
# This is the command to run after the system has booted. The first `m5
exit`
# will stop the simulation so we can switch the CPU cores from KVM to
timing
@@ -121,7 +121,7 @@
+ "sleep 1;" \
+ "m5 exit;"
-board.set_workload(
+board.set_kernel_disk_workload(
# The x86 linux kernel will be automatically downloaded to the
# `tests/gem5/resources` directory if not already present.
kernel=Resource(
@@ -158,9 +158,10 @@
),
override=True,
),
- command=command,
+ readfile_contents=command,
)
+
root = Root(full_system=True, system=board)
root.sim_quantum = int(1e9) # sim_quantum must be st if KVM cores are
used.
diff --git a/src/python/SConscript b/src/python/SConscript
index e750829..db564ef 100644
--- a/src/python/SConscript
+++ b/src/python/SConscript
@@ -40,6 +40,8 @@
PySource('gem5.components.boards', 'gem5/components/boards/simple_board.py')
PySource('gem5.components.boards', 'gem5/components/boards/test_board.py')
PySource('gem5.components.boards', 'gem5/components/boards/x86_board.py')
+PySource('gem5.components.boards',
+ "gem5/components/boards/kernel_disk_workload.py")
PySource('gem5.components.cachehierarchies',
'gem5/components/cachehierarchies/__init__.py')
PySource('gem5.components.cachehierarchies',
diff --git a/src/python/gem5/components/boards/kernel_disk_workload.py
b/src/python/gem5/components/boards/kernel_disk_workload.py
new file mode 100644
index 0000000..424d839
--- /dev/null
+++ b/src/python/gem5/components/boards/kernel_disk_workload.py
@@ -0,0 +1,178 @@
+# Copyright (c) 2021 The Regents of the University of California
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from abc import abstractmethod
+
+from ...resources.resource import AbstractResource
+
+from typing import List, Optional
+import os
+
+import m5
+
+class KernelDiskWorkload:
+ """
+ The purpose of this abstract class is to enable a full-system boot
+ consisting of of a kernel which will then load a disk image.
+
+ For this to function correctly, the KernelDiskWorkload class should be
+ added as a superclass to a board and the abstract methods implemented.
+ E.g.:
+
+ ```
+ class X86Board(AbstractBoard, KernelDiskWorkload):
+ ...
+ @overrides(KernelDiskWorkload)
+ def get_default_kernel_args(self) -> List[str]:
+ return [
+ "earlyprintk=ttyS0",
+ "console=ttyS0",
+ "lpj=7999923",
+ "root={root_value}",
+ ]
+ ...
+ ```
+
+ Notes
+ -----
+
+ * This assumes only one disk is set.
+ * This assumes the Linux kernel is used.
+ """
+
+ @abstractmethod
+ def get_default_kernel_args(self) -> List[str]:
+ """
+ Returns a default list of arguments for the workload kernel. We
assume
+ the following strings may be used as placeholders, to be replaced
when
+ `set_kernel_disk_workload` is executed:
+
+ * `{root_value}` : set to `get_default_kernel_root_val()`.
+
+ :returns: A default list of arguments for the workload kernel.
+ """
+ raise NotImplementedError
+
+ @abstractmethod
+ def get_disk_device(self) -> str:
+ """
+ Get the disk device, e.g., "/dev/sda", where the disk image is
placed.
+
+ :returns: The disk device.
+ """
+ raise NotImplementedError
+
+ @abstractmethod
+ def _add_disk_to_board(self, disk_image: AbstractResource) -> None:
+ """
+ Sets the configuration needed to add the disk image to the board.
+
+ **Note:** This will be executed at the end of the
+ `set_kernel_disk_workload` function.
+
+ :param disk_image: The disk image to add to the system.
+ """
+ raise NotImplementedError
+
+ def get_disk_root_partition(
+ cls, disk_image: AbstractResource
+ ) -> Optional[str]:
+ """
+ Obtains the root partition of a disk image by inspecting the
resource's
+ metadata.
+
+ :returns: The disk image's root partition.
+ """
+ try:
+ return disk_image.get_metadata()["additional_metadata"][
+ "root_partition"
+ ]
+ except KeyError:
+ return None
+
+ def get_default_kernel_root_val(self, disk_image: AbstractResource) ->
str:
+ """
+ Get the default kernel root value to be passed to the kernel. This
is
+ determined by the value implemented in the `get_disk_device()`
+ function, and the disk image partition, obtained from
+ `get_disk_root_partition()`
+
+
+ :param disk_image: The disk image to be added to the system.
+ :returns: The default value for the 'root' argument to be passed
to the
+ kernel.
+ """
+ return self.get_disk_device() + (
+ self.get_disk_root_partition(disk_image) or ""
+ )
+
+ def set_kernel_disk_workload(
+ self,
+ kernel: AbstractResource,
+ disk_image: AbstractResource,
+ readfile: Optional[str] = None,
+ readfile_contents: Optional[str] = None,
+ kernel_args: Optional[List[str]] = None,
+ ) -> None:
+ """
+ This function allows the setting of a full-system run with a Kernel
+ and a disk image.
+
+ :param kernel: The kernel to boot.
+ :param disk_image: The disk image to mount.
+ :param readfile: An optional parameter stating the file to be read
by
+ by `m5 readfile`.
+ :param readfile_contents: An optional parameter stating the
contents of
+ the readfile file. If set with `readfile`, the contents of
`readfile`
+ will be overwritten with `readfile_contents`, otherwise a new file
will
+ be created with the value of `readfile_contents`.
+ :param kernel_args: An optional parameter for setting arguments to
be
+ passed to the kernel. By default set to
`get_default_kernel_args()`.
+ """
+
+ # Set the kernel to use.
+ self.workload.object_file = kernel.get_local_path()
+
+ # Set the arguments to be passed to the kernel.
+ self.workload.command_line = (
+ " ".join(kernel_args or self.get_default_kernel_args())
+ ).format(
+
root_value=self.get_default_kernel_root_val(disk_image=disk_image)
+ )
+
+ # Set the readfile.
+ if readfile:
+ self.readfile = readfile
+ elif readfile_contents:
+ self.readfile = os.path.join(m5.options.outdir, "readfile")
+
+ # Add the contents to the readfile, if specified.
+ if readfile_contents:
+ file = open(self.readfile, "w+")
+ file.write(readfile_contents)
+ file.close()
+
+ self._add_disk_to_board(disk_image=disk_image)
diff --git a/src/python/gem5/components/boards/riscv_board.py
b/src/python/gem5/components/boards/riscv_board.py
index 3fc15cb..18c742e 100644
--- a/src/python/gem5/components/boards/riscv_board.py
+++ b/src/python/gem5/components/boards/riscv_board.py
@@ -25,10 +25,12 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import os
-from typing import Optional, List
+
+from typing import List
from ...utils.override import overrides
from .abstract_board import AbstractBoard
+from .kernel_disk_workload import KernelDiskWorkload
from ..processors.abstract_processor import AbstractProcessor
from ..memory.abstract_memory_system import AbstractMemorySystem
from ..cachehierarchies.abstract_cache_hierarchy import
AbstractCacheHierarchy
@@ -65,7 +67,7 @@
)
-class RiscvBoard(AbstractBoard):
+class RiscvBoard(AbstractBoard, KernelDiskWorkload):
"""
A board capable of full system simulation for RISC-V
@@ -204,73 +206,6 @@
# Incorporate the memory into the motherboard.
self.get_memory().incorporate_memory(self)
- def set_workload(
- self, bootloader: AbstractResource, disk_image: AbstractResource,
- command: Optional[str] = None
- ) -> None:
- """Setup the full system files
-
- See http://resources.gem5.org/resources/riscv-fs for the currently
- tested kernels and OSes.
-
- The command is an optional string to execute once the OS is fully
- booted, assuming the disk image is setup to run `m5 readfile` after
- booting.
-
- After the workload is set up, this functino will generate the
device
- tree file and output it to the output directory.
-
- **Limitations**
- * Only supports a Linux kernel
- * Disk must be configured correctly to use the command option
- * This board doesn't support the command option
-
- :param bootloader: The resource encapsulating the compiled
bootloader
- with the kernel as a payload
- :param disk_image: The resource encapsulating the disk image
containing
- the OS data. The first partition should be the root partition.
- :param command: The command(s) to run with bash once the OS is
booted
- """
-
- self.workload.object_file = bootloader.get_local_path()
-
- image = CowDiskImage(
- child=RawDiskImage(read_only=True), read_only=False
- )
- image.child.image_file = disk_image.get_local_path()
- self.disk.vio.image = image
-
- # Determine where the root exists in the disk image. This is done
by
- # inspecting the resource metadata.
- root_val = "/dev/vda"
- try:
- partition_val =
disk_image.get_metadata()["additional_metadata"]\
- ["root_partition"]
- except KeyError:
- partition_val = None
-
- if partition_val is not None:
- root_val += partition_val
-
- self.workload.command_line = f"console=ttyS0 root={root_val} ro"
-
- # Note: This must be called after set_workload because it looks
for an
- # attribute named "disk" and connects
- self._setup_io_devices()
-
- self._setup_pma()
-
- # Default DTB address if bbl is built with --with-dts option
- self.workload.dtb_addr = 0x87E00000
-
- # We need to wait to generate the device tree until after the disk
is
- # set up. Now that the disk and workload are set, we can generate
the
- # device tree file.
- self.generate_device_tree(m5.options.outdir)
- self.workload.dtb_filename = os.path.join(
- m5.options.outdir, "device.dtb"
- )
-
def generate_device_tree(self, outdir: str) -> None:
"""Creates the dtb and dts files.
@@ -419,3 +354,33 @@
fdt.add_rootnode(root)
fdt.writeDtsFile(os.path.join(outdir, "device.dts"))
fdt.writeDtbFile(os.path.join(outdir, "device.dtb"))
+
+ @overrides(KernelDiskWorkload)
+ def get_disk_device(self):
+ return "/dev/vda"
+
+ @overrides(KernelDiskWorkload)
+ def _add_disk_to_board(self, disk_image: AbstractResource):
+ image = CowDiskImage(
+ child=RawDiskImage(read_only=True), read_only=False
+ )
+ image.child.image_file = disk_image.get_local_path()
+ self.disk.vio.image = image
+
+ # Note: The below is a bit of a hack. We need to wait to generate
the
+ # device tree until after the disk is set up. Now that the disk and
+ # workload are set, we can generate the device tree file.
+ self._setup_io_devices()
+ self._setup_pma()
+
+ # Default DTB address if bbl is built with --with-dts option
+ self.workload.dtb_addr = 0x87E00000
+
+ self.generate_device_tree(m5.options.outdir)
+ self.workload.dtb_filename = os.path.join(
+ m5.options.outdir, "device.dtb"
+ )
+
+ @overrides(KernelDiskWorkload)
+ def get_default_kernel_args(self) -> List[str]:
+ return ["console=ttyS0", "root={root_value}", "ro"]
diff --git a/src/python/gem5/components/boards/x86_board.py
b/src/python/gem5/components/boards/x86_board.py
index a32ee7d..fe8ad5f 100644
--- a/src/python/gem5/components/boards/x86_board.py
+++ b/src/python/gem5/components/boards/x86_board.py
@@ -25,14 +25,13 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+from .kernel_disk_workload import KernelDiskWorkload
from ...resources.resource import AbstractResource
from ...utils.override import overrides
from .abstract_board import AbstractBoard
from ...isas import ISA
-import m5
from m5.objects import (
- Cache,
Pc,
AddrRange,
X86FsLinux,
@@ -64,7 +63,7 @@
from typing import List, Optional, Sequence
-class X86Board(AbstractBoard):
+class X86Board(AbstractBoard, KernelDiskWorkload):
"""
A board capable of full system simulation for X86.
@@ -263,84 +262,6 @@
# Incorporate the memory into the motherboard.
self.get_memory().incorporate_memory(self)
-
- def set_workload(
- self,
- kernel: AbstractResource,
- disk_image: AbstractResource,
- command: Optional[str] = None,
- kernel_args: List[str] = [],
- ):
- """Setup the full system files
-
- See <url> for the currently tested kernels and OSes.
-
- The command is an optional string to execute once the OS is fully
- booted, assuming the disk image is setup to run `m5 readfile` after
- booting.
-
- **Limitations**
- * Only supports a Linux kernel
- * Disk must be configured correctly to use the command option
-
- :param kernel: The compiled kernel binary resource
- :param disk_image: A disk image resource containing the OS data.
The
- first partition should be the root partition.
- :param command: The command(s) to run with bash once the OS is
booted
- :param kernel_args: Additional arguments to be passed to the
kernel.
- `earlyprintk=ttyS0 console=ttyS0 lpj=7999923
- root=/dev/hda<partition_val>` are already passed
(`<partition_val>` is
- automatically inferred from resource metadata). This parameter is
used
- to pass additional arguments.
- """
-
- # Set the Linux kernel to use.
- self.workload.object_file = kernel.get_local_path()
-
- # Determine where the root exists in the disk image. This is done
by
- # inspecting the resource metadata.
- root_val = "/dev/hda"
- try:
- partition_val =
disk_image.get_metadata()["additional_metadata"]\
- ["root_partition"]
- except KeyError:
- partition_val = None
-
- if partition_val is not None:
- root_val += partition_val
-
- # Options specified on the kernel command line.
- self.workload.command_line = " ".join(
- [
- "earlyprintk=ttyS0",
- "console=ttyS0",
- "lpj=7999923",
- f"root={root_val}",
- ] + kernel_args
- )
-
- # Create the Disk image SimObject.
- ide_disk = IdeDisk()
- ide_disk.driveID = "device0"
- ide_disk.image = CowDiskImage(
- child=RawDiskImage(read_only=True), read_only=False
- )
- ide_disk.image.child.image_file = disk_image.get_local_path()
-
- # Attach the SimObject to the system.
- self.pc.south_bridge.ide.disks = [ide_disk]
-
- # Set the script to be passed to the simulated system to execute
after
- # boot.
- if command:
- file_name = os.path.join(m5.options.outdir, "run")
- bench_file = open(file_name, "w+")
- bench_file.write(command)
- bench_file.close()
-
- # Set to the system readfile
- self.readfile = file_name
-
@overrides(AbstractBoard)
def has_io_bus(self) -> bool:
return True
@@ -382,3 +303,28 @@
data_range, # All data
AddrRange(0xC0000000, size=0x100000), # For I/0
]
+
+ @overrides(KernelDiskWorkload)
+ def get_disk_device(self):
+ return "/dev/hda"
+
+ @overrides(KernelDiskWorkload)
+ def _add_disk_to_board(self, disk_image: AbstractResource):
+ ide_disk = IdeDisk()
+ ide_disk.driveID = "device0"
+ ide_disk.image = CowDiskImage(
+ child=RawDiskImage(read_only=True), read_only=False
+ )
+ ide_disk.image.child.image_file = disk_image.get_local_path()
+
+ # Attach the SimObject to the system.
+ self.pc.south_bridge.ide.disks = [ide_disk]
+
+ @overrides(KernelDiskWorkload)
+ def get_default_kernel_args(self) -> List[str]:
+ return [
+ "earlyprintk=ttyS0",
+ "console=ttyS0",
+ "lpj=7999923",
+ "root={root_value}",
+ ]
diff --git a/tests/gem5/configs/boot_kvm_fork_run.py
b/tests/gem5/configs/boot_kvm_fork_run.py
index e9f0172..507acee 100644
--- a/tests/gem5/configs/boot_kvm_fork_run.py
+++ b/tests/gem5/configs/boot_kvm_fork_run.py
@@ -204,7 +204,7 @@
motherboard.connect_things()
# Set the Full System workload.
-motherboard.set_workload(
+motherboard.set_kernel_disk_workload(
kernel=Resource(
"x86-linux-kernel-5.4.49",
override=args.override_download,
@@ -215,7 +215,7 @@
override=args.override_download,
resource_directory=args.resource_directory,
),
- command=dedent(
+ readfile_contents=dedent(
"""
m5 exit # signal end of boot
m5 exit # exit in children and parent
diff --git a/tests/gem5/configs/boot_kvm_switch_exit.py
b/tests/gem5/configs/boot_kvm_switch_exit.py
index 79f3d86..ebced75 100644
--- a/tests/gem5/configs/boot_kvm_switch_exit.py
+++ b/tests/gem5/configs/boot_kvm_switch_exit.py
@@ -186,10 +186,10 @@
motherboard.connect_things()
-additional_kernal_args = [args.kernel_args]
+kernal_args = motherboard.get_default_kernel_args() + [args.kernel_args]
# Set the Full System workload.
-motherboard.set_workload(
+motherboard.set_kernel_disk_workload(
kernel=Resource(
"x86-linux-kernel-5.4.49",
override=args.override_download,
@@ -201,8 +201,8 @@
resource_directory=args.resource_directory,
),
# The first exit signals to switch processors.
- command="m5 exit\nm5 exit\n",
- kernel_args=additional_kernal_args,
+ readfile_contents="m5 exit\nm5 exit\n",
+ kernel_args=kernal_args,
)
diff --git a/tests/gem5/configs/parsec_disk_run.py
b/tests/gem5/configs/parsec_disk_run.py
index 401e88a..d3157bb 100644
--- a/tests/gem5/configs/parsec_disk_run.py
+++ b/tests/gem5/configs/parsec_disk_run.py
@@ -234,7 +234,7 @@
+ "m5 exit \n"
)
-board.set_workload(
+board.set_kernel_disk_workload(
kernel=Resource(
"x86-linux-kernel-5.4.49",
resource_directory=args.resource_directory,
@@ -245,7 +245,7 @@
resource_directory=args.resource_directory,
override=args.override_download,
),
- command=command,
+ readfile_contents=command,
)
print("Running with ISA: " + get_runtime_isa().name)
diff --git a/tests/gem5/configs/riscv_boot_exit_run.py
b/tests/gem5/configs/riscv_boot_exit_run.py
index 1798e4d..b50e141 100644
--- a/tests/gem5/configs/riscv_boot_exit_run.py
+++ b/tests/gem5/configs/riscv_boot_exit_run.py
@@ -153,14 +153,14 @@
board.connect_things()
# Set the Full System workload.
-board.set_workload(
- disk_image=Resource(
- "riscv-disk-img",
+board.set_kernel_disk_workload(
+ kernel=Resource(
+ "riscv-bootloader-vmlinux-5.10",
override=args.override_download,
resource_directory=args.resource_directory,
),
- bootloader=Resource(
- "riscv-bootloader-vmlinux-5.10",
+ disk_image=Resource(
+ "riscv-disk-img",
override=args.override_download,
resource_directory=args.resource_directory,
),
diff --git a/tests/gem5/configs/x86_boot_exit_run.py
b/tests/gem5/configs/x86_boot_exit_run.py
index fcd29e9..9f54967 100644
--- a/tests/gem5/configs/x86_boot_exit_run.py
+++ b/tests/gem5/configs/x86_boot_exit_run.py
@@ -194,12 +194,12 @@
motherboard.connect_things()
-additional_kernal_args = []
+kernal_args = motherboard.get_default_kernel_args()
if args.boot_type == "init":
- additional_kernal_args.append("init=/root/exit.sh")
+ kernal_args.append("init=/root/exit.sh")
# Set the Full System workload.
-motherboard.set_workload(
+motherboard.set_kernel_disk_workload(
kernel=Resource(
"x86-linux-kernel-5.4.49",
override=args.override_download,
@@ -210,7 +210,7 @@
override=args.override_download,
resource_directory=args.resource_directory,
),
- kernel_args=additional_kernal_args,
+ kernel_args=kernal_args,
)
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/51949
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I34f4c2b829f1ae5c1cae12039436cbb345a89d09
Gerrit-Change-Number: 51949
Gerrit-PatchSet: 13
Gerrit-Owner: Bobby R. Bruce <bbr...@ucdavis.edu>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-Reviewer: Bobby R. Bruce <bbr...@ucdavis.edu>
Gerrit-Reviewer: Jason Lowe-Power <ja...@lowepower.com>
Gerrit-Reviewer: Jason Lowe-Power <power...@gmail.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s