[SerialICE] New patch to review for serialice: 4540b21 Add CPUID and MSR replayer
Kyösti Mälkki (kyosti.malkki@gmail.com)
gerrit at coreboot.org
Wed Mar 6 20:21:32 CET 2013
Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2593
-gerrit
commit 4540b218ef4dfef245f6b040e1d127eb791c21ef
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date: Wed Mar 6 18:16:53 2013 +0200
Add CPUID and MSR replayer
Previously replayer just copied the lines for CPUID
and RDMSR/WRMSR from the log of Qemu run.
Change-Id: I7230e86e8895f49516f18dbecd45e229c54dadc9
Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
SerialICE/simba/replay.lua | 70 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 69 insertions(+), 1 deletion(-)
diff --git a/SerialICE/simba/replay.lua b/SerialICE/simba/replay.lua
index 1f17f00..3ac0434 100644
--- a/SerialICE/simba/replay.lua
+++ b/SerialICE/simba/replay.lua
@@ -32,6 +32,25 @@ function replay_mem(dir_wr, addr, size, data)
walk_post_hooks(mem_hooks, mem_action)
end
+function replay_msr(dir_wr, addr, hi, lo)
+ pre_action(cpu_action, dir_wr, 0, 0, 0)
+ load_regs(cpu_action.rin, lo, 0, addr, hi)
+ walk_pre_hooks(cpumsr_hooks, cpu_action)
+ post_action(cpu_action, 0)
+ load_regs(cpu_action.rout, lo, 0, addr, hi)
+ walk_post_hooks(cpumsr_hooks, cpu_action)
+end
+
+function replay_cpuid(idx0, idx1, eax, ebx, ecx, edx)
+ pre_action(cpu_action, CPUID, 0, 0, 0)
+ load_regs(cpu_action.rin, idx0, 0, idx1, 0)
+ walk_pre_hooks(cpuid_hooks, cpu_action)
+ post_action(cpu_action, 0)
+ load_regs(cpu_action.rout, eax, ebx, ecx, edx)
+ walk_post_hooks(cpuid_hooks, cpu_action)
+end
+
+
function replay_unknown(str)
local dummy = {}
pre_action(dummy, false, 0, 0, 0)
@@ -77,6 +96,50 @@ function parse_mem(line)
return true
end
+function parse_cpumsr(line)
+ local msr_op = "CPU MSR%:%s+%[(%x+)%]%s+(<?=>?)%s+(%x+).(%x+)"
+ local msr_op_old = "CPU%:%s+[:rdw:]*msr%s+(%x+)%s+(<?=>?)%s+(%x+).(%x+)"
+ local found, ecx, dir, edx, eax
+ found, _, ecx, dir, edx, eax = string.find(line, msr_op)
+ if not found then
+ found, _, ecx, dir, edx, eax = string.find(line, msr_op_old)
+ end
+ if not found then
+ return false
+ end
+ local necx = tonumber(ecx, 16)
+ local nedx = tonumber(edx, 16)
+ local neax = tonumber(eax, 16)
+ if string.find("<=", dir) then
+ replay_msr(true, necx, nedx, neax)
+ else
+ replay_msr(false, necx, nedx, neax)
+ end
+ return true
+end
+
+function parse_cpuid(line)
+ local id_op = "CPUID%: eax%: (%x+)%; ecx%: (%x+) => (%x+).(%x+).(%x+).(%x+)"
+ local id_op_old = "CPU%: CPUID eax%: (%x+)%; ecx%: (%x+) => (%x+).(%x+).(%x+).(%x+)"
+ local found, idx0, idx1, eax, ebx, ecx, edx
+ found, _, idx0, idx1, eax, ebx, ecx, edx = string.find(line, id_op)
+ if not found then
+ found, _, idx0, idx1, eax, ebx, ecx, edx = string.find(line, id_op_old)
+ end
+ if not found then
+ return false
+ end
+ local nidx0 = tonumber(idx0, 16)
+ local nidx1 = tonumber(idx1, 16)
+ local neax = tonumber(eax, 16)
+ local nebx = tonumber(ebx, 16)
+ local necx = tonumber(ecx, 16)
+ local nedx = tonumber(edx, 16)
+ replay_cpuid(nidx0, nidx1, neax, nebx, necx, nedx)
+ return true
+end
+
+
-- Old script already parsed PCI config, synthesize those IOs back.
function parse_pci(line)
local found, bus, dev, fn, reg, dir, data
@@ -191,7 +254,12 @@ function parse_file()
if not found then
found = parse_mem(str)
end
- -- TODO: replay CPU MSR and CPUID lines
+ if not found then
+ found = parse_cpuid(str)
+ end
+ if not found then
+ found = parse_cpumsr(str)
+ end
if not found then
found = replay_unknown(str)
end
More information about the SerialICE
mailing list