Linux/PA-RISC 的寄存器使用¶
[ 星号表示计划使用,但目前尚未实现 ]
ABI 指定的通用寄存器¶
控制寄存器¶
CR 0 (恢复计数器) |
用于 ptrace |
CR 1-CR 7(未定义) |
未使用 |
CR 8 (保护 ID) |
每个进程的值* |
CR 9, 12, 13 (PIDS) |
未使用 |
CR10 (CCR) |
延迟 FPU 保存* |
CR11 |
由 ABI 指定 (SAR) |
CR14 (中断向量) |
初始化为 fault_vector |
CR15 (EIEM) |
初始化为全 1* |
CR16 (间隔定时器) |
读取以获取周期计数/写入以启动间隔定时器 |
CR17-CR22 |
中断参数 |
CR19 |
中断指令寄存器 |
CR20 |
中断空间寄存器 |
CR21 |
中断偏移寄存器 |
CR22 |
中断 PSW |
CR23 (EIRR) |
读取以获取挂起的中断/写入以清除位 |
CR24 (TR 0) |
内核空间页目录指针 |
CR25 (TR 1) |
用户空间页目录指针 |
CR26 (TR 2) |
未使用 |
CR27 (TR 3) |
线程描述符指针 |
CR28 (TR 4) |
未使用 |
CR29 (TR 5) |
未使用 |
CR30 (TR 6) |
当前 / 0 |
CR31 (TR 7) |
临时寄存器,用于各种地方 |
空间寄存器(内核模式)¶
SR0 |
临时空间寄存器 |
SR4-SR7 |
设置为 0 |
SR1 |
临时空间寄存器 |
SR2 |
内核不应破坏它 |
SR3 |
用于用户空间访问(当前进程) |
空间寄存器(用户模式)¶
SR0 |
临时空间寄存器 |
SR1 |
临时空间寄存器 |
SR2 |
保存 linux 网关页面的空间 |
SR3 |
在内核中保存用户地址空间值 |
SR4-SR7 |
定义用户/内核的短地址空间 |
处理器状态字¶
W (64 位地址) |
0 |
E (小端) |
0 |
S (安全间隔定时器) |
0 |
T (已采取分支陷阱) |
0 |
H (更高权限陷阱) |
0 |
L (较低权限陷阱) |
0 |
N (无效化下一条指令) |
C 代码使用 |
X (数据内存断点禁用) |
0 |
B (已采取分支) |
C 代码使用 |
C (代码地址转换) |
1, 0 在执行实模式代码时 |
V (除法步骤校正) |
C 代码使用 |
M (HPMC 掩码) |
0, 1 在执行 HPMC 处理程序时* |
C/B (进位/借位位) |
C 代码使用 |
O (有序引用) |
1* |
F (性能监视器) |
0 |
R (恢复计数器陷阱) |
0 |
Q (收集中断状态) |
1 (在直接位于 rfi 之前的代码中为 0) |
P (保护标识符) |
1* |
D (数据地址转换) |
1, 0 在执行实模式代码时 |
I (外部中断掩码) |
cli()/sti() 宏使用 |
“不可见”寄存器¶
PSW 默认 W 值 |
0 |
PSW 默认 E 值 |
0 |
影子寄存器 |
中断处理程序代码使用 |
TOC 使能位 |
1 |
PA-RISC 架构定义了 7 个寄存器作为“影子寄存器”。这些寄存器在 RETURN FROM INTERRUPTION AND RESTORE 指令中使用,通过消除中断处理程序中通用寄存器 (GR) 的保存和恢复需求,来减少状态保存和恢复时间。 影子寄存器是 GR 1、8、9、16、17、24 和 25。
寄存器使用说明,最初来自 John Marvin,并添加了 Randolph Chung 的一些额外说明。
对于通用寄存器
r1,r2,r19-r26,r28,r29 & r31 可以直接使用,无需先保存它们。 当然,如果你关心它们,则需要在调用另一个过程之前保存它们。 上述某些寄存器的确具有特殊含义,您应该注意
- r1
addil 指令被硬编码为将其结果放入 r1 中,因此如果您使用该指令,请注意这一点。
- r2
这是返回指针。 通常,您不想使用它,因为您需要该指针才能返回到调用者。 但是,它与这组寄存器分组在一起,因为调用者不能依赖于您返回时该值是否相同,即您可以将 r2 复制到另一个寄存器并通过该寄存器返回,之后再破坏 r2,这不应给调用例程带来问题。
- r19-r22
这些通常被认为是临时寄存器。 请注意,在 64 位中,它们是 arg7-arg4。
- r23-r26
这些是 arg3-arg0,也就是说,如果您不再关心传入的值,则可以使用它们。
- r28,r29
是 ret0 和 ret1。 它们是你传递返回值的东西。 r28 是主要返回值。 当返回小结构时,r29 也可用于将数据传递回调用者。
- r30
堆栈指针
- r31
ble 指令将返回指针放在此处。
r3-r18,r27,r30 需要保存和恢复。 r3-r18 只是通用寄存器。 r27 是数据指针,用于更轻松地引用全局变量。 r30 是堆栈指针。