@@ -23,15 +23,15 @@ func archPtrSize(arch string) int {
23
23
switch arch {
24
24
case "386" , "arm" :
25
25
return 4
26
- case "amd64" , "arm64" , "mips64" , "riscv64" :
26
+ case "amd64" , "arm64" , "mips64" , "ppc64" , " riscv64" :
27
27
return 8
28
28
default :
29
29
log .Fatalf ("Unknown arch %q" , arch )
30
30
return 0
31
31
}
32
32
}
33
33
34
- func generateASMFile (arch string , inFileNames []string , outFileName string ) map [string ]bool {
34
+ func generateASMFile (goos , arch string , inFileNames []string , outFileName string ) map [string ]bool {
35
35
trampolines := map [string ]bool {}
36
36
var orderedTrampolines []string
37
37
for _ , inFileName := range inFileNames {
@@ -62,7 +62,12 @@ func generateASMFile(arch string, inFileNames []string, outFileName string) map[
62
62
fmt .Fprintf (& out , "#include \" textflag.h\" \n " )
63
63
for _ , fn := range orderedTrampolines {
64
64
fmt .Fprintf (& out , "\n TEXT %s_trampoline<>(SB),NOSPLIT,$0-0\n " , fn )
65
- fmt .Fprintf (& out , "\t JMP\t %s(SB)\n \n " , fn )
65
+ if goos == "openbsd" && arch == "ppc64" {
66
+ fmt .Fprintf (& out , "\t CALL\t %s(SB)\n " , fn )
67
+ fmt .Fprintf (& out , "\t RET\n " )
68
+ } else {
69
+ fmt .Fprintf (& out , "\t JMP\t %s(SB)\n " , fn )
70
+ }
66
71
fmt .Fprintf (& out , "GLOBL\t ·%s_trampoline_addr(SB), RODATA, $%d\n " , fn , ptrSize )
67
72
fmt .Fprintf (& out , "DATA\t ·%s_trampoline_addr(SB)/%d, $%s_trampoline<>(SB)\n " , fn , ptrSize , fn )
68
73
}
@@ -127,7 +132,7 @@ func main() {
127
132
zsyscallArchFilename ,
128
133
}
129
134
130
- trampolines := generateASMFile (arch , inFileNames , zsyscallASMFileName )
135
+ trampolines := generateASMFile (goos , arch , inFileNames , zsyscallASMFileName )
131
136
132
137
if goos == "darwin" {
133
138
writeDarwinTest (trampolines , fmt .Sprintf ("darwin_%s_test.go" , arch ), arch )
0 commit comments