diff options
author | Ian Lewis <ianmlewis@gmail.com> | 2019-07-03 00:38:04 -0400 |
---|---|---|
committer | Ian Lewis <ianlewis@google.com> | 2019-07-10 11:46:34 +0900 |
commit | 6714bee53bbe6cdc3943e59f30ec7765907e80b0 (patch) | |
tree | 5483dd5a678ef82a3bd1251f90471312677f8baf | |
parent | 82b3d5ffd3e6448664829f65ee6efe427c615879 (diff) |
Add generate-syscall-docs command.
Adds a new command to automatically generate the syscall compatibility
docs from runsc.
-rw-r--r-- | .gcloudignore | 2 | ||||
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 20 | ||||
-rw-r--r-- | cloudbuild.yaml | 55 | ||||
-rw-r--r-- | cmd/generate-syscall-docs/main.go | 203 | ||||
-rw-r--r-- | cmd/gvisor-website/main.go | 4 | ||||
-rw-r--r-- | content/docs/user_guide/compatibility/amd64.md | 713 | ||||
-rw-r--r-- | content/docs/user_guide/compatibility/linux/.gitignore | 1 | ||||
-rw-r--r-- | go.mod | 3 |
9 files changed, 279 insertions, 723 deletions
diff --git a/.gcloudignore b/.gcloudignore index a1ac4bdf6..ec372978f 100644 --- a/.gcloudignore +++ b/.gcloudignore @@ -1,3 +1,5 @@ +bin/ public/ resources/ node_modules/ +upstream/ diff --git a/.gitignore b/.gitignore index 56919aaf9..ec372978f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +bin/ public/ resources/ node_modules/ @@ -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 diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 25944303a..f8bf38566 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -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 diff --git a/cmd/generate-syscall-docs/main.go b/cmd/generate-syscall-docs/main.go new file mode 100644 index 000000000..006bd1ce5 --- /dev/null +++ b/cmd/generate-syscall-docs/main.go @@ -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) + } + } + } +} diff --git a/cmd/gvisor-website/main.go b/cmd/gvisor-website/main.go index ecae64279..dd6058081 100644 --- a/cmd/gvisor-website/main.go +++ b/cmd/gvisor-website/main.go @@ -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", diff --git a/content/docs/user_guide/compatibility/amd64.md b/content/docs/user_guide/compatibility/amd64.md deleted file mode 100644 index b9500bcc6..000000000 --- a/content/docs/user_guide/compatibility/amd64.md +++ /dev/null @@ -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> diff --git a/content/docs/user_guide/compatibility/linux/.gitignore b/content/docs/user_guide/compatibility/linux/.gitignore new file mode 100644 index 000000000..97958c35e --- /dev/null +++ b/content/docs/user_guide/compatibility/linux/.gitignore @@ -0,0 +1 @@ +amd64.md @@ -0,0 +1,3 @@ +module gvisor.dev/website + +go 1.12 |