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 个寄存器为“影子寄存器”。这些寄存器在中断返回和恢复指令中使用,以减少状态保存和恢复时间,从而消除在中断处理程序中保存和恢复通用寄存器 (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 是堆栈指针。