1 | #!/usr/bin/env bash
|
---|
2 | # Copyright 2009 The Go Authors. All rights reserved.
|
---|
3 | # Use of this source code is governed by a BSD-style
|
---|
4 | # license that can be found in the LICENSE file.
|
---|
5 |
|
---|
6 | # The plan9 package provides access to the raw system call
|
---|
7 | # interface of the underlying operating system. Porting Go to
|
---|
8 | # a new architecture/operating system combination requires
|
---|
9 | # some manual effort, though there are tools that automate
|
---|
10 | # much of the process. The auto-generated files have names
|
---|
11 | # beginning with z.
|
---|
12 | #
|
---|
13 | # This script runs or (given -n) prints suggested commands to generate z files
|
---|
14 | # for the current system. Running those commands is not automatic.
|
---|
15 | # This script is documentation more than anything else.
|
---|
16 | #
|
---|
17 | # * asm_${GOOS}_${GOARCH}.s
|
---|
18 | #
|
---|
19 | # This hand-written assembly file implements system call dispatch.
|
---|
20 | # There are three entry points:
|
---|
21 | #
|
---|
22 | # func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr);
|
---|
23 | # func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
|
---|
24 | # func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr);
|
---|
25 | #
|
---|
26 | # The first and second are the standard ones; they differ only in
|
---|
27 | # how many arguments can be passed to the kernel.
|
---|
28 | # The third is for low-level use by the ForkExec wrapper;
|
---|
29 | # unlike the first two, it does not call into the scheduler to
|
---|
30 | # let it know that a system call is running.
|
---|
31 | #
|
---|
32 | # * syscall_${GOOS}.go
|
---|
33 | #
|
---|
34 | # This hand-written Go file implements system calls that need
|
---|
35 | # special handling and lists "//sys" comments giving prototypes
|
---|
36 | # for ones that can be auto-generated. Mksyscall reads those
|
---|
37 | # comments to generate the stubs.
|
---|
38 | #
|
---|
39 | # * syscall_${GOOS}_${GOARCH}.go
|
---|
40 | #
|
---|
41 | # Same as syscall_${GOOS}.go except that it contains code specific
|
---|
42 | # to ${GOOS} on one particular architecture.
|
---|
43 | #
|
---|
44 | # * types_${GOOS}.c
|
---|
45 | #
|
---|
46 | # This hand-written C file includes standard C headers and then
|
---|
47 | # creates typedef or enum names beginning with a dollar sign
|
---|
48 | # (use of $ in variable names is a gcc extension). The hardest
|
---|
49 | # part about preparing this file is figuring out which headers to
|
---|
50 | # include and which symbols need to be #defined to get the
|
---|
51 | # actual data structures that pass through to the kernel system calls.
|
---|
52 | # Some C libraries present alternate versions for binary compatibility
|
---|
53 | # and translate them on the way in and out of system calls, but
|
---|
54 | # there is almost always a #define that can get the real ones.
|
---|
55 | # See types_darwin.c and types_linux.c for examples.
|
---|
56 | #
|
---|
57 | # * zerror_${GOOS}_${GOARCH}.go
|
---|
58 | #
|
---|
59 | # This machine-generated file defines the system's error numbers,
|
---|
60 | # error strings, and signal numbers. The generator is "mkerrors.sh".
|
---|
61 | # Usually no arguments are needed, but mkerrors.sh will pass its
|
---|
62 | # arguments on to godefs.
|
---|
63 | #
|
---|
64 | # * zsyscall_${GOOS}_${GOARCH}.go
|
---|
65 | #
|
---|
66 | # Generated by mksyscall.pl; see syscall_${GOOS}.go above.
|
---|
67 | #
|
---|
68 | # * zsysnum_${GOOS}_${GOARCH}.go
|
---|
69 | #
|
---|
70 | # Generated by mksysnum_${GOOS}.
|
---|
71 | #
|
---|
72 | # * ztypes_${GOOS}_${GOARCH}.go
|
---|
73 | #
|
---|
74 | # Generated by godefs; see types_${GOOS}.c above.
|
---|
75 |
|
---|
76 | GOOSARCH="${GOOS}_${GOARCH}"
|
---|
77 |
|
---|
78 | # defaults
|
---|
79 | mksyscall="go run mksyscall.go"
|
---|
80 | mkerrors="./mkerrors.sh"
|
---|
81 | zerrors="zerrors_$GOOSARCH.go"
|
---|
82 | mksysctl=""
|
---|
83 | zsysctl="zsysctl_$GOOSARCH.go"
|
---|
84 | mksysnum=
|
---|
85 | mktypes=
|
---|
86 | run="sh"
|
---|
87 |
|
---|
88 | case "$1" in
|
---|
89 | -syscalls)
|
---|
90 | for i in zsyscall*go
|
---|
91 | do
|
---|
92 | sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i
|
---|
93 | rm _$i
|
---|
94 | done
|
---|
95 | exit 0
|
---|
96 | ;;
|
---|
97 | -n)
|
---|
98 | run="cat"
|
---|
99 | shift
|
---|
100 | esac
|
---|
101 |
|
---|
102 | case "$#" in
|
---|
103 | 0)
|
---|
104 | ;;
|
---|
105 | *)
|
---|
106 | echo 'usage: mkall.sh [-n]' 1>&2
|
---|
107 | exit 2
|
---|
108 | esac
|
---|
109 |
|
---|
110 | case "$GOOSARCH" in
|
---|
111 | _* | *_ | _)
|
---|
112 | echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2
|
---|
113 | exit 1
|
---|
114 | ;;
|
---|
115 | plan9_386)
|
---|
116 | mkerrors=
|
---|
117 | mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,386"
|
---|
118 | mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h"
|
---|
119 | mktypes="XXX"
|
---|
120 | ;;
|
---|
121 | plan9_amd64)
|
---|
122 | mkerrors=
|
---|
123 | mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,amd64"
|
---|
124 | mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h"
|
---|
125 | mktypes="XXX"
|
---|
126 | ;;
|
---|
127 | plan9_arm)
|
---|
128 | mkerrors=
|
---|
129 | mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,arm"
|
---|
130 | mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h"
|
---|
131 | mktypes="XXX"
|
---|
132 | ;;
|
---|
133 | *)
|
---|
134 | echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2
|
---|
135 | exit 1
|
---|
136 | ;;
|
---|
137 | esac
|
---|
138 |
|
---|
139 | (
|
---|
140 | if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi
|
---|
141 | case "$GOOS" in
|
---|
142 | plan9)
|
---|
143 | syscall_goos="syscall_$GOOS.go"
|
---|
144 | if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos |gofmt >zsyscall_$GOOSARCH.go"; fi
|
---|
145 | ;;
|
---|
146 | esac
|
---|
147 | if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi
|
---|
148 | if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi
|
---|
149 | if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go |gofmt >ztypes_$GOOSARCH.go"; fi
|
---|
150 | ) | $run
|
---|