Power Architecture 64 位 Linux 系統呼叫 ABI¶
syscall¶
呼叫¶
系統呼叫使用 sc 指令進行,並在 sc 指令之後的指令處繼續執行返回。
如果在 AT_HWCAP2 ELF 輔助向量中出現 PPC_FEATURE2_SCV,則 scv 0 指令是一種替代方案,它可能提供更好的效能,但與呼叫序列有一些差異。
系統呼叫呼叫序列[1]與 Power Architecture 64 位 ELF ABI 規範 C 函式呼叫序列相匹配,包括暫存器儲存規則,但以下差異除外。
引數¶
系統呼叫號在 r0 中指定。
一個系統呼叫最多可以有 6 個整數引數,這些引數在 r3-r8 中傳遞。
返回值¶
對於 sc 指令,將同時返回一個值和一個錯誤條件。 cr0.SO 是錯誤條件,而 r3 是返回值。 當 cr0.SO 清除時,系統呼叫成功,r3 是返回值。 當 cr0.SO 設定時,系統呼叫失敗,r3 是錯誤值(通常對應於 errno)。
對於 scv 0 指令,如果返回值是 -4095..-1(即,作為無符號比較,它 >= -MAX_ERRNO (-4095)),則表示失敗,在這種情況下,錯誤值是返回值的取反。
棧¶
系統呼叫不會修改呼叫者的棧幀。 例如,不使用呼叫者的棧幀 LR 和 CR 儲存欄位。
暫存器儲存規則¶
暫存器儲存規則與 ELF ABI 呼叫序列匹配,但有一些差異。
對於 sc 指令,與 ELF ABI 的差異如下:
暫存器 |
儲存規則 |
目的 |
|---|---|---|
r0 |
易失 |
(系統呼叫號。) |
r3 |
易失 |
(引數 1 和返回值。) |
r4-r8 |
易失 |
(引數 2-6。) |
cr0 |
易失 |
(cr0.SO 是返回錯誤條件。) |
cr1, cr5-7 |
非易失 |
|
lr |
非易失 |
對於 scv 0 指令,與 ELF ABI 的差異如下:
暫存器 |
儲存規則 |
目的 |
|---|---|---|
r0 |
易失 |
(系統呼叫號。) |
r3 |
易失 |
(引數 1 和返回值。) |
r4-r8 |
易失 |
(引數 2-6。) |
所有浮點和向量資料暫存器以及控制和狀態暫存器都是非易失的。
事務記憶體¶
如果處理器處於事務或掛起事務狀態,則系統呼叫行為可能會更改,並且系統呼叫可能會影響事務的行為。
如果在進行系統呼叫時處理器處於掛起狀態,則將正常執行該系統呼叫,並像往常一樣返回。 系統呼叫將在掛起狀態下執行,因此其副作用將根據通常的事務記憶體語義持久存在。 系統呼叫可能會也可能不會導致事務被硬體註定失敗。
如果在進行系統呼叫時處理器處於事務狀態,則該行為取決於 AT_HWCAP2 ELF 輔助向量中是否存在 PPC_FEATURE2_HTM_NOSC。
如果存在(對於較新的核心是這種情況),則不會執行系統呼叫,並且事務將被核心註定失敗,TEXASR SPR 中的失敗程式碼為 TM_CAUSE_SYSCALL | TM_CAUSE_PERSISTENT。
如果不存在(較舊的核心),則核心將掛起事務狀態,並且系統呼叫將像在掛起狀態系統呼叫的情況下一樣繼續進行,並且將在返回到呼叫者之前恢復事務狀態。 這種情況沒有很好的定義或支援,因此不應依賴此行為。
scv 0 系統呼叫將始終表現為 PPC_FEATURE2_HTM_NOSC。
ptrace¶
當跟蹤系統呼叫 (PTRACE_SYSCALL) 時,pt_regs.trap 值包含可用於區分 sc 和 scv 0 系統呼叫的系統呼叫型別,並且可以考慮不同的暫存器約定。
如果 (pt_regs.trap & 0xfff0) 的值為 0xc00,則系統呼叫是使用 sc 指令執行的,如果為 0x3000,則系統呼叫是使用 scv 0 指令執行的。
vsyscall¶
vsyscall 呼叫序列與 syscall 呼叫序列匹配,但以下差異除外。 一些 vsyscall 可能具有不同的呼叫序列。
引數和返回值¶
r0 不用作輸入。 vsyscall 是透過其地址選擇的。
棧¶
vsyscall 可能會也可能不會使用呼叫者的棧幀儲存區域。
暫存器儲存規則¶
r0 |
易失 |
cr1, cr5-7 |
易失 |
lr |
易失 |
呼叫¶
vsyscall 是使用帶連結的分支指令執行到 vsyscall 函式地址的。
事務記憶體¶
vsyscall 將以與呼叫者相同的事務狀態執行。 vsyscall 可能會也可能不會導致事務被硬體註定失敗。