【问题标题】:Is it possible to see smbase in simics?是否可以在 simics 中看到 smbase?
【发布时间】:2021-09-07 20:41:25
【问题描述】:

This post 向我展示了如何在 SMM 中查看内容。而且我注意到 Simics 显示了其他通常“隐藏”的寄存器,例如段描述符影子值,它们只能间接更新。那么有没有可能在 Simics 中看到“smbase”寄存器呢?

【问题讨论】:

    标签: simics


    【解决方案1】:

    要读取一个 MSR,目前您需要在处理器上使用接口调用。 “%”运算符读取当前处理器上的命名寄存器。调用 iface 会检查任何处理器对象,并且适用于仅具有数量的 MSR。

    使用在线帮助了解如何使用该界面。例如:

    simics> @conf.board.mb.cpu0.core[0][0].iface.x86_msr.get_number("IA32_TSC_DEADLINE")
    1760
    simics> api-help x86_msr_interface_t 
    Help on API keyword "x86_msr_interface_t":
    
    DESCRIPTION
    
    
    SIM_INTERFACE(x86_msr) {
            void (*register_handlers)(
                    conf_object_t *cpu,
                    int64 number,
                    x86_msr_getter_func_t getter,
                    lang_void *getter_data,
                    x86_msr_setter_func_t setter,
                    lang_void *setter_data,
    ...
    

    添加检查命令在愿望清单上。

    更新。

    该界面还提供了从号码查找名称的功能。对于 MSR 0x9E,IA32_SMBASE,在 Public Simics 的“客户端”核心上,查找名称会得到:

    simics> @conf.board.mb.cpu0.core[0][0].iface.x86_msr.get_name(158)
    'msr_ia32_smbase'
    simics> @conf.board.mb.cpu0.core[0]0].iface.x86_msr.get_number("msr_ia32_smbase")
    158
    

    由于历史原因,该寄存器称为 msr_ia32_smbase,而不是手册中的 IA32_SMBASE。一般来说,按数字查找更可靠一些。特别是因为许多 MSR 在 Simics 模型中只有当前设置的数字。

    【讨论】:

    • 有趣的是,您的示例不适用于 smbase MSR? simics> @conf.board.mb.cpu0.core[0][0].iface.x86_msr.get_number("IA32_SMBASE") -1
    • 已更新以查找 SMBASE 寄存器内容。
    【解决方案2】:

    首先,您可以使用 apropos 命令(简称a)在加载的配置中搜索特定字符串。由于 smbase 很可能通过属性公开,因此它看起来像 a -a smbase。如果配置中有任何“smbase”,您将看到它。

    我加载了 QSP-x86 Firststeps 平台并在表单上获得了多次点击

    <cpu-class>.msr_ia32_smbase
    

    此外,一般而言,它有助于了解特定事物的上下文。这样 smbase 就是 MSR 的“一部分”。

    【讨论】:

    • 啊,我一直在使用帮助搜索(我假设它扮演了 apropos 通常扮演的角色,看起来我是对的,因为它们是同义词),但我实际上并没有看过在它的帮助下,所以我还没有看到 -a 选项。另外,有趣的是,当我在 firststeps.simics 中运行“a -a smbase”时,我得到“在任何文档中都找不到文本 'smbase'”。所以我之所以提到这一点,是因为这让我有点不知所措。在我们讨论的同时,我如何阅读 Simics 中的 MSR?我看到属性、接口和 HAP,但没有读取它们的命令?)
    • 好的,我发现“board.mb.cpu0.core[0][0].msrs”可以打印所有个 MSR,但我如何只打印一个?跨度>
    • 好的,我发现我实际上可以使用 "print -x %msr_ia32_smbase" !我把它弄得太复杂了,认为需要一些东西来填充那个 前缀。
    • 怎么样,“输出基数 16 4”然后是“%msr_ia32_smbase”
    猜你喜欢
    • 2022-08-22
    • 1970-01-01
    • 2011-03-15
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多