DSCR(数据流控制寄存器)

powerpc 中的 DSCR 寄存器允许用户对处理器中的数据流预取进行一些控制。请参阅 ISA 文档或相关手册,了解有关如何使用此 DSCR 来获得对预取的控制的更详细信息。本文档概述了内核对 DSCR 的支持、相关的内核对象、其功能和导出的用户界面。

  1. 数据结构

    1. thread_struct

      dscr            /* Thread DSCR value */
      dscr_inherit    /* Thread has changed default DSCR */
      
    2. PACA

      dscr_default    /* per-CPU DSCR default value */
      
    3. sysfs.c

      dscr_default    /* System DSCR default value */
      
  2. 调度程序更改

    如果线程的 dscr_inherit 值已清除(这意味着它尚未更改默认 DSCR),则调度程序会将存储在 CPU 的 PACA 值中的每个 CPU 的 DSCR 默认值写入寄存器。如果设置了 dscr_inherit 值,这意味着它已更改默认 DSCR 值,则调度程序会将更改的值写入寄存器(该值现在将包含在线程结构的 dscr 中),而不是基于每个 CPU 默认的 PACA 的 DSCR 值。

    注意:请注意,系统范围内的全局 DSCR 值永远不会在调度程序进程上下文切换中直接使用。

  3. SYSFS 接口

    • 全局 DSCR 默认值:/sys/devices/system/cpu/dscr_default

    • CPU 特定 DSCR 默认值:/sys/devices/system/cpu/cpuN/dscr

    更改 sysfs 中的全局 DSCR 默认值将立即更改其 PACA 结构中的所有 CPU 特定 DSCR 默认值。 同样,如果当前进程的 dscr_inherit 清除,它也会立即将新值写入每个 CPU 的 DSCR 寄存器,并更新当前线程的 DSCR 值。

    更改 sysfs 中的 CPU 特定 DSCR 默认值与上述操作完全相同,但与上述全局 DSCR 默认值不同,它仅更改该特定 CPU 的内容,而不是系统中所有 CPU 的内容。

  4. 用户空间指令

    可以使用为此目的提供的以下两个 SPR 编号中的任何一个,在用户空间中访问 DSCR 寄存器。

    1. 问题状态 SPR:0x03(非特权,仅 POWER8)

    2. 特权状态 SPR:0x11(特权)

    从用户空间通过特权 SPR 编号 (0x11) 访问 DSCR 有效,因为它是在内核中遵循非法指令异常进行模拟的。 mfspr 和 mtspr 指令都进行了模拟。

    从用户空间通过用户级别 SPR (0x03) 访问 DSCR 将首先创建一个 facility unavailable 异常。 在此异常处理程序中,所有基于 mfspr 指令的读取尝试都将进行模拟并返回,而第一个基于 mtspr 指令的写入尝试将通过在 FSCR 寄存器中设置 DSCR facility 来为下一次启用 DSCR facility(用于读取和写入)。

  5. 关于“dscr_inherit”的细节

    线程结构元素“dscr_inherit”表示有问题的线程是否尝试并使用以下任何方法更改了 DSCR 本身。 此元素表示线程是否要在内核中使用 CPU 默认 DSCR 值或其自身更改的 DSCR 值。

    1. mtspr 指令(SPR 编号 0x03)

    2. mtspr 指令(SPR 编号 0x11)

    3. ptrace 接口(显式设置用户 DSCR 值)

    在此事件之后创建的进程的任何子进程也继承了相同的行为。