From 66b240c7a45f438538797b15457c47102e9819d6 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Thu, 26 Jun 2008 15:26:27 -0700 Subject: [PATCH] make readfile work on darwin parameterize the system interface a bit SVN=124981 --- src/runtime/Makefile | 6 ++++- src/runtime/amd64_darwin.h | 43 ++++++++++++++++++++++++++++++++++ src/runtime/amd64_linux.h | 40 +++++++++++++++++++++++++++++++ src/runtime/rt0_amd64_darwin.s | 9 +++---- src/runtime/sys_file.c | 34 +-------------------------- src/runtime/sys_structs.h | 13 ++++++++++ 6 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 src/runtime/amd64_darwin.h create mode 100644 src/runtime/amd64_linux.h create mode 100644 src/runtime/sys_structs.h diff --git a/src/runtime/Makefile b/src/runtime/Makefile index cc1e8c2ea4..d555132f46 100644 --- a/src/runtime/Makefile +++ b/src/runtime/Makefile @@ -19,7 +19,8 @@ LIBOFILES=\ sys_file.$O\ OFILES=$(RT0OFILES) $(LIBOFILES) -HFILES=runtime.h +OS_H=$(GOARCH)_$(GOOS).h +HFILES=runtime.h $(OS_H_) install: rt0 $(LIB) cp $(RT0OFILES) $(GOROOT)/lib @@ -38,5 +39,8 @@ clean: %.$O: %.c $(CC) $< +sys_file.$O: sys_file.c $(OS_H) + $(CC) -D$(GOARCH)_$(GOOS) $< + %.$O: %.s $(AS) $< diff --git a/src/runtime/amd64_darwin.h b/src/runtime/amd64_darwin.h new file mode 100644 index 0000000000..4bb906bd2d --- /dev/null +++ b/src/runtime/amd64_darwin.h @@ -0,0 +1,43 @@ +// 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. + +/* + * System structs for Darwin, amd64 + */ + +typedef uint32 dev_t; +typedef uint64 ino_t; +typedef uint16 mode_t; +typedef uint16 nlink_t; +typedef uint32 uid_t; +typedef uint32 gid_t; +typedef int64 off_t; +typedef int32 blksize_t; +typedef int64 blkcnt_t; +typedef int64 time_t; + +struct timespec { + time_t tv_sec; + int64 tv_nsec; +}; + +struct stat { // really a stat64 + dev_t st_dev; + mode_t st_mode; + nlink_t st_nlink; + ino_t st_ino; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + struct timespec st_atimespec; + struct timespec st_mtimespec; + struct timespec st_ctimespec; + struct timespec st_birthtimespec; + off_t st_size; + blkcnt_t st_blocks; + blksize_t st_blksize; + uint32 st_flags; + uint32 st_gen; + int64 st_qspare[2]; +}; diff --git a/src/runtime/amd64_linux.h b/src/runtime/amd64_linux.h new file mode 100644 index 0000000000..afabf6a15e --- /dev/null +++ b/src/runtime/amd64_linux.h @@ -0,0 +1,40 @@ +// 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. + +/* + * System structs for Darwin, amd64 + */ + +typedef uint64 dev_t; +typedef uint64 ino_t; +typedef uint32 mode_t; +typedef uint64 nlink_t; +typedef uint32 uid_t; +typedef uint32 gid_t; +typedef int64 off_t; +typedef int64 blksize_t; +typedef int64 blkcnt_t; +typedef int64 time_t; + +struct timespec { + time_t tv_sec; + int64 tv_nsec; +}; + +struct stat { + dev_t st_dev; /* ID of device containing file */ + ino_t st_ino; /* inode number */ + mode_t st_mode; /* protection */ + nlink_t st_nlink; /* number of hard links */ + uid_t st_uid; /* user ID of owner */ + gid_t st_gid; /* group ID of owner */ + dev_t st_rdev; + dev_t st_rdev; /* device ID (if special file) */ + struct timespec st_atime; /* time of last access */ + struct timespec st_mtime; /* time of last modification */ + struct timespec st_ctime; /* time of last status change */ + off_t st_size; /* total size, in bytes */ + blkcnt_t st_blocks; /* number of blocks allocated */ + blksize_t st_blksize; /* blocksize for filesystem I/O */ +}; diff --git a/src/runtime/rt0_amd64_darwin.s b/src/runtime/rt0_amd64_darwin.s index ad2e70843b..fda8ce7d70 100644 --- a/src/runtime/rt0_amd64_darwin.s +++ b/src/runtime/rt0_amd64_darwin.s @@ -60,20 +60,21 @@ TEXT sys·write(SB),1,$-8 TEXT open(SB),1,$-8 MOVQ 8(SP), DI MOVL 16(SP), SI - MOVL $5, AX // syscall entry + MOVQ $0, R10 + MOVL $(0x2000000+5), AX // syscall entry SYSCALL RET TEXT close(SB),1,$-8 MOVL 8(SP), DI - MOVL $6, AX // syscall entry + MOVL $(0x2000000+6), AX // syscall entry SYSCALL RET TEXT fstat(SB),1,$-8 MOVL 8(SP), DI MOVQ 16(SP), SI - MOVL $189, AX // syscall entry + MOVL $(0x2000000+339), AX // syscall entry; really fstat64 SYSCALL RET @@ -81,7 +82,7 @@ TEXT read(SB),1,$-8 MOVL 8(SP), DI MOVQ 16(SP), SI MOVL 24(SP), DX - MOVL $3, AX // syscall entry + MOVL $(0x2000000+3), AX // syscall entry SYSCALL RET diff --git a/src/runtime/sys_file.c b/src/runtime/sys_file.c index 80dec3da80..c4994947d8 100644 --- a/src/runtime/sys_file.c +++ b/src/runtime/sys_file.c @@ -3,39 +3,7 @@ // license that can be found in the LICENSE file. #include "runtime.h" - -typedef uint64 dev_t; -typedef uint64 ino_t; -typedef uint32 mode_t; -typedef uint64 nlink_t; -typedef uint32 uid_t; -typedef uint32 gid_t; -typedef int64 off_t; -typedef int64 blksize_t; -typedef int64 blkcnt_t; -typedef int64 time_t; - -struct timespec { - time_t tv_sec; - int64 tv_nsec; -}; - -struct stat { - dev_t st_dev; /* ID of device containing file */ - ino_t st_ino; /* inode number */ - nlink_t st_nlink; /* number of hard links */ - mode_t st_mode; /* protection */ - uid_t st_uid; /* user ID of owner */ - gid_t st_gid; /* group ID of owner */ - int32 pad0; - dev_t st_rdev; /* device ID (if special file) */ - off_t st_size; /* total size, in bytes */ - blksize_t st_blksize; /* blocksize for filesystem I/O */ - blkcnt_t st_blocks; /* number of blocks allocated */ - struct timespec st_atime; /* time of last access */ - struct timespec st_mtime; /* time of last modification */ - struct timespec st_ctime; /* time of last status change */ -}; +#include "sys_structs.h" void sys·readfile(string filein, string fileout, bool okout) diff --git a/src/runtime/sys_structs.h b/src/runtime/sys_structs.h new file mode 100644 index 0000000000..117fae2af1 --- /dev/null +++ b/src/runtime/sys_structs.h @@ -0,0 +1,13 @@ +// 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. + +#ifdef amd64_linux + #include "amd64_linux.h" +#else + #ifdef amd64_darwin + #include "amd64_darwin.h" + #endif +#else + You_need_to_write_the_syscall_header +#endif -- 2.48.1