from gem5.coherence_protocol import CoherenceProtocol
from gem5.components.boards.x86_board import X86Board
from gem5.components.memory.single_channel import SingleChannelDDR3_1600
from gem5.components.processors.cpu_types import CPUTypes
from gem5.components.processors.simple_processor import (
SimpleProcessor,
)
from gem5.isas import ISA
from gem5.resources.resource import obtain_resource
from gem5.simulate.exit_event import ExitEvent
from gem5.simulate.simulator import Simulator
from gem5.utils.requires import requires
# This runs a check to ensure the gem5 binary is compiled to X86 and to the
# MESI Two Level coherence protocol.
requires(
isa_required=ISA.X86,
)
from gem5.components.cachehierarchies.classic.private_l1_private_l2_walk_cache_hierarchy import (
PrivateL1PrivateL2WalkCacheHierarchy,
)
# Here we setup a MESI Two Level Cache Hierarchy.
cache_hierarchy = PrivateL1PrivateL2WalkCacheHierarchy(
l1d_size="16KiB", l1i_size="16KiB", l2_size="256KiB"
)
# Setup the system memory.
memory = SingleChannelDDR3_1600(size="3GiB")
# Here we setup the processor.
processor = SimpleProcessor(
cpu_type=CPUTypes.ATOMIC,
isa=ISA.X86,
num_cores=2,
)
# Here we setup the board. The X86Board allows for Full-System X86 simulations.
board = X86Board(
clk_freq="3GHz",
processor=processor,
memory=memory,
cache_hierarchy=cache_hierarchy,
)
disk_image = obtain_resource("x86-ubuntu-with-gapbs-img")
board.set_kernel_disk_workload (
kernel = obtain_resource("x86-linux-kernel-6.8.0-52-generic"),
kernel_args = [
"earlyprintk=ttyS0",
"console=ttyS0",
"lpj=7999923",
"root=/dev/sda2"
],
disk_image = disk_image,
readfile_contents = "./gapbs/bfs/ -g 10 -n 10"
)
def exit_event_handler():
print("first exit event: Kernel booted")
yield False
print("second exit event: In after boot")
yield False
print("third exit event: After run script")
yield True
simulator = Simulator(
board=board,
on_exit_event={
# Here we want to override the default behavior for the first m5 exit
# exit event. Instead of exiting the simulator, we just want to
# switch the processor. The 2nd m5 exit after will revert to using
# default behavior where the simulator run will exit.
ExitEvent.EXIT: exit_event_handler(),
},
)
simulator.run()