Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/56671 )
Change subject: arch-x86: Don't use global variables for ucode ROM labels.
......................................................................
arch-x86: Don't use global variables for ucode ROM labels.
Use a map of strings to MicroPCs. This makes it possible to accumulate
ROM microops from different segments compiled separately.
Change-Id: If5778982efb2a18892c4fc3d26e5172444fcacd8
---
M src/arch/x86/faults.cc
M src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
M src/arch/x86/microcode/romutil.ucode
M src/arch/x86/microcode_rom.hh
M src/arch/x86/ucasmlib/arch/x86/microops/base.py
M src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
M src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
M src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
M src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
M src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
M src/arch/x86/ucasmlib/arch/x86/microops/regop.py
M src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
M src/arch/x86/ucasmlib/arch/x86/microops/specop.py
M src/arch/x86/ucasmlib/arch/x86/rom.py
M src/arch/x86/ucasmlib/arch/x86/symbols.py
15 files changed, 119 insertions(+), 71 deletions(-)
diff --git a/src/arch/x86/faults.cc b/src/arch/x86/faults.cc
index 0249cb3..c25a0a4 100644
--- a/src/arch/x86/faults.cc
+++ b/src/arch/x86/faults.cc
@@ -41,7 +41,7 @@
#include "arch/x86/faults.hh"
#include "arch/x86/insts/static_inst.hh"
-#include "arch/x86/microcode/microcode.hh"
+#include "arch/x86/microcode_rom.hh"
#include "arch/x86/mmu.hh"
#include "arch/x86/regs/misc.hh"
#include "base/loader/symtab.hh"
@@ -67,25 +67,35 @@
PCState pc = tc->pcState().as<PCState>();
DPRINTF(Faults, "RIP %#x: vector %d: %s\n", pc.pc(), vector,
describe());
- using namespace X86ISAInst::rom_labels;
HandyM5Reg m5reg = tc->readMiscRegNoEffect(MISCREG_M5_REG);
MicroPC entry;
if (m5reg.mode == LongMode) {
- entry = extern_label_longModeInterrupt;
+ static MicroPC long_mode_interrupt =
+ X86ISAInst::microcodeRom.getLabel("longModeInterrupt");
+ entry = long_mode_interrupt;
} else {
- if (m5reg.submode == RealMode)
- entry = extern_label_realModeInterrupt;
- else
- entry = extern_label_legacyModeInterrupt;
+ if (m5reg.submode == RealMode) {
+ static MicroPC real_mode_interrupt =
+ X86ISAInst::microcodeRom.getLabel("realModeInterrupt");
+ entry = real_mode_interrupt;
+ } else {
+ static MicroPC legacy_mode_interrupt =
+ X86ISAInst::microcodeRom.getLabel("legacyModeInterrupt");
+ entry = legacy_mode_interrupt;
+ }
}
tc->setIntReg(INTREG_MICRO(1), vector);
Addr cs_base = tc->readMiscRegNoEffect(MISCREG_CS_EFF_BASE);
tc->setIntReg(INTREG_MICRO(7), pc.pc() - cs_base);
if (errorCode != (uint64_t)(-1)) {
if (m5reg.mode == LongMode) {
- entry = extern_label_longModeInterruptWithError;
+ static MicroPC long_mode = X86ISAInst::microcodeRom.getLabel(
+ "longModeInterruptWithError");
+ entry = long_mode;
} else {
- entry = extern_label_legacyModeInterruptWithError;
+ static MicroPC legacy_mode = X86ISAInst::microcodeRom.getLabel(
+ "legacyModeInterruptWithError");
+ entry = legacy_mode;
}
tc->setIntReg(INTREG_MICRO(15), errorCode);
}
@@ -291,7 +301,9 @@
// Update the handy M5 Reg.
tc->setMiscReg(MISCREG_M5_REG, 0);
- MicroPC entry = X86ISAInst::rom_labels::extern_label_initIntHalt;
+ static MicroPC init_int_halt =
+ X86ISAInst::microcodeRom.getLabel("initIntHalt");
+ MicroPC entry = init_int_halt;
pc.upc(romMicroPC(entry));
pc.nupc(romMicroPC(entry) + 1);
tc->pcState(pc);
diff --git
a/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
b/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
index bc2fcb9..c66cca9 100644
--- a/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
+++ b/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
@@ -133,14 +133,14 @@
fault "std::make_shared<GeneralProtection>(0)", flags=(CEZF,)
andi t3, t2, 0xF8, dataSize=8
andi t0, t2, 0x4, flags=(EZF,), dataSize=2
- br rom_local_label("farJmpGlobalDescriptor"), flags=(CEZF,)
+ br "farJmpGlobalDescriptor", flags=(CEZF,)
ld t4, tsl, [1, t0, t3], dataSize=8, addressSize=8, atCPL0=True
- br rom_local_label("farJmpProcessDescriptor")
+ br "farJmpProcessDescriptor"
farJmpGlobalDescriptor:
ld t4, tsg, [1, t0, t3], dataSize=8, addressSize=8, atCPL0=True
farJmpProcessDescriptor:
rcri t0, t4, 13, flags=(ECF,), dataSize=2
- br rom_local_label("farJmpSystemDescriptor"), flags=(nCECF,)
+ br "farJmpSystemDescriptor", flags=(nCECF,)
chks t2, t4, CSCheck, dataSize=8
wrdl cs, t4, t2, dataSize=4
wrsel cs, t2, dataSize=4
diff --git a/src/arch/x86/microcode/romutil.ucode
b/src/arch/x86/microcode/romutil.ucode
index f4ffbb7..7dc26ae 100644
--- a/src/arch/x86/microcode/romutil.ucode
+++ b/src/arch/x86/microcode/romutil.ucode
@@ -51,9 +51,9 @@
srli t10, t4, 16, dataSize=8
andi t5, t10, 0xF8, dataSize=8
andi t0, t10, 0x4, flags=(EZF,), dataSize=2
- br rom_local_label("{start_label}_globalDescriptor"), flags=(CEZF,)
+ br "{start_label}_globalDescriptor", flags=(CEZF,)
ld t3, tsl, [1, t0, t5], dataSize=8, addressSize=8, atCPL0=True
- br rom_local_label("{start_label}_processDescriptor")
+ br "{start_label}_processDescriptor"
{start_label}_globalDescriptor:
ld t3, tsg, [1, t0, t5], dataSize=8, addressSize=8, atCPL0=True
{start_label}_processDescriptor:
@@ -86,17 +86,17 @@
srli t12, t4, 32, dataSize=8
andi t12, t12, 0x7, dataSize=8
subi t0, t12, 1, flags=(ECF,), dataSize=8
- br rom_local_label("{start_label}_istStackSwitch"), flags=(nCECF,)
- br rom_local_label("{start_label}_cplStackSwitch"), flags=(nCEZF,)
+ br "{start_label}_istStackSwitch", flags=(nCECF,)
+ br "{start_label}_cplStackSwitch", flags=(nCEZF,)
# If we're here, it's because the stack isn't being switched.
# Set t6 to the new aligned rsp.
mov t6, t6, rsp, dataSize=8
- br rom_local_label("{start_label}_stackSwitched")
+ br "{start_label}_stackSwitched"
{start_label}_istStackSwitch:
ld t6, tr, [8, t12, t0], 0x1c, dataSize=8, addressSize=8, atCPL0=True
- br rom_local_label("{start_label}_stackSwitched")
+ br "{start_label}_stackSwitched"
{start_label}_cplStackSwitch:
# Get the new rsp from the TSS
@@ -224,9 +224,9 @@
srli t10, t4, 16, dataSize=8
andi t5, t10, 0xF8, dataSize=8
andi t0, t10, 0x4, flags=(EZF,), dataSize=2
- br rom_local_label("{start_label}_globalCS"), flags=(CEZF,)
+ br "{start_label}_globalCS", flags=(CEZF,)
ld t3, tsl, [1, t0, t5], dataSize=8, addressSize=8, atCPL0=True
- br rom_local_label("{start_label}_processCS")
+ br "{start_label}_processCS"
{start_label}_globalCS:
ld t3, tsg, [1, t0, t5], dataSize=8, addressSize=8, atCPL0=True
{start_label}_processCS:
@@ -256,7 +256,7 @@
wrsel cs, t13, dataSize=8
wrdl cs, t3, t13, dataSize=8
- br rom_local_label("{start_label}_noStackSwitch"), flags=(CEZF,)
+ br "{start_label}_noStackSwitch", flags=(CEZF,)
# Get the new ESP from the TSS
ld t6, tr, [8, t10, t0], 4, dataSize=4, addressSize=8, atCPL0=True
@@ -271,9 +271,9 @@
andi t11, t8, 0xF8, dataSize=8
# Check if this is a global or local descriptor.
andi t0, t8, 0x4, flags=(EZF,), dataSize=2
- br rom_local_label("{start_label}_globalSS"), flags=(CEZF,)
+ br "{start_label}_globalSS", flags=(CEZF,)
ld t12, tsl, [1, t0, t11], dataSize=8, addressSize=8, atCPL0=True
- br rom_local_label("{start_label}_processSS")
+ br "{start_label}_processSS"
{start_label}_globalSS:
ld t12, tsg, [1, t0, t11], dataSize=8, addressSize=8, atCPL0=True
{start_label}_processSS:
@@ -284,8 +284,8 @@
rdattr t14, hs, dataSize=8
andi t0, t14, 0x8, flags=(EZF,), dataSize=8
- br rom_local_label("{start_label}_sszIs4Switched"), flags=(nCEZF,)
- br rom_local_label("{start_label}_sszIs2DszIs4Switched"), flags=(CECF,)
+ br "{start_label}_sszIs4Switched", flags=(nCEZF,)
+ br "{start_label}_sszIs2DszIs4Switched", flags=(CECF,)
# ssz = 2, dsz = 2
@@ -308,7 +308,7 @@
wrsel ss, t8, dataSize=8
{error_code_code}, dataSize=2, addressSize=2
- br rom_local_label("{start_label}_doneWithStack")
+ br "{start_label}_doneWithStack"
{start_label}_sszIs2DszIs4Switched:
@@ -333,10 +333,10 @@
wrsel ss, t8, dataSize=8
{error_code_code}, dataSize=4, addressSize=2
- br rom_local_label("{start_label}_doneWithStack")
+ br "{start_label}_doneWithStack"
{start_label}_sszIs4Switched:
- br rom_local_label("{start_label}_sszIs4DszIs4Switched"), flags=(CECF,)
+ br "{start_label}_sszIs4DszIs4Switched", flags=(CECF,)
# ssz = 4, dsz = 2
@@ -358,7 +358,7 @@
wrsel ss, t8, dataSize=8
{error_code_code}, dataSize=2, addressSize=4
- br rom_local_label("{start_label}_doneWithStack")
+ br "{start_label}_doneWithStack"
{start_label}_sszIs4DszIs4Switched:
@@ -382,7 +382,7 @@
wrsel ss, t8, dataSize=8
{error_code_code}, dataSize=2, addressSize=4
- br rom_local_label("{start_label}_doneWithStack")
+ br "{start_label}_doneWithStack"
{start_label}_noStackSwitch:
@@ -391,8 +391,8 @@
rdattr t14, ss, dataSize=8
andi t0, t14, 0x8, flags=(EZF,), dataSize=8
- br rom_local_label("{start_label}_sszIs4"), flags=(nCEZF,)
- br rom_local_label("{start_label}_sszIs2DszIs4"), flags=(CECF,)
+ br "{start_label}_sszIs4", flags=(nCEZF,)
+ br "{start_label}_sszIs2DszIs4", flags=(CECF,)
# Make sure the space on the stack is accessible.
cda ss, [1, t0, rsp], -1, dataSize=1, addressSize=2
@@ -407,7 +407,7 @@
subi rsp, rsp, 6 + {error_code_size} / 2, dataSize=2
{error_code_code}, dataSize=2, addressSize=2
- br rom_local_label("{start_label}_doneWithStack")
+ br "{start_label}_doneWithStack"
{start_label}_sszIs2DszIs4:
@@ -426,10 +426,10 @@
subi rsp, rsp, 12 + {error_code_size}, dataSize=2
{error_code_code}, dataSize=4, addressSize=2
- br rom_local_label("{start_label}_doneWithStack")
+ br "{start_label}_doneWithStack"
{start_label}_sszIs4:
- br rom_local_label("{start_label}_sszIs4DszIs4"), flags=(CECF,)
+ br "{start_label}_sszIs4DszIs4", flags=(CECF,)
# ssz = 4, dsz = 2
@@ -446,7 +446,7 @@
subi rsp, rsp, 6 + {error_code_size} / 2, dataSize=4
{error_code_code}, dataSize=2, addressSize=4
- br rom_local_label("{start_label}_doneWithStack")
+ br "{start_label}_doneWithStack"
{start_label}_sszIs4DszIs4:
@@ -465,7 +465,7 @@
subi rsp, rsp, 12 + {error_code_size}, dataSize=4
{error_code_code}, dataSize=4, addressSize=4
- br rom_local_label("{start_label}_doneWithStack")
+ br "{start_label}_doneWithStack"
{start_label}_doneWithStack:
diff --git a/src/arch/x86/microcode_rom.hh b/src/arch/x86/microcode_rom.hh
index 4dd559e..10e3023 100644
--- a/src/arch/x86/microcode_rom.hh
+++ b/src/arch/x86/microcode_rom.hh
@@ -30,6 +30,8 @@
#define __ARCH_X86_MICROCODE_ROM_HH__
#include <functional>
+#include <map>
+#include <string>
#include <vector>
#include "arch/x86/emulenv.hh"
@@ -45,17 +47,27 @@
class MicrocodeRom
{
- protected:
-
+ public:
+ using Labels = std::map<std::string, MicroPC>;
using GenFunc = std::function<StaticInstPtr(const char *macrocodeBlock,
- const X86ISA::ExtMachInst &machInst, const X86ISA::EmulEnv
&env)>;
+ const Labels &labels, const X86ISA::ExtMachInst &machInst,
+ const X86ISA::EmulEnv &env)>;
+ protected:
std::vector<GenFunc> genFuncs;
+ Labels labels;
+ Labels externs;
public:
//Constructor.
MicrocodeRom();
+ MicroPC
+ getLabel(std::string label)
+ {
+ return externs.at(label);
+ }
+
StaticInstPtr
fetchMicroop(MicroPC micro_pc, StaticInstPtr macroop)
{
@@ -69,11 +81,11 @@
if (macroop) {
auto *x86_macroop =
static_cast<X86ISA::MacroopBase *>(macroop.get());
- return genFuncs[micro_pc]("Microcode_ROM",
+ return genFuncs[micro_pc]("Microcode_ROM", labels,
x86_macroop->getExtMachInst(),
x86_macroop->getEmulEnv());
} else {
- return genFuncs[micro_pc]("Microcode_ROM", DummyExtMachInst,
- DummyEmulEnv);
+ return genFuncs[micro_pc]("Microcode_ROM", labels,
+ DummyExtMachInst, DummyEmulEnv);
}
}
};
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/base.py
b/src/arch/x86/ucasmlib/arch/x86/microops/base.py
index d9ca4c3..b74545b 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/base.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/base.py
@@ -33,18 +33,23 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class X86Microop(object):
- def __init__(self, name):
- self.name = name
+ def __init__(self):
+ self.labels = []
def microFlagsText(self, flags):
wrapped = ("(1ULL << StaticInst::%s)" % flag for flag in flags)
return " | ".join(wrapped)
+ def lookUpLabels(self):
+ labels = [f'static MicroPC {label} = labels.at("{label}");'
+ for label in self.labels]
+ return '\n'.join(labels)
+
def getGenerator(self):
return f'''
- [](const char *macrocodeBlock, const ExtMachInst &machInst,
- const EmulEnv &env)
+ [](const char *macrocodeBlock, const MicrocodeRom::Labels &labels,
+ const ExtMachInst &machInst, const EmulEnv &env)
{{
- using namespace rom_labels;
+ {self.lookUpLabels()}
return {self.getAllocator(["IsMicroop", "IsDelayedCommit"])};
}}'''
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
index ae8817a..f43f0f3 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
@@ -38,6 +38,7 @@
class MicroDebug(X86Microop):
def __init__(self, name, fault, message, once, flags):
+ super().__init__()
self.name = name
self.fault = fault
self.message = message
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
index 5dda099..727a017 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
@@ -68,6 +68,7 @@
def __init__(self, *ops, spm=0,
SetStatus=False, UpdateFTW=True, dataSize="env.dataSize"):
+ super().__init__()
self.ops = list(map(str, ops))
self.spm = spm
self.dataSize = dataSize
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
index c2a5828..69c42f0 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
@@ -44,6 +44,7 @@
def __init__(self, data, segment, addr, disp,
dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec,
uncacheable):
+ super().__init__()
self.data = data
[self.scale, self.index, self.base] = addr
self.disp = disp
@@ -84,6 +85,7 @@
def __init__(self, data, segment, addr, disp,
dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec,
uncacheable):
+ super().__init__()
self.data = data
[self.scale, self.index, self.base] = addr
self.disp = disp
@@ -159,6 +161,7 @@
def __init__(self, segment, addr, disp=0,
dataSize="env.dataSize", addressSize="env.addressSize",
baseFlags="0"):
+ super().__init__()
[self.scale, self.index, self.base] = addr
self.disp = disp
self.segment = segment
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
index 889fa61..4cd81e4 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
@@ -38,6 +38,7 @@
class LimmOp(X86Microop):
def __init__(self, dest, imm, dataSize="env.dataSize"):
+ super().__init__()
self.className = "Limm"
self.mnemonic = "limm"
self.dest = dest
@@ -68,6 +69,7 @@
class LfpimmOp(X86Microop):
def __init__(self, dest, imm, dataSize="env.dataSize"):
+ super().__init__()
self.className = "Lfpimm"
self.mnemonic = "lfpimm"
self.dest = dest
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
index ef91623..d828d5c 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
@@ -61,6 +61,7 @@
def __init__(self, *args, size=None, destSize=None, srcSize=None,
ext=None):
+ super().__init__()
self.args = list(map(str, args))
self.srcSize = None
self.destSize = None
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/regop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/regop.py
index dbd8ef3..b5efbcf 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/regop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/regop.py
@@ -81,6 +81,7 @@
op_class = "IntAluOp"
def __init__(self, *ops, flags=None, dataSize="env.dataSize"):
+ super().__init__()
self.ops = list(map(str, ops))
self.flags = flags
self.dataSize = dataSize
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
index 35e076c..1365501 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
@@ -38,8 +38,10 @@
class Br(X86Microop):
def __init__(self, target, flags=None):
+ super().__init__()
self.className = 'Br'
self.target = target
+ self.labels.append(target)
if flags:
if not isinstance(flags, (list, tuple)):
raise Exception('flags must be a list or tuple of flags')
@@ -62,6 +64,7 @@
class Eret(X86Microop):
def __init__(self, flags=None):
+ super().__init__()
self.className = 'Eret'
if flags:
if not isinstance(flags, (list, tuple)):
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/specop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/specop.py
index fa5066f..b0dd46d 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/specop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/specop.py
@@ -40,6 +40,7 @@
class Fault(X86Microop):
className = 'MicroFault'
def __init__(self, fault, flags=None):
+ super().__init__()
self.fault = fault
if flags:
if not isinstance(flags, (list, tuple)):
@@ -59,9 +60,6 @@
class Halt(X86Microop):
className = 'MicroHalt'
- def __init__(self):
- pass
-
def getAllocator(self, microFlags):
return 'new X86ISA::MicroHalt(machInst, macrocodeBlock, ' \
f'{self.microFlagsText(microFlags)})'
@@ -70,6 +68,7 @@
class MfenceOp(X86Microop):
def __init__(self):
+ super().__init__()
self.className = 'Mfence'
self.mnemonic = 'mfence'
self.instFlags = '| (1ULL << StaticInst::IsReadBarrier)' \
diff --git a/src/arch/x86/ucasmlib/arch/x86/rom.py
b/src/arch/x86/ucasmlib/arch/x86/rom.py
index 74ddeb6..c84fc39 100644
--- a/src/arch/x86/ucasmlib/arch/x86/rom.py
+++ b/src/arch/x86/ucasmlib/arch/x86/rom.py
@@ -28,21 +28,21 @@
class Rom(ucasmlib.containers.Rom):
def getDeclaration(self):
- declareLabels = "namespace rom_labels\n{\n"
- for (label, micropc) in self.labels.items():
- declareLabels += "const static uint64_t label_%s = %d;\n" \
- % (label, micropc)
- for (label, micropc) in self.externs.items():
- declareLabels += \
- "const static MicroPC extern_label_%s = %d;\n" \
- % (label, micropc)
- declareLabels += "}\n"
- return declareLabels;
+ return '';
def getDefinition(self):
elements = map(lambda op: op.getGenerator(), self.microops)
- allocator = "{" + ',\n'.join(elements) + "}"
+ allocator = '{' + ',\n'.join(elements) + '}'
- return '''
-X86ISAInst::MicrocodeRom::MicrocodeRom() : genFuncs(%s) {}
-''' % allocator
+ label_items = list([f'{{ "{label}", romMicroPC({micropc}) }}' for
+ label, micropc in self.labels.items()])
+ extern_items = list([f'{{ "{label}", romMicroPC({micropc}) }}' for
+ label, micropc in self.externs.items()])
+ labels = f'{{ {", ".join(label_items + extern_items)} }}'
+ externs = f'{{ {", ".join(extern_items)} }}'
+
+ return f'''
+X86ISAInst::MicrocodeRom::MicrocodeRom() : genFuncs({allocator}),
+ labels({labels}), externs({externs})
+{{}}
+'''
diff --git a/src/arch/x86/ucasmlib/arch/x86/symbols.py
b/src/arch/x86/ucasmlib/arch/x86/symbols.py
index 0a369e8..7367825 100644
--- a/src/arch/x86/ucasmlib/arch/x86/symbols.py
+++ b/src/arch/x86/ucasmlib/arch/x86/symbols.py
@@ -178,12 +178,8 @@
lambda width: f'adjustedImm = adjustedImm & mask({width});'
symbols["label"] = lambda label_str: f'label_{label_str}'
-
symbols["rom_label"] = \
- lambda label_str: f'romMicroPC(rom_labels::extern_label_{label_str})'
-
-symbols['rom_local_label'] = \
- lambda label_str: f'romMicroPC(rom_labels::label_{label_str})'
+ lambda label_str: f'microcodeRom.getLabel("{label_str}")'
def stack_index(index):
return fpRegIdx(f'NUM_FLOATREGS + ((({index}) + 8) % 8)')
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/56671
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: If5778982efb2a18892c4fc3d26e5172444fcacd8
Gerrit-Change-Number: 56671
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
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