Add generate-syscall-docs command.

Adds a new command to automatically generate the syscall compatibility
docs from runsc.
This commit is contained in:
Ian Lewis 2019-07-03 00:38:04 -04:00 committed by Ian Lewis
parent 82b3d5ffd3
commit 6714bee53b
9 changed files with 279 additions and 723 deletions

View File

@ -1,3 +1,5 @@
bin/
public/
resources/
node_modules/
upstream/

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
bin/
public/
resources/
node_modules/

View File

@ -6,6 +6,7 @@ GCLOUD := gcloud
GCP_PROJECT := gvisor-website
# Source Go files, example: main.go, foo/bar.go.
GEN_SOURCE = $(wildcard cmd/generate-syscall-docs/*)
APP_SOURCE = $(wildcard cmd/gvisor-website/*)
# Target Go files, example: public/main.go, public/foo/bar.go.
APP_TARGET = $(patsubst cmd/gvisor-website/%,public/%,$(APP_SOURCE))
@ -40,7 +41,7 @@ content/docs/community/sigs: upstream/community $(wildcard upstream/community/si
$(APP_TARGET): public $(APP_SOURCE)
cp -a cmd/gvisor-website/$(patsubst public/%,%,$@) public/
public/static: node_modules config.toml $(shell find archetypes assets content themes -type f | sed 's/ /\\ /g')
public/static: compatibility-docs node_modules config.toml $(shell find archetypes assets content themes -type f | sed 's/ /\\ /g')
HUGO_ENV="production" $(HUGO)
node_modules: package.json package-lock.json
@ -48,8 +49,19 @@ node_modules: package.json package-lock.json
# See: https://github.com/npm/npm/issues/18286
$(NPM) ci
upstream/gvisor/bazel-bin/runsc/linux_amd64_pure_stripped/runsc: upstream-gvisor
cd upstream/gvisor && bazel build runsc
bin/generate-syscall-docs: $(GEN_SOURCE)
mkdir -p bin/
go build -o bin/generate-syscall-docs gvisor.dev/website/cmd/generate-syscall-docs
.PHONY: compatibility-docs
compatibility-docs: bin/generate-syscall-docs upstream/gvisor/bazel-bin/runsc/linux_amd64_pure_stripped/runsc
./upstream/gvisor/bazel-bin/runsc/linux_amd64_pure_stripped/runsc help syscalls -o json | ./bin/generate-syscall-docs -out ./content/docs/user_guide/compatibility/
# Run a local content development server. Redirects will not be supported.
server: all-upstream
server: all-upstream compatibility-docs
$(HUGO) server -FD --port 8080
.PHONY: server
@ -63,7 +75,7 @@ deploy: $(APP_TARGET)
# Submit a build to Cloud Build manually. Used to test cloudbuild.yaml changes.
cloud-build:
gcloud builds submit --config cloudbuild/cloudbuild.yaml .
gcloud builds submit --config cloudbuild.yaml .
# Build and push the hugo Docker image used by Cloud Build.
hugo-docker-image:
@ -78,5 +90,5 @@ htmlproofer-docker-image:
.PHONY: htmlproofer-docker-image
clean:
rm -rf public/ resources/ node_modules/ upstream/
rm -rf public/ resources/ node_modules/ upstream/ content/docs/user_guide/compatibility/linux/
.PHONY: clean

View File

@ -13,15 +13,62 @@
# limitations under the License.
steps:
- name: 'bash'
args: ['bash', '-c', 'mkdir -p upstream/']
# Clone the upstream repos
- name: 'gcr.io/cloud-builders/git'
args: ['clone', 'https://github.com/google/gvisor.git']
dir: 'upstream'
- name: 'gcr.io/cloud-builders/git'
args: ['clone', 'https://gvisor.googlesource.com/community']
dir: 'upstream'
# Build runsc
- name: 'gcr.io/cloud-builders/bazel'
args:
- 'build'
- '--show_timestamps'
- '--test_output=errors'
- '--keep_going'
- '--verbose_failures'
- 'runsc'
dir: 'upstream/gvisor'
# Build the compatibility doc generator tool
- name: 'golang'
env: ['GO111MODULE=on']
args:
- 'go'
- 'build'
- '-o'
- 'bin/generate-syscall-docs'
- 'gvisor.dev/website/cmd/generate-syscall-docs'
# Generate compatibility docs.
- name: 'bash'
args:
- 'bash'
- '-c'
- >
./upstream/gvisor/bazel-bin/runsc/linux_amd64_pure_stripped/runsc help syscalls -o json |
./bin/generate-syscall-docs -out ./content/docs/user_guide/compatibility/
# Pull npm dependencies for scss
- name: 'gcr.io/cloud-builders/npm'
args: ['ci']
# Generate the website.
- name: 'gcr.io/gvisor-website/hugo:0.53'
args: ["make"]
env: ['HUGO_ENV=production']
args: ["hugo"]
# Test the HTML for issues.
- name: 'gcr.io/gvisor-website/html-proofer:3.10.2'
args: ["htmlproofer", "--disable-external", "--check-html", "public/static"]
args:
- "htmlproofer"
- "--disable-external"
- "--check-html"
- "public/static"
# Deploy to App Engine only for master branch.
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
args:
- '-c'
- 'if [[ "$PROJECT_ID" == "gvisor-website" && "$BRANCH_NAME" == "master" ]]; then gcloud app deploy public/app.yaml; fi'
- >
if [[ "$PROJECT_ID" == "gvisor-website" && "$BRANCH_NAME" == "master" ]]; then
gcloud app deploy public/app.yaml;
fi

View File

@ -0,0 +1,203 @@
// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"bufio"
"encoding/json"
"flag"
"fmt"
"io"
"os"
"path/filepath"
"sort"
"strings"
"text/template"
)
type CompatibilityInfo map[string]map[string]ArchInfo
// ArchInfo is compatbility doc for an architecture.
type ArchInfo struct {
// Syscalls maps syscall number for the architecture to the doc.
Syscalls map[uintptr]SyscallDoc `json:"syscalls"`
}
// SyscallDoc represents a single item of syscall documentation.
type SyscallDoc struct {
Name string `json:"name"`
Support string `json:"support"`
Note string `json:"note,omitempty"`
URLs []string `json:"urls,omitempty"`
}
var mdTemplate = template.Must(template.New("out").Parse(`
+++
title = "{{.OS}}/{{.Arch}}"
description = "Syscall Compatibility Reference Documentation for {{.OS}}/{{.Arch}}"
weight = {{.Weight}}
+++
This table is a reference of {{.OS}} syscalls for the {{.Arch}} architecture and
their compatibility status in gVisor. gVisor does not support all syscalls and
some syscalls may have a partial implementation.
Of {{.Total}} syscalls, {{.Supported}} syscalls have a full or partial
implementation. There are currently {{.Unsupported}} unsupported
syscalls. {{if .Undocumented}}{{.Undocumented}} syscalls are not yet documented.{{end}}
<table>
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Support</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
{{range $i, $syscall := .Syscalls}}
<tr>
<td><a class="doc-table-anchor" id="{{.Name}}"></a>{{.Number}}</td>
<td><a href="http://man7.org/linux/man-pages/man2/{{.Name}}.2.html" target="_blank" rel="noopener">{{.Name}}</a></td>
<td>{{.Support}}</td>
<td>{{.Note}} {{range $i, $url := .URLs}}<br/>See: <a href="{{.}}">{{.}}</a>{{end}}</td>
</tr>
{{end}}
</tbody>
</table>
`))
// Fatalf writes a message to stderr and exits with error code 1
func Fatalf(format string, a ...interface{}) {
fmt.Fprintf(os.Stderr, format, a...)
os.Exit(1)
}
func main() {
inputFlag := flag.String("in", "-", "File to input ('-' for stdin)")
outputDir := flag.String("out", ".", "Directory to output files.")
flag.Parse()
var input io.Reader
if *inputFlag == "-" {
input = os.Stdin
} else {
i, err := os.Open(*inputFlag)
if err != nil {
Fatalf("Error opening %q: %v", *inputFlag, err)
}
input = i
}
input = bufio.NewReader(input)
var info CompatibilityInfo
d := json.NewDecoder(input)
if err := d.Decode(&info); err != nil {
Fatalf("Error reading json: %v")
}
weight := 0
for osName, osInfo := range info {
for archName, archInfo := range osInfo {
outDir := filepath.Join(*outputDir, osName)
outFile := filepath.Join(outDir, archName+".md")
if err := os.MkdirAll(outDir, 0755); err != nil {
Fatalf("Error creating directory %q: %v", *outputDir, err)
}
f, err := os.OpenFile(outFile, os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
Fatalf("Error opening file %q: %v", outFile, err)
}
defer f.Close()
weight += 10
data := struct {
OS string
Arch string
Weight int
Total int
Supported int
Unsupported int
Undocumented int
Syscalls []struct {
Name string
Number uintptr
Support string
Note string
URLs []string
}
}{
OS: strings.Title(osName),
Arch: archName,
Weight: weight,
Total: 0,
Supported: 0,
Unsupported: 0,
Undocumented: 0,
Syscalls: []struct {
Name string
Number uintptr
Support string
Note string
URLs []string
}{},
}
for num, s := range archInfo.Syscalls {
switch s.Support {
case "Full Support", "Partial Support":
data.Supported++
case "Unimplemented":
data.Unsupported++
default:
data.Undocumented++
}
data.Total++
for i := range s.URLs {
if !strings.HasPrefix(s.URLs[i], "http://") && !strings.HasPrefix(s.URLs[i], "https://") {
s.URLs[i] = "https://" + s.URLs[i]
}
}
data.Syscalls = append(data.Syscalls, struct {
Name string
Number uintptr
Support string
Note string
URLs []string
}{
Name: s.Name,
Number: num,
Support: s.Support,
Note: s.Note, // TODO urls
URLs: s.URLs,
})
}
sort.Slice(data.Syscalls, func(i, j int) bool {
return data.Syscalls[i].Number < data.Syscalls[j].Number
})
if err := mdTemplate.Execute(f, data); err != nil {
Fatalf("Error writing file %q: %v", outFile, err)
}
}
}
}

View File

@ -37,7 +37,7 @@ var redirects = map[string]string{
// Redirects to compatibility docs.
"/c": "/docs/user_guide/compatibility",
"/c/linux/amd64": "/docs/user_guide/compatibility/amd64",
"/c/linux/amd64": "/docs/user_guide/compatibility/linux/amd64",
// Deprecated, but links continue to work.
"/cl": "https://gvisor-review.googlesource.com",
@ -49,7 +49,7 @@ var prefixHelpers = map[string]string{
"pr": "https://github.com/google/gvisor/pull/%s",
// Redirects to compatibility docs.
"c/linux/amd64": "/docs/user_guide/compatibility/amd64/#%s",
"c/linux/amd64": "/docs/user_guide/compatibility/linux/amd64/#%s",
// Deprecated, but links continue to work.
"cl": "https://gvisor-review.googlesource.com/c/gvisor/+/%s",

View File

@ -1,713 +0,0 @@
+++
title = "AMD64"
description = "Syscall Compatibility Reference Documentation for AMD64"
weight = 10
+++
This table is a reference of Linux syscalls for the AMD64 architecture and
their compatibility status in gVisor. gVisor does not support all syscalls and
some syscalls may have a partial implementation.
Of 329 syscalls, 47 syscalls have a full or partial
implementation. There are currently 51 unimplemented
syscalls. 231 syscalls are not yet documented.
<table>
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Support</th>
<th>GitHub Issue</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="doc-table-anchor" id="msgget"></a>68</td>
<td><a href="http://man7.org/linux/man-pages/man2/msgget.2.html" target="_blank" rel="noopener">msgget</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="msgsnd"></a>69</td>
<td><a href="http://man7.org/linux/man-pages/man2/msgsnd.2.html" target="_blank" rel="noopener">msgsnd</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="msgrcv"></a>70</td>
<td><a href="http://man7.org/linux/man-pages/man2/msgrcv.2.html" target="_blank" rel="noopener">msgrcv</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="msgctl"></a>71</td>
<td><a href="http://man7.org/linux/man-pages/man2/msgctl.2.html" target="_blank" rel="noopener">msgctl</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="setfsuid"></a>122</td>
<td><a href="http://man7.org/linux/man-pages/man2/setfsuid.2.html" target="_blank" rel="noopener">setfsuid</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="setfsgid"></a>123</td>
<td><a href="http://man7.org/linux/man-pages/man2/setfsgid.2.html" target="_blank" rel="noopener">setfsgid</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="uselib"></a>134</td>
<td><a href="http://man7.org/linux/man-pages/man2/uselib.2.html" target="_blank" rel="noopener">uselib</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Obsolete</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="personality"></a>135</td>
<td><a href="http://man7.org/linux/man-pages/man2/personality.2.html" target="_blank" rel="noopener">personality</a></td>
<td>Partial</td>
<td></td>
<td>Returns EINVAL; Unable to change personality</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="ustat"></a>136</td>
<td><a href="http://man7.org/linux/man-pages/man2/ustat.2.html" target="_blank" rel="noopener">ustat</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Needs filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="sysfs"></a>139</td>
<td><a href="http://man7.org/linux/man-pages/man2/sysfs.2.html" target="_blank" rel="noopener">sysfs</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="sched_setparam"></a>142</td>
<td><a href="http://man7.org/linux/man-pages/man2/sched_setparam.2.html" target="_blank" rel="noopener">sched_setparam</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_nice; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="schedrrgetinterval"></a>148</td>
<td><a href="http://man7.org/linux/man-pages/man2/sched_rr_get_interval.2.html" target="_blank" rel="noopener">sched_rr_get_interval</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="vhangup"></a>153</td>
<td><a href="http://man7.org/linux/man-pages/man2/vhangup.2.html" target="_blank" rel="noopener">vhangup</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="modify_ldt"></a>154</td>
<td><a href="http://man7.org/linux/man-pages/man2/modify_ldt.2.html" target="_blank" rel="noopener">modify_ldt</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="pivot_root"></a>155</td>
<td><a href="http://man7.org/linux/man-pages/man2/pivot_root.2.html" target="_blank" rel="noopener">pivot_root</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="sysctl"></a>156</td>
<td><a href="http://man7.org/linux/man-pages/man2/sysctl.2.html" target="_blank" rel="noopener">sysctl</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="adjtimex"></a>159</td>
<td><a href="http://man7.org/linux/man-pages/man2/adjtimex.2.html" target="_blank" rel="noopener">adjtimex</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_time; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="acct"></a>163</td>
<td><a href="http://man7.org/linux/man-pages/man2/acct.2.html" target="_blank" rel="noopener">acct</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_pacct; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="settimeofday"></a>164</td>
<td><a href="http://man7.org/linux/man-pages/man2/settimeofday.2.html" target="_blank" rel="noopener">settimeofday</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_time; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="swapon"></a>167</td>
<td><a href="http://man7.org/linux/man-pages/man2/swapon.2.html" target="_blank" rel="noopener">swapon</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_admin; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="swapoff"></a>168</td>
<td><a href="http://man7.org/linux/man-pages/man2/swapoff.2.html" target="_blank" rel="noopener">swapoff</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_admin; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="reboot"></a>169</td>
<td><a href="http://man7.org/linux/man-pages/man2/reboot.2.html" target="_blank" rel="noopener">reboot</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_boot; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="iopl"></a>172</td>
<td><a href="http://man7.org/linux/man-pages/man2/iopl.2.html" target="_blank" rel="noopener">iopl</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_rawio; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="ioperm"></a>173</td>
<td><a href="http://man7.org/linux/man-pages/man2/ioperm.2.html" target="_blank" rel="noopener">ioperm</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_rawio; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="create_module"></a>174</td>
<td><a href="http://man7.org/linux/man-pages/man2/create_module.2.html" target="_blank" rel="noopener">create_module</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_module; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="init_module"></a>175</td>
<td><a href="http://man7.org/linux/man-pages/man2/init_module.2.html" target="_blank" rel="noopener">init_module</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_module; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="delete_module"></a>176</td>
<td><a href="http://man7.org/linux/man-pages/man2/delete_module.2.html" target="_blank" rel="noopener">delete_module</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_module; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="get_kernel_syms"></a>177</td>
<td><a href="http://man7.org/linux/man-pages/man2/get_kernel_syms.2.html" target="_blank" rel="noopener">get_kernel_syms</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Not supported in > 2.6</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="query_module"></a>178</td>
<td><a href="http://man7.org/linux/man-pages/man2/query_module.2.html" target="_blank" rel="noopener">query_module</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Not supported in > 2.6</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="quotactl"></a>179</td>
<td><a href="http://man7.org/linux/man-pages/man2/quotactl.2.html" target="_blank" rel="noopener">quotactl</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_admin; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="nfsservctl"></a>180</td>
<td><a href="http://man7.org/linux/man-pages/man2/nfsservctl.2.html" target="_blank" rel="noopener">nfsservctl</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Does not exist > 3.1</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="getpmsg"></a>181</td>
<td><a href="http://man7.org/linux/man-pages/man2/getpmsg.2.html" target="_blank" rel="noopener">getpmsg</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Not implemented in Linux</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="putpmsg"></a>182</td>
<td><a href="http://man7.org/linux/man-pages/man2/putpmsg.2.html" target="_blank" rel="noopener">putpmsg</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Not implemented in Linux</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="afs_syscall"></a>183</td>
<td><a href="http://man7.org/linux/man-pages/man2/afs_syscall.2.html" target="_blank" rel="noopener">afs_syscall</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Not implemented in Linux</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="tuxcall"></a>184</td>
<td><a href="http://man7.org/linux/man-pages/man2/tuxcall.2.html" target="_blank" rel="noopener">tuxcall</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Not implemented in Linux</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="security"></a>185</td>
<td><a href="http://man7.org/linux/man-pages/man2/security.2.html" target="_blank" rel="noopener">security</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Not implemented in Linux</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="readahead"></a>187</td>
<td><a href="http://man7.org/linux/man-pages/man2/readahead.2.html" target="_blank" rel="noopener">readahead</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="setxattr"></a>188</td>
<td><a href="http://man7.org/linux/man-pages/man2/setxattr.2.html" target="_blank" rel="noopener">setxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="lsetxattr"></a>189</td>
<td><a href="http://man7.org/linux/man-pages/man2/lsetxattr.2.html" target="_blank" rel="noopener">lsetxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="fsetxattr"></a>190</td>
<td><a href="http://man7.org/linux/man-pages/man2/fsetxattr.2.html" target="_blank" rel="noopener">fsetxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="getxattr"></a>191</td>
<td><a href="http://man7.org/linux/man-pages/man2/getxattr.2.html" target="_blank" rel="noopener">getxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="lgetxattr"></a>192</td>
<td><a href="http://man7.org/linux/man-pages/man2/lgetxattr.2.html" target="_blank" rel="noopener">lgetxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="fgetxattr"></a>193</td>
<td><a href="http://man7.org/linux/man-pages/man2/fgetxattr.2.html" target="_blank" rel="noopener">fgetxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="listxattr"></a>194</td>
<td><a href="http://man7.org/linux/man-pages/man2/listxattr.2.html" target="_blank" rel="noopener">listxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="llistxattr"></a>195</td>
<td><a href="http://man7.org/linux/man-pages/man2/llistxattr.2.html" target="_blank" rel="noopener">llistxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="flistxattr"></a>196</td>
<td><a href="http://man7.org/linux/man-pages/man2/flistxattr.2.html" target="_blank" rel="noopener">flistxattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="removexattr"></a>197</td>
<td><a href="http://man7.org/linux/man-pages/man2/removexattr.2.html" target="_blank" rel="noopener">removexattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="lremovexattr"></a>198</td>
<td><a href="http://man7.org/linux/man-pages/man2/lremovexattr.2.html" target="_blank" rel="noopener">lremovexattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="fremovexattr"></a>199</td>
<td><a href="http://man7.org/linux/man-pages/man2/fremovexattr.2.html" target="_blank" rel="noopener">fremovexattr</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENOTSUP; Requires filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="set_thread_area"></a>205</td>
<td><a href="http://man7.org/linux/man-pages/man2/set_thread_area.2.html" target="_blank" rel="noopener">set_thread_area</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Expected to return ENOSYS on 64-bit</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="get_thread_area"></a>211</td>
<td><a href="http://man7.org/linux/man-pages/man2/get_thread_area.2.html" target="_blank" rel="noopener">get_thread_area</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Expected to return ENOSYS on 64-bit</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="lookup_dcookie"></a>212</td>
<td><a href="http://man7.org/linux/man-pages/man2/lookup_dcookie.2.html" target="_blank" rel="noopener">lookup_dcookie</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_admin; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="epoll_ctl_old"></a>214</td>
<td>epoll_ctl_old</td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Deprecated</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="epoll_wait_old"></a>215</td>
<td>epoll_wait_old</td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Deprecated</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="remap_file_pages"></a>216</td>
<td><a href="http://man7.org/linux/man-pages/man2/remap_file_pages.2.html" target="_blank" rel="noopener">remap_file_pages</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Deprecated</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="semtimedop"></a>220</td>
<td><a href="http://man7.org/linux/man-pages/man2/semtimedop.2.html" target="_blank" rel="noopener">semtimedop</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="vserver"></a>236</td>
<td><a href="http://man7.org/linux/man-pages/man2/vserver.2.html" target="_blank" rel="noopener">vserver</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Not implemented by Linux</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="mbind"></a>237</td>
<td><a href="http://man7.org/linux/man-pages/man2/mbind.2.html" target="_blank" rel="noopener">mbind</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_nice; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="mq_open"></a>240</td>
<td><a href="http://man7.org/linux/man-pages/man2/mq_open.2.html" target="_blank" rel="noopener">mq_open</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="mq_unlink"></a>241</td>
<td><a href="http://man7.org/linux/man-pages/man2/mq_unlink.2.html" target="_blank" rel="noopener">mq_unlink</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="mq_timedsend"></a>242</td>
<td><a href="http://man7.org/linux/man-pages/man2/mq_timedsend.2.html" target="_blank" rel="noopener">mq_timedsend</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="mq_timedreceive"></a>243</td>
<td><a href="http://man7.org/linux/man-pages/man2/mq_timedreceive.2.html" target="_blank" rel="noopener">mq_timedreceive</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="mq_notify"></a>244</td>
<td><a href="http://man7.org/linux/man-pages/man2/mq_notify.2.html" target="_blank" rel="noopener">mq_notify</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="mq_getsetattr"></a>245</td>
<td><a href="http://man7.org/linux/man-pages/man2/mq_getsetattr.2.html" target="_blank" rel="noopener">mq_getsetattr</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="add_key"></a>248</td>
<td><a href="http://man7.org/linux/man-pages/man2/add_key.2.html" target="_blank" rel="noopener">add_key</a></td>
<td>Partial</td>
<td></td>
<td>Returns EACCES; Not available to user</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="request_key"></a>249</td>
<td><a href="http://man7.org/linux/man-pages/man2/request_key.2.html" target="_blank" rel="noopener">request_key</a></td>
<td>Partial</td>
<td></td>
<td>Returns EACCES; Not available to user</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="keyctl"></a>250</td>
<td><a href="http://man7.org/linux/man-pages/man2/keyctl.2.html" target="_blank" rel="noopener">keyctl</a></td>
<td>Partial</td>
<td></td>
<td>Returns EACCES; Not available to user</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="ioprio_set"></a>251</td>
<td><a href="http://man7.org/linux/man-pages/man2/ioprio_set.2.html" target="_blank" rel="noopener">ioprio_set</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_admin; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="ioprio_get"></a>252</td>
<td><a href="http://man7.org/linux/man-pages/man2/ioprio_get.2.html" target="_blank" rel="noopener">ioprio_get</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_admin; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="migrate_pages"></a>256</td>
<td><a href="http://man7.org/linux/man-pages/man2/migrate_pages.2.html" target="_blank" rel="noopener">migrate_pages</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_nice; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="set_robust_list"></a>273</td>
<td><a href="http://man7.org/linux/man-pages/man2/set_robust_list.2.html" target="_blank" rel="noopener">set_robust_list</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Obsolete</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="get_robust_list"></a>274</td>
<td><a href="http://man7.org/linux/man-pages/man2/get_robust_list.2.html" target="_blank" rel="noopener">get_robust_list</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Obsolete</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="splice"></a>275</td>
<td><a href="http://man7.org/linux/man-pages/man2/splice.2.html" target="_blank" rel="noopener">splice</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="tee"></a>276</td>
<td><a href="http://man7.org/linux/man-pages/man2/tee.2.html" target="_blank" rel="noopener">tee</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="vmsplice"></a>278</td>
<td><a href="http://man7.org/linux/man-pages/man2/vmsplice.2.html" target="_blank" rel="noopener">vmsplice</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="move_pages"></a>279</td>
<td><a href="http://man7.org/linux/man-pages/man2/move_pages.2.html" target="_blank" rel="noopener">move_pages</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_nice; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="signalfd"></a>282</td>
<td><a href="http://man7.org/linux/man-pages/man2/signalfd.2.html" target="_blank" rel="noopener">signalfd</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="signalfd4"></a>289</td>
<td><a href="http://man7.org/linux/man-pages/man2/signalfd4.2.html" target="_blank" rel="noopener">signalfd4</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="perf_event_open"></a>298</td>
<td><a href="http://man7.org/linux/man-pages/man2/perf_event_open.2.html" target="_blank" rel="noopener">perf_event_open</a></td>
<td>Partial</td>
<td></td>
<td>Returns ENODEV; No support for perf counters</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="fanotify_init"></a>300</td>
<td><a href="http://man7.org/linux/man-pages/man2/fanotify_init.2.html" target="_blank" rel="noopener">fanotify_init</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Needs CONFIG_FANOTIFY</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="fanotify_mark"></a>301</td>
<td><a href="http://man7.org/linux/man-pages/man2/fanotify_mark.2.html" target="_blank" rel="noopener">fanotify_mark</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS; Needs CONFIG_FANOTIFY</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="name_to_handle_at"></a>303</td>
<td><a href="http://man7.org/linux/man-pages/man2/name_to_handle_at.2.html" target="_blank" rel="noopener">name_to_handle_at</a></td>
<td>Partial</td>
<td></td>
<td>Returns EOPNOTSUPP; Needs filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="open_by_handle_at"></a>304</td>
<td><a href="http://man7.org/linux/man-pages/man2/open_by_handle_at.2.html" target="_blank" rel="noopener">open_by_handle_at</a></td>
<td>Partial</td>
<td></td>
<td>Returns EOPNOTSUPP; Needs filesystem support</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="clock_adjtime"></a>305</td>
<td>clock_adjtime</td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_module; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="setns"></a>308</td>
<td><a href="http://man7.org/linux/man-pages/man2/setns.2.html" target="_blank" rel="noopener">setns</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="process_vm_readv"></a>310</td>
<td><a href="http://man7.org/linux/man-pages/man2/process_vm_readv.2.html" target="_blank" rel="noopener">process_vm_readv</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="process_vm_writev"></a>311</td>
<td><a href="http://man7.org/linux/man-pages/man2/process_vm_writev.2.html" target="_blank" rel="noopener">process_vm_writev</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="kcmp"></a>312</td>
<td><a href="http://man7.org/linux/man-pages/man2/kcmp.2.html" target="_blank" rel="noopener">kcmp</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Requires cap_sys_ptrace</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="finit_module"></a>313</td>
<td><a href="http://man7.org/linux/man-pages/man2/finit_module.2.html" target="_blank" rel="noopener">finit_module</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_module; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="sched_setattr"></a>314</td>
<td><a href="http://man7.org/linux/man-pages/man2/sched_setattr.2.html" target="_blank" rel="noopener">sched_setattr</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="sched_getattr"></a>315</td>
<td><a href="http://man7.org/linux/man-pages/man2/sched_getattr.2.html" target="_blank" rel="noopener">sched_getattr</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="renameat2"></a>316</td>
<td><a href="http://man7.org/linux/man-pages/man2/renameat2.2.html" target="_blank" rel="noopener">renameat2</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="memfd_create"></a>319</td>
<td><a href="http://man7.org/linux/man-pages/man2/memfd_create.2.html" target="_blank" rel="noopener">memfd_create</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="bpf"></a>321</td>
<td><a href="http://man7.org/linux/man-pages/man2/bpf.2.html" target="_blank" rel="noopener">bpf</a></td>
<td>Partial</td>
<td></td>
<td>Returns EPERM or ENOSYS; Returns EPERM if the process does not have cap_sys_boot; ENOSYS otherwise</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="execveat"></a>322</td>
<td><a href="http://man7.org/linux/man-pages/man2/execveat.2.html" target="_blank" rel="noopener">execveat</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="userfaultfd"></a>323</td>
<td><a href="http://man7.org/linux/man-pages/man2/userfaultfd.2.html" target="_blank" rel="noopener">userfaultfd</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="membarrier"></a>324</td>
<td><a href="http://man7.org/linux/man-pages/man2/membarrier.2.html" target="_blank" rel="noopener">membarrier</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
<tr>
<td><a class="doc-table-anchor" id="copy_file_range"></a>326</td>
<td><a href="http://man7.org/linux/man-pages/man2/copy_file_range.2.html" target="_blank" rel="noopener">copy_file_range</a></td>
<td>Unimplemented</td>
<td></td>
<td>Returns ENOSYS</td>
</tr>
</tbody>
</table>

View File

@ -0,0 +1 @@
amd64.md

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module gvisor.dev/website
go 1.12