Blame vendor/golang.org/x/sys/unix/README.md

Packit 63bb0d
# Building `sys/unix`
Packit 63bb0d
Packit 63bb0d
The sys/unix package provides access to the raw system call interface of the
Packit 63bb0d
underlying operating system. See: https://godoc.org/golang.org/x/sys/unix
Packit 63bb0d
Packit 63bb0d
Porting Go to a new architecture/OS combination or adding syscalls, types, or
Packit 63bb0d
constants to an existing architecture/OS pair requires some manual effort;
Packit 63bb0d
however, there are tools that automate much of the process.
Packit 63bb0d
Packit 63bb0d
## Build Systems
Packit 63bb0d
Packit 63bb0d
There are currently two ways we generate the necessary files. We are currently
Packit 63bb0d
migrating the build system to use containers so the builds are reproducible.
Packit 63bb0d
This is being done on an OS-by-OS basis. Please update this documentation as
Packit 63bb0d
components of the build system change.
Packit 63bb0d
Packit 63bb0d
### Old Build System (currently for `GOOS != "linux"`)
Packit 63bb0d
Packit 63bb0d
The old build system generates the Go files based on the C header files
Packit 63bb0d
present on your system. This means that files
Packit 63bb0d
for a given GOOS/GOARCH pair must be generated on a system with that OS and
Packit 63bb0d
architecture. This also means that the generated code can differ from system
Packit 63bb0d
to system, based on differences in the header files.
Packit 63bb0d
Packit 63bb0d
To avoid this, if you are using the old build system, only generate the Go
Packit 63bb0d
files on an installation with unmodified header files. It is also important to
Packit 63bb0d
keep track of which version of the OS the files were generated from (ex.
Packit 63bb0d
Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes
Packit 63bb0d
and have each OS upgrade correspond to a single change.
Packit 63bb0d
Packit 63bb0d
To build the files for your current OS and architecture, make sure GOOS and
Packit 63bb0d
GOARCH are set correctly and run `mkall.sh`. This will generate the files for
Packit 63bb0d
your specific system. Running `mkall.sh -n` shows the commands that will be run.
Packit 63bb0d
Packit 63bb0d
Requirements: bash, go
Packit 63bb0d
Packit 63bb0d
### New Build System (currently for `GOOS == "linux"`)
Packit 63bb0d
Packit 63bb0d
The new build system uses a Docker container to generate the go files directly
Packit 63bb0d
from source checkouts of the kernel and various system libraries. This means
Packit 63bb0d
that on any platform that supports Docker, all the files using the new build
Packit 63bb0d
system can be generated at once, and generated files will not change based on
Packit 63bb0d
what the person running the scripts has installed on their computer.
Packit 63bb0d
Packit 63bb0d
The OS specific files for the new build system are located in the `${GOOS}`
Packit 63bb0d
directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When
Packit 63bb0d
the kernel or system library updates, modify the Dockerfile at
Packit 63bb0d
`${GOOS}/Dockerfile` to checkout the new release of the source.
Packit 63bb0d
Packit 63bb0d
To build all the files under the new build system, you must be on an amd64/Linux
Packit 63bb0d
system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will
Packit 63bb0d
then generate all of the files for all of the GOOS/GOARCH pairs in the new build
Packit 63bb0d
system. Running `mkall.sh -n` shows the commands that will be run.
Packit 63bb0d
Packit 63bb0d
Requirements: bash, go, docker
Packit 63bb0d
Packit 63bb0d
## Component files
Packit 63bb0d
Packit 63bb0d
This section describes the various files used in the code generation process.
Packit 63bb0d
It also contains instructions on how to modify these files to add a new
Packit 63bb0d
architecture/OS or to add additional syscalls, types, or constants. Note that
Packit 63bb0d
if you are using the new build system, the scripts/programs cannot be called normally.
Packit 63bb0d
They must be called from within the docker container.
Packit 63bb0d
Packit 63bb0d
### asm files
Packit 63bb0d
Packit 63bb0d
The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system
Packit 63bb0d
call dispatch. There are three entry points:
Packit 63bb0d
```
Packit 63bb0d
  func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
Packit 63bb0d
  func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
Packit 63bb0d
  func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
Packit 63bb0d
```
Packit 63bb0d
The first and second are the standard ones; they differ only in how many
Packit 63bb0d
arguments can be passed to the kernel. The third is for low-level use by the
Packit 63bb0d
ForkExec wrapper. Unlike the first two, it does not call into the scheduler to
Packit 63bb0d
let it know that a system call is running.
Packit 63bb0d
Packit 63bb0d
When porting Go to an new architecture/OS, this file must be implemented for
Packit 63bb0d
each GOOS/GOARCH pair.
Packit 63bb0d
Packit 63bb0d
### mksysnum
Packit 63bb0d
Packit 63bb0d
Mksysnum is a Go program located at `${GOOS}/mksysnum.go` (or `mksysnum_${GOOS}.go`
Packit 63bb0d
for the old system). This program takes in a list of header files containing the
Packit 63bb0d
syscall number declarations and parses them to produce the corresponding list of
Packit 63bb0d
Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated
Packit 63bb0d
constants.
Packit 63bb0d
Packit 63bb0d
Adding new syscall numbers is mostly done by running the build on a sufficiently
Packit 63bb0d
new installation of the target OS (or updating the source checkouts for the
Packit Service 3a6627
new build system). However, depending on the OS, you may need to update the
Packit 63bb0d
parsing in mksysnum.
Packit 63bb0d
Packit 63bb0d
### mksyscall.go
Packit 63bb0d
Packit 63bb0d
The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are
Packit 63bb0d
hand-written Go files which implement system calls (for unix, the specific OS,
Packit 63bb0d
or the specific OS/Architecture pair respectively) that need special handling
Packit 63bb0d
and list `//sys` comments giving prototypes for ones that can be generated.
Packit 63bb0d
Packit 63bb0d
The mksyscall.go program takes the `//sys` and `//sysnb` comments and converts
Packit 63bb0d
them into syscalls. This requires the name of the prototype in the comment to
Packit 63bb0d
match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function
Packit 63bb0d
prototype can be exported (capitalized) or not.
Packit 63bb0d
Packit 63bb0d
Adding a new syscall often just requires adding a new `//sys` function prototype
Packit 63bb0d
with the desired arguments and a capitalized name so it is exported. However, if
Packit 63bb0d
you want the interface to the syscall to be different, often one will make an
Packit 63bb0d
unexported `//sys` prototype, an then write a custom wrapper in
Packit 63bb0d
`syscall_${GOOS}.go`.
Packit 63bb0d
Packit 63bb0d
### types files
Packit 63bb0d
Packit 63bb0d
For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or
Packit 63bb0d
`types_${GOOS}.go` on the old system). This file includes standard C headers and
Packit 63bb0d
creates Go type aliases to the corresponding C types. The file is then fed
Packit 63bb0d
through godef to get the Go compatible definitions. Finally, the generated code
Packit 63bb0d
is fed though mkpost.go to format the code correctly and remove any hidden or
Packit 63bb0d
private identifiers. This cleaned-up code is written to
Packit 63bb0d
`ztypes_${GOOS}_${GOARCH}.go`.
Packit 63bb0d
Packit 63bb0d
The hardest part about preparing this file is figuring out which headers to
Packit 63bb0d
include and which symbols need to be `#define`d to get the actual data
Packit 63bb0d
structures that pass through to the kernel system calls. Some C libraries
Packit 63bb0d
preset alternate versions for binary compatibility and translate them on the
Packit 63bb0d
way in and out of system calls, but there is almost always a `#define` that can
Packit 63bb0d
get the real ones.
Packit 63bb0d
See `types_darwin.go` and `linux/types.go` for examples.
Packit 63bb0d
Packit 63bb0d
To add a new type, add in the necessary include statement at the top of the
Packit 63bb0d
file (if it is not already there) and add in a type alias line. Note that if
Packit 63bb0d
your type is significantly different on different architectures, you may need
Packit 63bb0d
some `#if/#elif` macros in your include statements.
Packit 63bb0d
Packit 63bb0d
### mkerrors.sh
Packit 63bb0d
Packit 63bb0d
This script is used to generate the system's various constants. This doesn't
Packit 63bb0d
just include the error numbers and error strings, but also the signal numbers
Packit 63bb0d
an a wide variety of miscellaneous constants. The constants come from the list
Packit 63bb0d
of include files in the `includes_${uname}` variable. A regex then picks out
Packit 63bb0d
the desired `#define` statements, and generates the corresponding Go constants.
Packit 63bb0d
The error numbers and strings are generated from `#include <errno.h>`, and the
Packit 63bb0d
signal numbers and strings are generated from `#include <signal.h>`. All of
Packit 63bb0d
these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program,
Packit 63bb0d
`_errors.c`, which prints out all the constants.
Packit 63bb0d
Packit 63bb0d
To add a constant, add the header that includes it to the appropriate variable.
Packit 63bb0d
Then, edit the regex (if necessary) to match the desired constant. Avoid making
Packit 63bb0d
the regex too broad to avoid matching unintended constants.
Packit 63bb0d
Packit Service 3a6627
### mkmerge.go
Packit Service 3a6627
Packit Service 3a6627
This program is used to extract duplicate const, func, and type declarations
Packit Service 3a6627
from the generated architecture-specific files listed below, and merge these
Packit Service 3a6627
into a common file for each OS.
Packit Service 3a6627
Packit Service 3a6627
The merge is performed in the following steps:
Packit Service 3a6627
1. Construct the set of common code that is idential in all architecture-specific files.
Packit Service 3a6627
2. Write this common code to the merged file.
Packit Service 3a6627
3. Remove the common code from all architecture-specific files.
Packit Service 3a6627
Packit 63bb0d
Packit 63bb0d
## Generated files
Packit 63bb0d
Packit Service 3a6627
### `zerrors_${GOOS}_${GOARCH}.go`
Packit 63bb0d
Packit 63bb0d
A file containing all of the system's generated error numbers, error strings,
Packit 63bb0d
signal numbers, and constants. Generated by `mkerrors.sh` (see above).
Packit 63bb0d
Packit 63bb0d
### `zsyscall_${GOOS}_${GOARCH}.go`
Packit 63bb0d
Packit 63bb0d
A file containing all the generated syscalls for a specific GOOS and GOARCH.
Packit 63bb0d
Generated by `mksyscall.go` (see above).
Packit 63bb0d
Packit 63bb0d
### `zsysnum_${GOOS}_${GOARCH}.go`
Packit 63bb0d
Packit 63bb0d
A list of numeric constants for all the syscall number of the specific GOOS
Packit 63bb0d
and GOARCH. Generated by mksysnum (see above).
Packit 63bb0d
Packit 63bb0d
### `ztypes_${GOOS}_${GOARCH}.go`
Packit 63bb0d
Packit 63bb0d
A file containing Go types for passing into (or returning from) syscalls.
Packit 63bb0d
Generated by godefs and the types file (see above).