-
Notifications
You must be signed in to change notification settings - Fork 17.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
syscall: new files for plan_arm support
Implementation closely follows plan9_386 version. Change-Id: Ifb76e001fb5664e6a23541cf4768d7f11b2be68b Reviewed-on: https://go-review.googlesource.com/18967 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
- Loading branch information
Showing
2 changed files
with
391 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
// Copyright 2009 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
#include "textflag.h" | ||
|
||
#define SYS_SEEK 39 /* from zsysnum_plan9.go */ | ||
|
||
// System call support for plan9 on arm | ||
|
||
TEXT sysresult<>(SB),NOSPLIT,$12 | ||
MOVW $runtime·emptystring+0(SB), R2 | ||
CMP $-1, R0 | ||
B.NE ok | ||
MOVW R1, save-4(SP) | ||
BL runtime·errstr(SB) | ||
MOVW save-4(SP), R1 | ||
MOVW $err-12(SP), R2 | ||
ok: | ||
MOVM.IA (R2), [R3-R4] | ||
MOVM.IA [R3-R4], (R1) | ||
RET | ||
|
||
//func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err ErrorString) | ||
TEXT ·Syscall(SB),NOSPLIT,$0 | ||
BL runtime·entersyscall(SB) | ||
MOVW trap+0(FP), R0 // syscall num | ||
MOVM.IA.W (R13),[R1-R2] // pop LR and caller's LR | ||
SWI 0 | ||
MOVM.DB.W [R1-R2],(R13) // push LR and caller's LR | ||
MOVW $0, R2 | ||
MOVW $r1+16(FP), R1 | ||
MOVM.IA.W [R0,R2], (R1) | ||
BL sysresult<>(SB) | ||
BL runtime·exitsyscall(SB) | ||
RET | ||
|
||
//func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err ErrorString) | ||
// Actually Syscall5 but the rest of the code expects it to be named Syscall6. | ||
TEXT ·Syscall6(SB),NOSPLIT,$0 | ||
BL runtime·entersyscall(SB) | ||
MOVW trap+0(FP), R0 // syscall num | ||
MOVM.IA.W (R13),[R1-R2] // pop LR and caller's LR | ||
SWI 0 | ||
MOVM.DB.W [R1-R2],(R13) // push LR and caller's LR | ||
MOVW $0, R1 | ||
MOVW $r1+28(FP), R1 | ||
MOVM.IA.W [R0,R2], (R1) | ||
BL sysresult<>(SB) | ||
BL runtime·exitsyscall(SB) | ||
RET | ||
|
||
//func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) | ||
TEXT ·RawSyscall(SB),NOSPLIT,$0 | ||
MOVW trap+0(FP), R0 // syscall num | ||
MOVM.IA.W (R13),[R1] // pop caller's LR | ||
SWI 0 | ||
MOVM.DB.W [R1],(R13) // push caller's LR | ||
MOVW R0, r1+16(FP) | ||
MOVW R0, r2+20(FP) | ||
MOVW R0, err+24(FP) | ||
RET | ||
|
||
//func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) | ||
// Actually RawSyscall5 but the rest of the code expects it to be named RawSyscall6. | ||
TEXT ·RawSyscall6(SB),NOSPLIT,$0 | ||
MOVW trap+0(FP), R0 // syscall num | ||
MOVM.IA.W (R13),[R1] // pop caller's LR | ||
SWI 0 | ||
MOVM.DB.W [R1],(R13) // push caller's LR | ||
MOVW R0, r1+28(FP) | ||
MOVW R0, r2+32(FP) | ||
MOVW R0, err+36(FP) | ||
RET | ||
|
||
//func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string) | ||
TEXT ·seek(SB),NOSPLIT,$0 | ||
MOVW $newoffset_lo+20(FP), R5 | ||
MOVW R5, placeholder+0(FP) //placeholder = dest for return value | ||
MOVW $SYS_SEEK, R0 // syscall num | ||
MOVM.IA.W (R13),[R1] // pop LR | ||
SWI 0 | ||
MOVM.DB.W [R1],(R13) // push LR | ||
CMP $-1, R0 | ||
MOVW.EQ R0, 0(R5) | ||
MOVW.EQ R0, 4(R5) | ||
MOVW $err+28(FP), R1 | ||
BL sysresult<>(SB) | ||
RET | ||
|
||
//func exit(code int) | ||
// Import runtime·exit for cleanly exiting. | ||
TEXT ·exit(SB),NOSPLIT,$4 | ||
MOVW code+0(FP), R0 | ||
MOVW R0, e-4(SP) | ||
BL runtime·exit(SB) | ||
RET |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,294 @@ | ||
// mksyscall.pl -l32 -plan9 syscall_plan9.go | ||
// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT | ||
|
||
// +build arm,plan9 | ||
|
||
package syscall | ||
|
||
import "unsafe" | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func fd2path(fd int, buf []byte) (err error) { | ||
var _p0 unsafe.Pointer | ||
if len(buf) > 0 { | ||
_p0 = unsafe.Pointer(&buf[0]) | ||
} else { | ||
_p0 = unsafe.Pointer(&_zero) | ||
} | ||
r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func pipe(p *[2]int32) (err error) { | ||
r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func await(s []byte) (n int, err error) { | ||
var _p0 unsafe.Pointer | ||
if len(s) > 0 { | ||
_p0 = unsafe.Pointer(&s[0]) | ||
} else { | ||
_p0 = unsafe.Pointer(&_zero) | ||
} | ||
r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) | ||
n = int(r0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func open(path string, mode int) (fd int, err error) { | ||
var _p0 *byte | ||
_p0, err = BytePtrFromString(path) | ||
if err != nil { | ||
return | ||
} | ||
r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) | ||
use(unsafe.Pointer(_p0)) | ||
fd = int(r0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func create(path string, mode int, perm uint32) (fd int, err error) { | ||
var _p0 *byte | ||
_p0, err = BytePtrFromString(path) | ||
if err != nil { | ||
return | ||
} | ||
r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) | ||
use(unsafe.Pointer(_p0)) | ||
fd = int(r0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func remove(path string) (err error) { | ||
var _p0 *byte | ||
_p0, err = BytePtrFromString(path) | ||
if err != nil { | ||
return | ||
} | ||
r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) | ||
use(unsafe.Pointer(_p0)) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func stat(path string, edir []byte) (n int, err error) { | ||
var _p0 *byte | ||
_p0, err = BytePtrFromString(path) | ||
if err != nil { | ||
return | ||
} | ||
var _p1 unsafe.Pointer | ||
if len(edir) > 0 { | ||
_p1 = unsafe.Pointer(&edir[0]) | ||
} else { | ||
_p1 = unsafe.Pointer(&_zero) | ||
} | ||
r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) | ||
use(unsafe.Pointer(_p0)) | ||
n = int(r0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func bind(name string, old string, flag int) (err error) { | ||
var _p0 *byte | ||
_p0, err = BytePtrFromString(name) | ||
if err != nil { | ||
return | ||
} | ||
var _p1 *byte | ||
_p1, err = BytePtrFromString(old) | ||
if err != nil { | ||
return | ||
} | ||
r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) | ||
use(unsafe.Pointer(_p0)) | ||
use(unsafe.Pointer(_p1)) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func mount(fd int, afd int, old string, flag int, aname string) (err error) { | ||
var _p0 *byte | ||
_p0, err = BytePtrFromString(old) | ||
if err != nil { | ||
return | ||
} | ||
var _p1 *byte | ||
_p1, err = BytePtrFromString(aname) | ||
if err != nil { | ||
return | ||
} | ||
r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) | ||
use(unsafe.Pointer(_p0)) | ||
use(unsafe.Pointer(_p1)) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func wstat(path string, edir []byte) (err error) { | ||
var _p0 *byte | ||
_p0, err = BytePtrFromString(path) | ||
if err != nil { | ||
return | ||
} | ||
var _p1 unsafe.Pointer | ||
if len(edir) > 0 { | ||
_p1 = unsafe.Pointer(&edir[0]) | ||
} else { | ||
_p1 = unsafe.Pointer(&_zero) | ||
} | ||
r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) | ||
use(unsafe.Pointer(_p0)) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func chdir(path string) (err error) { | ||
var _p0 *byte | ||
_p0, err = BytePtrFromString(path) | ||
if err != nil { | ||
return | ||
} | ||
r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) | ||
use(unsafe.Pointer(_p0)) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func Dup(oldfd int, newfd int) (fd int, err error) { | ||
r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) | ||
fd = int(r0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func Pread(fd int, p []byte, offset int64) (n int, err error) { | ||
var _p0 unsafe.Pointer | ||
if len(p) > 0 { | ||
_p0 = unsafe.Pointer(&p[0]) | ||
} else { | ||
_p0 = unsafe.Pointer(&_zero) | ||
} | ||
r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) | ||
n = int(r0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func Pwrite(fd int, p []byte, offset int64) (n int, err error) { | ||
var _p0 unsafe.Pointer | ||
if len(p) > 0 { | ||
_p0 = unsafe.Pointer(&p[0]) | ||
} else { | ||
_p0 = unsafe.Pointer(&_zero) | ||
} | ||
r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) | ||
n = int(r0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func Close(fd int) (err error) { | ||
r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func Fstat(fd int, edir []byte) (n int, err error) { | ||
var _p0 unsafe.Pointer | ||
if len(edir) > 0 { | ||
_p0 = unsafe.Pointer(&edir[0]) | ||
} else { | ||
_p0 = unsafe.Pointer(&_zero) | ||
} | ||
r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) | ||
n = int(r0) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
func Fwstat(fd int, edir []byte) (err error) { | ||
var _p0 unsafe.Pointer | ||
if len(edir) > 0 { | ||
_p0 = unsafe.Pointer(&edir[0]) | ||
} else { | ||
_p0 = unsafe.Pointer(&_zero) | ||
} | ||
r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) | ||
if int32(r0) == -1 { | ||
err = e1 | ||
} | ||
return | ||
} |