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 可能會也可能不會導致事務被硬體註定失敗。