[インデックス 12382] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおけるLinux/ARMアーキテクチャ向けのシステムコール実装のバグを修正するものです。特に、64ビット引数の扱いに関するARM ABI(Application Binary Interface)の要件と、それに伴うfallocate
システムコールでのEFBIG
(File too large)エラーの発生、そして手動で調整されていたシステムコールルーチンの自動生成への移行が主な変更点です。また、asm/unistd.h
ヘッダーファイルの取得方法も変更されています。
コミット
commit 6e211225d7ec363d5205799fe15bb8cebd9703f9
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Tue Mar 6 03:12:11 2012 +0800
syscall: fix mkall.sh, mksyscall_linux.pl, and regen for Linux/ARM
CL 3075041 says ARM is not little-endian, but my test suggests otherwise.
My test program is:
package main
import ("fmt"; "syscall"; "os")
func main() {
err := syscall.Fallocate(1, 1/*FALLOC_FL_KEEP_SIZE*/, 0, int64(40960));
fmt.Fprintln(os.Stderr, err)
}
Without this CL, ./test > testfile will show: file too large; and strace shows:
fallocate(1, 01, 0, 175921860444160) = -1 EFBIG (File too large)
With this CL, ./test > testfile will show: <nil>; and strace shows:
fallocate(1, 01, 0, 40960) = 0
Quoting rsc:
"[It turns out that] ARM syscall ABI requires 64-bit arguments to use an
(even, odd) register pair, not an (odd, even) pair. Switching to "big-endian"
worked because it ended up using the high 32-bits (always zero in the tests
we had) as the padding word, because the 64-bit argument was the last one,
and because we fill in zeros for the rest of the system call arguments, up to
six. So it happened to work."
I updated mksyscall_linux.pl to accommodate the register pair ABI requirement,
and removed all hand-tweaked syscall routines in favor of the auto-generated
ones. These including: Ftruncate, Truncate, Pread and Pwrite.
Some recent Linux/ARM distributions do not bundle kernel asm headers,
so instead we always get latest asm/unistd.h from git.kernel.org (just like
what we do for FreeBSD).
R=ken, r, rsc, r, dave, iant
CC=golang-dev
https://golang.org/cl/5726051
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/6e211225d7ec363d5205798fe15bb8cebd9703f9
元コミット内容
syscall: fix mkall.sh, mksyscall_linux.pl, and regen for Linux/ARM
CL 3075041 says ARM is not little-endian, but my test suggests otherwise.
My test program is:
package main
import ("fmt"; "syscall"; "os")
func main() {
err := syscall.Fallocate(1, 1/*FALLOC_FL_KEEP_SIZE*/, 0, int64(40960));
fmt.Fprintln(os.Stderr, err)
}
Without this CL, ./test > testfile will show: file too large; and strace shows:
fallocate(1, 01, 0, 175921860444160) = -1 EFBIG (File too large)
With this CL, ./test > testfile will show: <nil>; and strace shows:
fallocate(1, 01, 0, 40960) = 0
Quoting rsc:
"[It turns out that] ARM syscall ABI requires 64-bit arguments to use an
(even, odd) register pair, not an (odd, even) pair. Switching to "big-endian"
worked because it ended up using the high 32-bits (always zero in the tests
we had) as the padding word, because the 64-bit argument was the last one,
and because we fill in zeros for the rest of the system call arguments, up to
six. So it happened to work."
I updated mksyscall_linux.pl to accommodate the register pair ABI requirement,
and removed all hand-tweaked syscall routines in favor of the auto-generated
ones. These including: Ftruncate, Truncate, Pread and Pwrite.
Some recent Linux/ARM distributions do not bundle kernel asm headers,
so instead we always get latest asm/unistd.h from git.kernel.org (just like
what we do for FreeBSD).
R=ken, r, rsc, r, dave, iant
CC=golang-dev
https://golang.org/cl/5726051
変更の背景
このコミットは、Go言語がLinux/ARM環境でシステムコールを正しく実行できないという重要なバグを修正するために導入されました。具体的には、fallocate
システムコールがEFBIG
(File too large)エラーを返す問題が報告されました。これは、Goのsyscall
パッケージがARMアーキテクチャのシステムコールABI(Application Binary Interface)における64ビット引数の渡し方を誤解していたことに起因します。
従来のGoの実装では、ARMがリトルエンディアンではないという誤った仮定に基づいて64ビット引数を処理していました。しかし、実際のテストではARMがリトルエンディアンであることが示され、この誤解がシステムコールへの引数渡しに問題を引き起こしていました。特に、64ビット引数が期待されるfallocate
のようなシステムコールでは、誤った値がカーネルに渡され、結果としてファイルサイズが異常に大きな値として解釈され、EFBIG
エラーが発生していました。
また、この問題は、Goのsyscall
パッケージ内で一部のシステムコール(Ftruncate
, Truncate
, Pread
, Pwrite
など)が手動で調整された(hand-tweaked)実装を持っていたことにも関連していました。これらの手動実装は、特定のABIの癖に対応するために導入されたものですが、ABIの正確な理解が不足していたり、ABIの変更に対応しきれていなかったりすると、かえって問題を引き起こす可能性がありました。
さらに、一部のLinux/ARMディストリビューションでは、カーネルのasm/unistd.h
ヘッダーファイルがバンドルされていないため、システムコール番号の定義を取得する際に問題が発生していました。これも、Goのビルドプロセスにおける課題となっていました。
これらの問題を解決し、GoがLinux/ARM環境でより堅牢かつ正確に動作するようにするために、このコミットが作成されました。
前提知識の解説
ARMシステムコールABIと64ビット引数
システムコールABIは、ユーザー空間のプログラムがカーネルにサービスを要求する際に、引数をどのように渡し、戻り値をどのように受け取るかを定義する規約です。ARMアーキテクチャ、特に32ビットARM(ARMv7など)のLinux Embedded ABI (EABI)では、64ビットの引数(例: long long
型)を渡す際に、特定のレジスタペアを使用するという特殊なルールが存在します。
通常、32ビットアーキテクチャでは、レジスタは32ビット幅です。64ビットの値を渡す場合、これを2つの32ビットレジスタに分割して渡す必要があります。ARM EABIの規約では、64ビット引数は「偶数-奇数」のレジスタペア(例: r0
とr1
、r2
とr3
など)に配置されます。つまり、64ビット値の下位32ビットが偶数番目のレジスタに、上位32ビットが奇数番目のレジスタに格納されます。
このコミットの元の問題は、Goのシステムコール生成ツールがこの「偶数-奇数」レジスタペアの規約を正しく理解していなかった、または誤ったエンディアンの仮定に基づいて引数を配置していたことにあります。コミットメッセージにあるrsc
の引用が示すように、64ビット引数が最後の引数であった場合、たまたまゼロがパディングとして埋められ、動作してしまうケースもあったようですが、これは偶然に依存する不安定な挙動でした。
Goのシステムコール生成 (mksyscall.pl
)
Go言語のsyscall
パッケージは、オペレーティングシステムの低レベルなシステムコールをGoプログラムから呼び出すためのインターフェースを提供します。Goはクロスプラットフォーム言語であるため、各OSおよびアーキテクチャ固有のシステムコール呼び出し規約に対応する必要があります。
Goでは、mksyscall.pl
というPerlスクリプトが、システムコール呼び出しのためのGoコードを自動生成するために使用されていました。このスクリプトは、Goのソースファイル内に記述された特別なコメント(例: //sys
や//sysnb
)を解析し、それに基づいて各システムコールのGoラッパー関数を生成します。この生成プロセスには、引数の型変換、レジスタへの配置、システムコール番号の指定などが含まれます。
しかし、mksyscall.pl
がABIの複雑な詳細(特にARMの64ビット引数レジスタペアの要件)を完全に把握していなかったため、生成されるコードが誤った引数渡しを行うことがありました。
EFBIG
エラー
EFBIG
は、POSIX標準で定義されているエラーコードの一つで、「File too large」(ファイルが大きすぎる)を意味します。このエラーは、ファイルシステムがサポートする最大ファイルサイズを超える操作を行おうとした場合に発生します。
このコミットのケースでは、fallocate
システムコールがEFBIG
エラーを返していました。fallocate
は、ファイルにディスクスペースを事前に割り当てるためのシステムコールです。コミットメッセージのテストプログラムが示すように、fallocate(1, 1/*FALLOC_FL_KEEP_SIZE*/, 0, int64(40960))
という呼び出しが、実際にはfallocate(1, 01, 0, 175921860444160)
(非常に大きな値)としてカーネルに渡されていました。これは、Goが64ビットのlength
引数(40960)をARM ABIの規約に従って正しくレジスタに配置できなかったため、カーネルが誤った(巨大な)値を読み取ってしまい、結果としてファイルシステムの上限を超えたと判断されEFBIG
エラーが発生したものです。
asm/unistd.h
asm/unistd.h
は、Linuxカーネルのソースコードに含まれるヘッダーファイルで、特定のアーキテクチャ(例: ARM, x86)向けのシステムコール番号の定義が含まれています。Goのシステムコール生成プロセスでは、これらのヘッダーファイルからシステムコール番号を抽出し、Goのコードに組み込む必要があります。
一部のLinux/ARMディストリビューションでは、開発環境にこれらのカーネルヘッダーがバンドルされていないことがあり、Goのビルド時にシステムコール番号の定義が見つからないという問題が発生していました。
技術的詳細
このコミットは、GoのLinux/ARMシステムコール実装における複数の問題を包括的に解決しています。
-
mksyscall.pl
の修正とARM ABIへの対応:src/pkg/syscall/mksyscall.pl
スクリプトに-arm
オプションが追加されました。- このオプションが有効な場合、64ビット引数を処理する際に、現在の引数リストの数が奇数であれば、パディングとして
0
を挿入するロジックが追加されました。これは、ARM ABIが64ビット引数に「偶数-奇数」のレジスタペアを要求するため、引数の位置を調整するためのものです。これにより、64ビット値が常に偶数番目のレジスタから始まるように保証されます。 - 以前の
-b32
(big-endian)オプションが、たまたま64ビット引数のパディングを正しく行っていたケースがあったというrsc
のコメントは、このABIの複雑さを示しています。今回の修正で、より汎用的な方法でABI要件を満たすようになりました。
-
手動調整されたシステムコールルーチンの削除と自動生成への移行:
src/pkg/syscall/syscall_linux_arm.go
から、Pread
,Pwrite
,Ftruncate
,Truncate
といったシステムコールの手動実装が削除されました。- これらのシステムコールは、
//sys
ディレクティブを使用して自動生成されるように変更されました。これにより、mksyscall.pl
の修正がこれらのシステムコールにも適用され、64ビット引数の渡し方がABIに準拠するようになります。手動実装は、ABIの変更や複雑なケースに対応しきれないリスクがあるため、自動生成に移行することで、より堅牢で保守性の高いコードベースが実現されます。
-
asm/unistd.h
の取得方法の変更:src/pkg/syscall/mkall.sh
スクリプトにおいて、Linux/ARM向けのmksysnum
(システムコール番号生成)コマンドのソースが変更されました。- 以前は
/usr/include/asm/unistd.h
というローカルパスから取得しようとしていましたが、これが一部のディストリビューションで利用できない問題がありました。 - 修正後は、
curl -s 'http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob_plain;f=arch/arm/include/asm/unistd.h;hb=HEAD'
というコマンドを使用して、git.kernel.org
から直接最新のasm/unistd.h
を取得するようになりました。これはFreeBSD向けと同様のアプローチであり、システムコール番号の定義の可用性と一貫性を向上させます。
-
zsyscall_linux_arm.go
における引数順序の修正:Fallocate
システムコールの呼び出しにおいて、64ビット引数off
とlen
のレジスタへの配置順序が修正されました。以前はuintptr(off>>32), uintptr(off)
の順でしたが、uintptr(off), uintptr(off>>32)
に修正されています。これは、ARMの64ビット引数渡し規約において、下位32ビットが偶数レジスタ、上位32ビットが奇数レジスタに配置されるというルールに合致させるための変更です。- 同様に、
Tee
システムコールの戻り値の結合順序もint64(int64(r0)<<32 | int64(r1))
からint64(int64(r1)<<32 | int64(r0))
に修正されています。これは、システムコールからの戻り値がレジスタr0
とr1
に分割されて返される場合に、正しい64ビット値を再構築するためのエンディアンに関する修正です。
これらの変更により、GoのLinux/ARM環境でのシステムコール呼び出しがABIに完全に準拠し、fallocate
のような64ビット引数を使用するシステムコールが正しく動作するようになりました。
コアとなるコードの変更箇所
このコミットにおける主要なコード変更は以下のファイルに集中しています。
-
src/pkg/syscall/mkall.sh
:- Linux/ARM向けの
mksysnum
コマンドのソースが変更されました。 - 変更前:
mksysnum="./mksysnum_linux.pl /usr/include/asm/unistd.h"
- 変更後:
mksysnum="curl -s 'http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob_plain;f=arch/arm/include/asm/unistd.h;hb=HEAD' | ./mksysnum_linux.pl"
- Linux/ARM向けの
-
src/pkg/syscall/mksyscall.pl
:-arm
オプションが追加され、64ビット引数のレジスタペア処理ロジックが導入されました。- 変更前:
} elsif($type eq "int64" && $_32bit ne "") { if($_32bit eq "big-endian") { push @args, "uintptr($name>>32)", "uintptr($name)"; } else {
- 変更後:
} elsif($type eq "int64" && $_32bit ne "") { if(@args % 2 && $arm) { # arm abi specifies 64-bit argument uses # (even, odd) pair push @args, "0" } if($_32bit eq "big-endian") { push @args, "uintptr($name>>32)", "uintptr($name)"; } else {
-
src/pkg/syscall/syscall_linux_arm.go
:- 手動で実装されていた
Pread
,Pwrite
,Ftruncate
,Truncate
関数が削除されました。 - これらの関数の定義が
//sys
ディレクティブに置き換えられ、自動生成されるようになりました。 - 変更前(抜粋):
func Pread(fd int, p []byte, offset int64) (n int, err error) { ... } func Pwrite(fd int, p []byte, offset int64) (n int, err error) { ... } func Ftruncate(fd int, length int64) (err error) { ... } func Truncate(path string, length int64) (err error) { ... }
- 変更後(抜粋):
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
- 手動で実装されていた
-
src/pkg/syscall/zsyscall_linux_arm.go
:Fallocate
システムコールの引数順序が修正されました。- 変更前:
_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off>>32), uintptr(off), uintptr(len>>32), uintptr(len))
- 変更後:
_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32))
Tee
システムコールの戻り値の結合順序が修正されました。- 変更前:
n = int64(int64(r0)<<32 | int64(r1))
- 変更後:
n = int64(int64(r1)<<32 | int64(r0))
- 削除された手動実装のシステムコール(
Pread
,Pwrite
,Truncate
,Ftruncate
)の自動生成されたコードが追加されました。
-
src/pkg/syscall/zerrors_linux_arm.go
:- 新しい定数(例:
ETH_P_CAIF
,F_GETPIPE_SZ
,IP_FREEBIND
など)が追加され、一部の既存定数の値が更新されました。これは、asm/unistd.h
の更新に伴う変更です。
- 新しい定数(例:
-
src/pkg/syscall/zsysnum_linux_arm.go
:- 新しいシステムコール番号(例:
SYS_RECVMMSG
,SYS_FANOTIFY_INIT
など)が追加されました。これもasm/unistd.h
の更新に伴う変更です。
- 新しいシステムコール番号(例:
-
src/pkg/syscall/ztypes_linux_arm.go
:- 構造体
Cmsghdr
とInotifyEvent
の内部配列の型が[0]byte
から[0]uint8
に変更されました。 - 定数
IFLA_MAX
の値が更新されました。
- 構造体
コアとなるコードの解説
src/pkg/syscall/mkall.sh
の変更
mkall.sh
は、Goのsyscall
パッケージをビルドする際に、各OS/アーキテクチャ固有のファイルを生成するためのスクリプトです。Linux/ARMセクションにおけるmksysnum
の変更は、システムコール番号の定義元をローカルの/usr/include/asm/unistd.h
から、Linuxカーネルの公式Gitリポジトリ(git.kernel.org
)から直接取得するように変更したものです。
--- a/src/pkg/syscall/mkall.sh
+++ b/src/pkg/syscall/mkall.sh
@@ -144,8 +144,8 @@ linux_amd64)
;;
linux_arm)
mkerrors="$mkerrors"
- mksyscall="./mksyscall.pl -b32"
- mksysnum="./mksysnum_linux.pl /usr/include/asm/unistd.h"
+ mksyscall="./mksyscall.pl -l32 -arm"
+ mksysnum="curl -s 'http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob_plain;f=arch/arm/include/asm/unistd.h;hb=HEAD' | ./mksysnum_linux.pl"
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
netbsd_386)
この変更により、Goのビルドシステムは、ユーザーのシステムに特定のカーネルヘッダーが存在するかどうかに依存することなく、常に最新かつ正確なシステムコール番号の定義を取得できるようになります。これは、異なるLinuxディストリビューションやARMデバイス間でのビルドの信頼性を向上させる上で非常に重要です。
src/pkg/syscall/mksyscall.pl
の変更
mksyscall.pl
は、Goのシステムコールラッパーを生成するPerlスクリプトです。このコミットの最も重要な変更点の一つは、ARMの64ビット引数渡し規約に対応するためのロジックの追加です。
--- a/src/pkg/syscall/mksyscall.pl
+++ b/src/pkg/syscall/mksyscall.pl
@@ -27,6 +27,7 @@ my $_32bit = "";
my $plan9 = 0;
my $openbsd = 0;
my $netbsd = 0;
+my $arm = 0; # 64-bit value should use (even, odd)-pair
if($ARGV[0] eq "-b32") {
$_32bit = "big-endian";
@@ -47,6 +48,10 @@ if($ARGV[0] eq "-netbsd") {
$netbsd = 1;
shift;
}
+if($ARGV[0] eq "-arm") {
+ $arm = 1;
+ shift;
+}
if($ARGV[0] =~ /^-/) {
print STDERR "usage: mksyscall.pl [-b32 | -l32] [file ...]\\n";
@@ -135,6 +140,11 @@ while(<>) {
push @args, "uintptr($name)";
}
} elsif($type eq "int64" && $_32bit ne "") {
+ if(@args % 2 && $arm) {
+ # arm abi specifies 64-bit argument uses
+ # (even, odd) pair
+ push @args, "0"
+ }
if($_32bit eq "big-endian") {
push @args, "uintptr($name>>32)", "uintptr($name)";
} else {
追加された-arm
オプションと、int64
型引数処理内のif(@args % 2 && $arm)
ブロックが重要です。
@args % 2
: 現在までにシステムコールに渡される引数の数が奇数であるかをチェックします。$arm
:-arm
オプションが指定されているか(つまり、ARMアーキテクチャ向けであるか)をチェックします。- この両方が真の場合、
push @args, "0"
によって0
が引数リストに挿入されます。これは、ARM ABIが64ビット引数に「偶数-奇数」のレジスタペアを要求するため、引数のアライメントを調整するためのパディングです。これにより、次に続く64ビット引数が常に偶数番目のレジスタから始まるように保証され、ABIの規約に適合します。
src/pkg/syscall/syscall_linux_arm.go
の変更
このファイルでは、以前手動で実装されていたPread
, Pwrite
, Ftruncate
, Truncate
といったシステムコールが削除され、代わりに//sys
ディレクティブを使用して自動生成されるように変更されました。
--- a/src/pkg/syscall/syscall_linux_arm.go
+++ b/src/pkg/syscall/syscall_linux_arm.go
@@ -4,8 +4,6 @@
package syscall
-import "unsafe"
-
func Getpagesize() int { return 4096 }
func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
@@ -23,52 +21,6 @@ func NsecToTimeval(nsec int64) (tv Timeval) {
return
}
-// Pread and Pwrite are special: they insert padding before the int64.
-
-func Pread(fd int, p []byte, offset int64) (n int, err error) { ... }
-func Pwrite(fd int, p []byte, offset int64) (n int, err error) { ... }
-func Ftruncate(fd int, length int64) (err error) { ... }
-func Truncate(path string, length int64) (err error) { ... }
-
// Seek is defined in assembly.
func Seek(fd int, offset int64, whence int) (newoffset int64, err error)
@@ -118,6 +70,11 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error)
//sysnb Gettimeofday(tv *Timeval) (err error)
//sysnb Time(t *Time_t) (tt Time_t, err error)
+//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
+//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
+//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
+//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
+
//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
手動実装の削除と//sys
ディレクティブへの移行は、Goのシステムコール生成戦略における重要な改善です。これにより、mksyscall.pl
で行われたABI関連の修正がこれらのシステムコールにも自動的に適用され、手動でのエラーやABIの変更への追従漏れのリスクがなくなります。
src/pkg/syscall/zsyscall_linux_arm.go
の変更
このファイルはmksyscall.pl
によって自動生成されるファイルです。このコミットでは、Fallocate
とTee
システムコールの引数渡しと戻り値の処理が修正されています。
Fallocate
の引数順序の修正:
--- a/src/pkg/syscall/zsyscall_linux_arm.go
+++ b/src/pkg/syscall/zsyscall_linux_arm.go
@@ -287,7 +287,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Fallocate(fd int, mode uint32, off int64, len int64) (err error) {
- _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off>>32), uintptr(off), uintptr(len>>32), uintptr(len))\n
+ _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32))\n
if e1 != 0 {
err = e1
}
off
とlen
は64ビット整数であり、ARM ABIでは下位32ビットが偶数レジスタ、上位32ビットが奇数レジスタに配置されます。以前の実装ではuintptr(off>>32), uintptr(off)
となっており、これは上位32ビットが先に渡され、その後に下位32ビットが渡されることを意味していました。この順序がuintptr(off), uintptr(off>>32)
に修正されたことで、ABIの要件に合致し、fallocate
が正しく動作するようになりました。
Tee
の戻り値の結合順序の修正:
--- a/src/pkg/syscall/zsyscall_linux_arm.go
+++ b/src/pkg/syscall/zsyscall_linux_arm.go
@@ -784,7 +784,7 @@ func Sysinfo(info *Sysinfo_t) (err error) {
func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {
r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)
- n = int64(int64(r0)<<32 | int64(r1))\n
+ n = int64(int64(r1)<<32 | int64(r0))\n
if e1 != 0 {
err = e1
}
システムコールからの64ビット戻り値は、通常、r0
とr1
レジスタに分割されて返されます。この修正は、r1
(上位32ビット)とr0
(下位32ビット)を正しい順序で結合して64ビット整数を再構築するためのものです。これにより、Tee
システムコールが正しい戻り値を返すようになります。
これらの変更は、GoのLinux/ARMシステムコール実装の正確性と堅牢性を大幅に向上させ、特に64ビット引数や戻り値の処理におけるABI準拠の問題を解決しました。
関連リンク
- Go言語の
syscall
パッケージに関するドキュメント: https://pkg.go.dev/syscall - Goのシステムコール生成に関する議論(
mksyscall.pl
など): https://go.dev/blog/go1.4-syscall (Go 1.4以降のsyscall
パッケージの変更に関するブログ記事) - Linux ARM ABIに関する情報: https://www.kernel.org/doc/html/latest/arm/syscalls.html (LinuxカーネルのARMシステムコールに関するドキュメント)
fallocate
システムコールに関するmanページ: https://man7.org/linux/man-pages/man2/fallocate.2.htmlEFBIG
エラーに関するPOSIX標準: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
参考にした情報源リンク
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGEFgkZomkguHf_7NLmRPhyGL6QZZZQXcr0jZuS_oZfLAgemTjM2SkBVm1dUC0Xg3PM9q2GlSEhVTRWWKZXLXFlSzZ4kyey-JdB8XmHzgy1MxV8MtHgqk0AwxktR72nR4ZjdB2TcSaWFh707PbdhZGTfGaxele8gXTvxLuSww==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGxAFbzTGKdXKidbSvCsHlURIjTvB4XrOsWil54mEEri0_EeRAhn6Etrib6LqVnUlydngjlw024jBHxSlvpYPSGZ9I92OPWjPyFMn52skllFm3e5lcmFkib5pzAlDGcnVg-wywG71wsFs99_uQqySBkNWX43yBOJOifbNppjDd6-dMK_oHQ3cK6ciYig=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHzDpUes05hlWx8wwMyNw9euAHgehUNXa16ZQikTLxGhz7-34Aflfa_kS5SXXt27d44IBK-asCasj2KT-_yTh16nfr2Dfasd6GYbb8IZDzTNm16xXwdZ_a4mF56bhXDjrEMUl3WTKW5eYwkC46tOZ3DqVM1t1RC_eoot78P_MhMUKuWs0rohpkL623J4jGbvt4XeV-PLKy8eumDTA8qI20gTBXuWgm6jIBG0Bs9CjY=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE7hTUfgSnbVAU9gs0iCXl1uoSrnk7blmKIi6NeVG9daPLS8-R_w1RSS-Rppr23hSaSam5EYHkspSCD6QBeYYJXqDaOMUAu8VyPI68I-23HnDN55UP8Y6bY3CLXm5kBEZ_TH3Dv2BoC0Y2ZYRalIuyQr-mM3wg=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEjVTO7jULfdbRBQ5x4V9cIkABvLPd5hMShJUNT7wsjb7ErpA5lY3g5oZ6op6PzCc6vLKjTLKTMsDll7AI0qqdk64klM4jUIn4slkyx82qsxbP649cI604O0e0GbXm90qotRXKBttNIFPO9j9CX3jIlywPVJanZJIwMrJ9Zd_8fjRRXXKai6fgG
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHoP-TZrX64hHtV80phspW-tu7S4asNlu93uhL9gd9m0LNnc3d0RlufPfc_tWrdwAXrF2lKPkrWRUfAi1-dFTqteRaa5ep2BfbfOFcne4wdCdyUTkLqm-3__LTfIaQxSqgWMDXDpz_LiyOqBZB85tupCfTottHp1ytk6Xmkjr4_imEsR1J55M9jxUpR
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHmHFo4JCoRszqtA7vagygGxwNODIjDTXXJVcpEmi1GAh0E9GSd-UsNP2WueWmWNzEZkXX6KsZPvGcVCDJE_6hLyDaaEjQfb0RiGxE5nncXFlb9OB8CHMz4-3mytLsL3PMdUudZhzvbHoBmr7ckLiA=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG1-YSdiQ5XJkfzAd1oZDPwqych7PJBmVxkNeVETq9qWFfrAe3xQfjKVgTMT8FIkWKtJ6an5eZaLDfmbN6uNokTnDR1_rI1-KfTOphdUognkG6Z7v-GIT-bP2tRfHnmFHHMNJyfKcnBVxz7hHjs
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEelev1fRND26L3Ivyp_TwQpjLFsSMioXo-iK9WCCjWLVUuPO8pWYUJfbgWeCuSABPNVaB0X39PdvOsZzU-pWezXeu92J1YCxS8kYV8fmJPJeXb3-aXSfutTXrTRpPB4AdUHtTh5Lhqpyz9nQE8TtnBnnPmDNcFhTQp7DXSKP8T_8fjSs6-879v
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGtoRj7VtSvfVxLwPplnGHO_XZnozBT42_zTXP_fRpRPJOqXOlGjZenZIljYSFgnL6NOYu0DP2Q1HYQXGQ6UV28sryBDfMPK-UfZUb6vyGnzgNLdYATMH5fRDq8Bmq8SoBCSsKgiSU=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGRFtrBPr7_WGctAHA0kMPLAteaTi9dQp5Njyw7omy_utd84fwrpRwqAmjmsoAKiIObAsc5nD8vd8gtAXYlF-Wi08LyGHPFMZ6rmhwsBeXhoN9vkuVdAmwMftE2E0qOKpuny0GuZiJa8ONG9jQxY7XTfkk7zv69pBtSmrKCmv0=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGTOYKNTpd0R25KLdNDKLyk7cdobh0Q17r728euG0TIKlB88CW_2nL9fJ5Mahw2-NPWlPmRnGsM3PWmyO0EpAS_EUGQyD4HZEf6h8CYGLipJRjynv5QWLtrY5sjo2gkVZEnaA41J7ifwH8_kFfcWTK9D-DSp21z1xB68IOf8CuHhQs318SiyHdH4ZoB
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGq1kLWxsFGA6yGXfRFs04zUq8pwh5_y3dMxeG5ifQSNzdEXEP6tmnT9ZhNixAYqG_H7uXpqTsty5V8vWfLPHgAhQA5rzbyk1Gxj3hn_-Vzsw474JrJxfdpRkYBTCoaC_GcM9wekae66qv04cNIpJcouoCAX-XAnUMB0wuLPKCWY3vMVPyAzsdhswOghxxVv799gog=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH8_2ETwTPh2ePbdfV08f8LiNPs6OIC1SAthX8rlnMkV5y5D1KujtrlwkPdBJTu6dURciR5v1VE0ekab2v2h9P0Nf4DF6yAEeKI9Lryh7R8To2_G--fanR34dV6cdVSq27ovBDU57SuiiCtouNh290yClpD8lNfTzTVSk64UaIRCLsynp-Jrotee1oQ2gDVjkcLBd0RtH4xF9DPqkL3TEybFmpqrX0ZJsmgu3HRFHBah26CRwtA0=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFCFsMaR-XbIeOy7jCJN4hit8yuRC6V0VD9297g2bwH_BHfoc_honl-NDeo4CcDLKXcnJ76BROLTDDnZTZX6bo91wD8TlFWu2tnFPmqvfrkNJ2gKHmsOtb5umFay74iu3kNfob3EIazkh_yGkUDni73Vnonhe_-iDblgrf9QxXi3DTPN10=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHsZwT7DwHYEAZO8zMnFDnmBXGGmp9f5GEFJcOWsiOfvYx1YkYzdYooFLNReWB28FpsKskPHT1f6w_B4E1b_SKPkdKslGRoUw2orwZBh5wHW1EwNm2sHS1AQ5c8jNdg6ECCQiak9YOqKToD91leLdk=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE9xApgHdphNK9e01ikn7ulHayFoBn1WUaqMFl-NOVW13Zog83PgB84r613eS_XSOYlNWkQa05E6rqaMvmEJ5UQzDGsp2nTr82mL3LW5uLbl-1nnxNcFRuIOA30g36Izhv5pz25ww==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFDbk6OJWim_iSHlQiQ12X38r4cvguPJtRJWp_-d6v3_eHyAT2_zJDOvmLkDyHn9d9UP3E-HroQIpSNc7zD3HiTB3tOdjJVNtuXkv86PSJa4YLdqTlOVlou8Gujzt7ZyAl46D4GJfX3MwH1AxmFNSsWxzKZr3ReaZB5wSafqGHM26TxS0HUn4-vWh9DQbLIWUwojoyQ-xRKMq1uwmYpTryvZWmYGxOM59rxghD_aQ==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEoudazW_Htp4bfmnz8cTGxQ9zGqa1jjiwZB727kIX0gL7ye2qRHUmPB5bNepSSkXfvfght_o_z1YaVxPu3kEn7dwkvT8Qe-NM-p3wWmme-rf9nmdKOWy0owh5hyGUSYCvmoMJEqTbT8fyWW2XdXebGD4Rjv57x
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEwjmzTjXggVFeP_hKowbT4GoLdXskPvUZY3FK-P9_I0NHAQRPQZZzyf7k6dTtLo8igfYQ4l2qDfoO5Cdhjcxnq5w9WGkq3rphAV8gqwtmytzw1k2GjxzJY7uH_FzOpcu28C4fmPdLVVbaVQijTGtgpr7u0kyTRrcigwKuzdG4GeHwriPr3lkVFI92jvHK4O-tI2XJfliCexAaI
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEyxkyZ1SWm6T7ulGgBvHunh0BqOoJK43inBwuw550HclMkUlIt6DmNXpyiVvCyS1VquKgaa-JtkREWtQQe6G4tS0jTfPVj-70s9NGdD_E_rRg3UWjPCDNfFCZj-JwPckEyrjH0tkFh6pspGPkB
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEyU-WwmwnlOLIiyIshOE6bzZHCyFDIlqcLt51KoTfovBUgIIen94gJuMMEOoEwP0iCOA-SM_guYgIAH-Ns95ytaPc2rLizebZeHG8wyYemXJ_yshrWlA3RxfXe3u_Rf-SghXplmjkCc5hUoZv-kFAXGm-DxNkZht0QroL60Jz7WekB_DhN
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGrgRV4nhX8Ugnk329wRNLjilJHlWyGyqKEaldtVyUAY1MuNcGKws-lIj--aDQo4hD1gbym0abnkhINI5LuwKYYCIUHlQsUMgQBE3EmnGp_k9uvbDkb
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHleMopO2vb9eHXnji7pAcD0WgITbvDxqtIcpx78MySm5elkgERqtUGi7Gi4UlNZxXAoF9aHBCVdW0uKp-OoF3n3IU1-C3KQGq5nAwXe-XNqg82JbYc0TnU6g5v3y_TNZ5LITbxe8maSG0zMRc7
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGKWj4XU-srSvnm_6QkA2EOKih80ceE0k3gAniiXuNJK6obVhTRkvY7b2t_94yGVgvLU4P29z-mDwzgHElILjJPCCknUv3mylptl0oNglE1Pvydri0sPz4bTJAkMxPQDiKxnIzNT1UE6Gzx4h47GEF0KPrNe6e4tXjEKt2zLrZ9o8wMdrHZXzJz01D0DzF1_XaLjg==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGyaG2irGrJvujRnmX4sgKPawvF-IZPFn4slSXVdfuCM1Pyxqxf-Y5AfspjdmBN5XXVVsCvOur4BD_5bLBzIeJ58kYCGOJSeurg66H-zjKeEzWG-FcQIkNOtBj6Ttef3yVyJMitCzSNILJI5H-QP66tudM4jAm-
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEc9ZaeH-yieW7GoDmeZGptLqeMsJ3PkOo3cNR0DAvzKi3S99xMNl-gE4olyCAyAYlqpkW5xhw735_onRzVhyOVxe0pE8FpKyzt4MZ-1QD5qryjnD3iUXPlwn14NqHEW9-PPk3O3SscNLPRnw7k21zgHgin94AMa2wY4gVX
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHaQdY2XLW1D9K-8RjmmCGnPKr5X9990vZfgDv8XucozOGBLA12zCWLLCkiTEtz7HFdTsDbMcEaQi7VfuYEkSbR84LBm0-fUrLGhrwPd7oYS8tB-dp3aRXTMYfNBiSjpUgVD4JdPNsNu6bZSDZghWUOK4YBBtRN2ZR_Jkr_Un5xXQyCgb9eKRbdzl6m8NtJDmb6gUJA81iOynU-dJytw4qYCqwPE1ikhHoDV3SQaIlT07WnDXny
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEyFgPkTIMo-lSlU9SH15LR-BMCHPzOfBhQy5FScY7QD__vvlAJet170X4eUVJhESjjx0OLnNQyoaB3tHcZk_3OF0ibjeMmXc3D3hW0j7VPIfAtE8wpTIInP5F98EpvohBlwZRHGLB2BwG8F7_aDpLafW9wRNApwwYTMl5qmA==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFaf46sNhnUGcoweARv0sD0J1a94U3fFllM5GkabIpLoJdEnla5HRPZdy8iryL6SAY8ZQDj4ETn9PLHxFdMeyogsTmmkbVrBbPsMfRdAbD53efEjx3cpYcZ64XcR0o1KoD669uRmOTKdHHoT51MXktFDLDKjgVQP7JKOHksCLx7RAG-bX7m-22owFHF
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFsuCZ7bdgt5s6JWqtHxm0k6MM8bdmVKlcVr1wIk_79ImIgzRdqIDaDZn3PC0JlLcGSWhb2Kwmw7QgMqxxBzLeofAtYcVE3R80p8_FMej8EFM0dusHOnXAPLQA7S7-sVHOK7TwpamnSehZAIzBSv-JXXhtEZ0HAa4fbkYNXvVop2wlGOFSLW-NULqTRYattIvIw1X-9UoLz9skboQcMIWltGQ==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG7IdeqWsNoY35cMu0FKtkdm8v2XgA3o0wrwPMVXdGqNcybqj4D551xlgQh79nv19sNjHpzrAzYEPhjfmbFmmXeJeF4L5LLvfbEeL1VfSifewAC8guM7p5T_QVuddkN-PbO1k7Kl1YOcKoundVPKvl8rH94xVF9Is_F_POtPMadqlccXuht2CEKaQGr
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGjvu7HStNlXxdA3gaamRHZQhvY2qO9Mxoq85Y-uquGJgMO8yXlA74SnZxEKhgP8g9J9K7yy4y3wWi_N2pZNWyjg1N6wQhTLzD9tkn5cEe3v-yJxWU7uWhzVoObZrinsQpkI4hUSKEsA34rXE2FzzjTdv3Alh3Lr5v81FR5dky-SA2HHkJoGvXFCNCRmgtfzYtD9wrgDm2X1vIbLHNcfK-8BC1J5NV7f-HjfyBjCP_-wiaII3mG1luUBQ==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG9pmWuMJ627BCgZ1_K-EUWew4nIqu9cUWeyDoyzh6z-35GKdP6v3A7jH4lB5AYGxHqYPLd1Euen4imtTyZGa2BRC4AVsdQYYsCa3eQwCp5WptT2XP3BGbbqREUt32XKuoF9I_fFZH2aQ==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHsyaetCW-xzipipU-Ojl15Ha8GTU4y25pB64sowA1SCFg6gFjTuNYO1yGq6N29kNIrxZ2EColx6gRYDdwYeKlITJvhX17q5Ef7Bsc8niQEZAnDYFz3NZQZff4SHhvj5Z4rZfAks2MKXKf9S3yst4Ou
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHU8RSCHaix8S75o3LkdZtmWOlfHoj3jYFB2GHCXIxiTG7tpNAl95PoBApEi0xoQ6j_tq7yDPscc97zG-kG2WG5Rxe1PGtCr-yVFNdjtWPB_wfT6yRbmaF0IfPouHEhT6rZg_6IoGO-JRDY1wctFVIZ
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFLiHuQp6QM3_2cSHCLd49StwUaE8RBgWzCKRLjGcay7wPuwE6XBr3S8Zh2dLmLP8kz3fmYk2vHYk45Rf2ENvQWj1vWJxCDrcVX6Qj-XejxdVopcqj4A61UuCM=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHzDo4fi-Aany2mpj3DisyU7wbEBhiH3rmV5rLtXIoTog1kzbHB1D_Cz6wB_ZYfRlC30GrTbyPBgRqlALjlHUyiolrmRL-51c6psD4vj7r8GZV_asUghBG7qmHjIgoiRw2gLhPr4u-sPJYrY9Yf9GD6-xXMw_PwK68x-pUpXLC6A8DA9YW80woA
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGdVHRhULApve_D7jIqCvPHWdlxTbLOxLopMy10C6uj_DKORAKseUrF_YjfzzIJSg81BIpgCVY7YUQuyPXafj1Rd291qpxyYZ46-SMV0KEMoBZRW3yvqAswPDSYVEBrBGRUJqXpn81eitR2YgLzgbZWg44OtkhsjO0xTA==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHoaQeO97l9dlkeaw5NxDhuByO2KpFWarKo94FbpL0cRfW4jHdyxV6oW7tPVepyTjaezBFLBECwkcD1YQdCqwZrR4Mzk7AyC_ORpmDUSmeIlI743cHVtwh-aFxTTOapSMwYyhXuEuLhELuN5Yqtmw==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG0Qqn2ulj49NIpjGijnnx2IA9Oofp_ArpE2519hCmaatIx7V_d5q9iK4ypVw_ZUwuM_f0MqlP4bxr9BV8LIGiJh9v20Qmz5di1hz8IUa6C3r9fHwPGpXJioZvSr79CHte7sUC-xcaZ36Fq04Yt25wUSoGaT4NUD9bN_XTdP1BBhJn1Dhos4nZDCQqOWWWAs_mjvu7FiJlFaSr6Bw7NcvkvjJW00kWu-ggF0Y0
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHfRXdJhMvimlqO3CagPxpszcmTGN_sUP8CJhOY2wB1OXVTNr9s9IlZmi6DfDNR2nSoFs7q9J8JWxSvVjaVnWVO3RqtALH1fOLFzLgHfypjHqJglCjEuvNIj5wzOWm5XH0nzIFnIo4hd7qjYdGjJPGDx3GNGqD4hSCr
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFyZipDtfVO5LZMeBJaP_hDIFSPpwdnaORs7mCx-9eggVzNfsrzfPfHVwI4ZynWSiuBiqwjey-uhrNTdTcAj-i-fPUM1PfF0S2VQHK4CNFOCGX_q51FKkgj-zjT_LkpVOBySVxjtaB-TQqm45YSXr7k94juzCKidALaIcm3-D1tjPwyVUo1gCr-1h7YKUABpopHHz19XOCaoviEx7D3mV4IEFTKr_hBO4lEMRPa13MRCp_