]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: new files for plan_arm support
authorRichard Miller <miller.research@gmail.com>
Wed, 27 Jan 2016 16:36:31 +0000 (16:36 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 26 Feb 2016 20:03:16 +0000 (20:03 +0000)
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>

src/syscall/asm_plan9_arm.s [new file with mode: 0644]
src/syscall/zsyscall_plan9_arm.go [new file with mode: 0644]

diff --git a/src/syscall/asm_plan9_arm.s b/src/syscall/asm_plan9_arm.s
new file mode 100644 (file)
index 0000000..dd05844
--- /dev/null
@@ -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
diff --git a/src/syscall/zsyscall_plan9_arm.go b/src/syscall/zsyscall_plan9_arm.go
new file mode 100644 (file)
index 0000000..d54aeff
--- /dev/null
@@ -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
+}