162306a36Sopenharmony_ci.. include:: ../../disclaimer-zh_CN.rst
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci:Original: Documentation/arch/parisc/registers.rst
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci:翻译:
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci 司延腾 Yanteng Si <siyanteng@loongson.cn>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci.. _cn_parisc_registers:
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci=========================
1262306a36Sopenharmony_ciLinux/PA-RISC的寄存器用法
1362306a36Sopenharmony_ci=========================
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci[ 用星号表示目前尚未实现的计划用途。 ]
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciABI约定的通用寄存器
1862306a36Sopenharmony_ci===================
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci控制寄存器
2162306a36Sopenharmony_ci----------
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci============================    =================================
2462306a36Sopenharmony_ciCR 0 (恢复计数器)               用于ptrace
2562306a36Sopenharmony_ciCR 1-CR 7(无定义)               未使用
2662306a36Sopenharmony_ciCR 8 (Protection ID)            每进程值*
2762306a36Sopenharmony_ciCR 9, 12, 13 (PIDS)             未使用
2862306a36Sopenharmony_ciCR10 (CCR)                      FPU延迟保存*
2962306a36Sopenharmony_ciCR11                            按照ABI的规定(SAR)
3062306a36Sopenharmony_ciCR14 (中断向量)                 初始化为 fault_vector
3162306a36Sopenharmony_ciCR15 (EIEM)                     所有位初始化为1*
3262306a36Sopenharmony_ciCR16 (间隔计时器)               读取周期数/写入开始时间间隔计时器
3362306a36Sopenharmony_ciCR17-CR22                       中断参数
3462306a36Sopenharmony_ciCR19                            中断指令寄存器
3562306a36Sopenharmony_ciCR20                            中断空间寄存器
3662306a36Sopenharmony_ciCR21                            中断偏移量寄存器
3762306a36Sopenharmony_ciCR22                            中断 PSW
3862306a36Sopenharmony_ciCR23 (EIRR)                     读取未决中断/写入清除位
3962306a36Sopenharmony_ciCR24 (TR 0)                     内核空间页目录指针
4062306a36Sopenharmony_ciCR25 (TR 1)                     用户空间页目录指针
4162306a36Sopenharmony_ciCR26 (TR 2)                     不使用
4262306a36Sopenharmony_ciCR27 (TR 3)                     线程描述符指针
4362306a36Sopenharmony_ciCR28 (TR 4)                     不使用
4462306a36Sopenharmony_ciCR29 (TR 5)                     不使用
4562306a36Sopenharmony_ciCR30 (TR 6)                     当前 / 0
4662306a36Sopenharmony_ciCR31 (TR 7)                     临时寄存器,在不同地方使用
4762306a36Sopenharmony_ci============================    =================================
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci空间寄存器(内核模式)
5062306a36Sopenharmony_ci----------------------
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci========                        ==============================
5362306a36Sopenharmony_ciSR0                             临时空间寄存器
5462306a36Sopenharmony_ciSR4-SR7                         设置为0
5562306a36Sopenharmony_ciSR1                             临时空间寄存器
5662306a36Sopenharmony_ciSR2                             内核不应该破坏它
5762306a36Sopenharmony_ciSR3                             用于用户空间访问(当前进程)
5862306a36Sopenharmony_ci========                        ==============================
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci空间寄存器(用户模式)
6162306a36Sopenharmony_ci----------------------
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci========                        ============================
6462306a36Sopenharmony_ciSR0                             临时空间寄存器
6562306a36Sopenharmony_ciSR1                             临时空间寄存器
6662306a36Sopenharmony_ciSR2                             保存Linux gateway page的空间
6762306a36Sopenharmony_ciSR3                             在内核中保存用户地址空间的值
6862306a36Sopenharmony_ciSR4-SR7                         定义了用户/内核的短地址空间
6962306a36Sopenharmony_ci========                        ============================
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci处理器状态字
7362306a36Sopenharmony_ci------------
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci======================          ================================================
7662306a36Sopenharmony_ciW (64位地址)                  0
7762306a36Sopenharmony_ciE (小尾端)                    0
7862306a36Sopenharmony_ciS (安全间隔计时器)            0
7962306a36Sopenharmony_ciT (产生分支陷阱)              0
8062306a36Sopenharmony_ciH (高特权级陷阱)              0
8162306a36Sopenharmony_ciL (低特权级陷阱)              0
8262306a36Sopenharmony_ciN (撤销下一条指令)            被C代码使用
8362306a36Sopenharmony_ciX (数据存储中断禁用)          0
8462306a36Sopenharmony_ciB (产生分支)                  被C代码使用
8562306a36Sopenharmony_ciC (代码地址转译)              1, 在执行实模式代码时为0
8662306a36Sopenharmony_ciV (除法步长校正)              被C代码使用
8762306a36Sopenharmony_ciM (HPMC 掩码)                 0, 在执行HPMC操作*时为1
8862306a36Sopenharmony_ciC/B (进/借 位)                被C代码使用
8962306a36Sopenharmony_ciO (有序引用)                  1*
9062306a36Sopenharmony_ciF (性能监视器)                0
9162306a36Sopenharmony_ciR (回收计数器陷阱)            0
9262306a36Sopenharmony_ciQ (收集中断状态)              1 (在rfi之前的代码中为0)
9362306a36Sopenharmony_ciP (保护标识符)                1*
9462306a36Sopenharmony_ciD (数据地址转译)              1, 在执行实模式代码时为0
9562306a36Sopenharmony_ciI (外部中断掩码)              由cli()/sti()宏使用。
9662306a36Sopenharmony_ci======================          ================================================
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci“隐形”寄存器(影子寄存器)
9962306a36Sopenharmony_ci---------------------------
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci=============                   ===================
10262306a36Sopenharmony_ciPSW W 默认值                    0
10362306a36Sopenharmony_ciPSW E 默认值                    0
10462306a36Sopenharmony_ci影子寄存器                      被中断处理代码使用
10562306a36Sopenharmony_ciTOC启用位                       1
10662306a36Sopenharmony_ci=============                   ===================
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci----------------------------------------------------------
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ciPA-RISC架构定义了7个寄存器作为“影子寄存器”。这些寄存器在
11162306a36Sopenharmony_ciRETURN FROM INTERRUPTION AND RESTORE指令中使用,通过消
11262306a36Sopenharmony_ci除中断处理程序中对一般寄存器(GR)的保存和恢复的需要来减
11362306a36Sopenharmony_ci少状态保存和恢复时间。影子寄存器是GRs 1, 8, 9, 16, 17,
11462306a36Sopenharmony_ci24和25。
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci-------------------------------------------------------------------------
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci寄存器使用说明,最初由John Marvin提供,并由Randolph Chung提供一些补充说明。
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci对于通用寄存器:
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cir1,r2,r19-r26,r28,r29 & r31可以在不保存它们的情况下被使用。当然,如果你
12362306a36Sopenharmony_ci关心它们,在调用另一个程序之前,你也需要保存它们。上面的一些寄存器确实
12462306a36Sopenharmony_ci有特殊的含义,你应该注意一下:
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci    r1:
12762306a36Sopenharmony_ci       addil指令是硬性规定将其结果放在r1中,所以如果你使用这条指令要
12862306a36Sopenharmony_ci       注意这点。
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci    r2:
13162306a36Sopenharmony_ci       这就是返回指针。一般来说,你不想使用它,因为你需要这个指针来返
13262306a36Sopenharmony_ci       回给你的调用者。然而,它与这组寄存器组合在一起,因为调用者不能
13362306a36Sopenharmony_ci       依赖你返回时的值是相同的,也就是说,你可以将r2复制到另一个寄存
13462306a36Sopenharmony_ci       器,并在作废r2后通过该寄存器返回,这应该不会给调用程序带来问题。
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci    r19-r22:
13762306a36Sopenharmony_ci       这些通常被认为是临时寄存器。
13862306a36Sopenharmony_ci       请注意,在64位中它们是arg7-arg4。
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci    r23-r26:
14162306a36Sopenharmony_ci       这些是arg3-arg0,也就是说,如果你不再关心传入的值,你可以使用
14262306a36Sopenharmony_ci       它们。
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci    r28,r29:
14562306a36Sopenharmony_ci       这俩是ret0和ret1。它们是你传入返回值的地方。r28是主返回值。当返回
14662306a36Sopenharmony_ci       小结构体时,r29也可以用来将数据传回给调用程序。
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci    r30:
14962306a36Sopenharmony_ci       栈指针
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci    r31:
15262306a36Sopenharmony_ci       ble指令将返回指针放在这里。
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci    r3-r18,r27,r30需要被保存和恢复。r3-r18只是一般用途的寄存器。
15662306a36Sopenharmony_ci    r27是数据指针,用来使对全局变量的引用更容易。r30是栈指针。
157