From 4eb0cd44fcc57329e83b0c738637913924356b06 Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Wed, 17 Jan 2024 13:04:16 +0000 Subject: [PATCH] cpu-o3: Restrict constraint on number of physical registers Having the number of physical registers matching exactly the number of architectural ones does not guarantee a proper execution as it means the freeList would have 0 registers available for renaming. In this case the worst would happen: renaming would silently stall execution indefinitely. With this change we report the issue to the user and fail execution Change-Id: I1eb968802f1a1a5115012f44b541542a682f887d Signed-off-by: Giacomo Travaglini --- src/cpu/o3/cpu.cc | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc index a93d5bc74d..e161d88daa 100644 --- a/src/cpu/o3/cpu.cc +++ b/src/cpu/o3/cpu.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2012, 2014, 2016, 2017, 2019-2020 ARM Limited + * Copyright (c) 2011-2012, 2014, 2016, 2017, 2019-2020, 2024 Arm Limited * Copyright (c) 2013 Advanced Micro Devices, Inc. * All rights reserved * @@ -193,18 +193,36 @@ CPU::CPU(const BaseO3CPUParams ¶ms) assert(numThreads); const auto ®Classes = params.isa[0]->regClasses(); - assert(params.numPhysIntRegs >= - numThreads * regClasses.at(IntRegClass)->numRegs()); - assert(params.numPhysFloatRegs >= - numThreads * regClasses.at(FloatRegClass)->numRegs()); - assert(params.numPhysVecRegs >= - numThreads * regClasses.at(VecRegClass)->numRegs()); - assert(params.numPhysVecPredRegs >= - numThreads * regClasses.at(VecPredRegClass)->numRegs()); - assert(params.numPhysMatRegs >= - numThreads * regClasses.at(MatRegClass)->numRegs()); - assert(params.numPhysCCRegs >= - numThreads * regClasses.at(CCRegClass)->numRegs()); + panic_if(params.numPhysIntRegs <= + numThreads * regClasses.at(IntRegClass)->numRegs() && + regClasses.at(IntRegClass)->numRegs() != 0, + "Not enough physical registers, consider increasing " + "numPhysIntRegs\n"); + panic_if(params.numPhysFloatRegs <= + numThreads * regClasses.at(FloatRegClass)->numRegs() && + regClasses.at(FloatRegClass)->numRegs() != 0, + "Not enough physical registers, consider increasing " + "numPhysFloatRegs\n"); + panic_if(params.numPhysVecRegs <= + numThreads * regClasses.at(VecRegClass)->numRegs() && + regClasses.at(VecRegClass)->numRegs() != 0, + "Not enough physical registers, consider increasing " + "numPhysVecRegs\n"); + panic_if(params.numPhysVecPredRegs <= + numThreads * regClasses.at(VecPredRegClass)->numRegs() && + regClasses.at(VecPredRegClass)->numRegs() != 0, + "Not enough physical registers, consider increasing " + "numPhysVecPredRegs\n"); + panic_if(params.numPhysMatRegs <= + numThreads * regClasses.at(MatRegClass)->numRegs() && + regClasses.at(MatRegClass)->numRegs() != 0, + "Not enough physical registers, consider increasing " + "numPhysMatRegs\n"); + panic_if(params.numPhysCCRegs <= + numThreads * regClasses.at(CCRegClass)->numRegs() && + regClasses.at(CCRegClass)->numRegs() != 0, + "Not enough physical registers, consider increasing " + "numPhysCCRegs\n"); // Just make this a warning and go ahead anyway, to keep from having to // add checks everywhere.