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 是堆栈指针。