diff options
-rw-r--r-- | Makefile | 12 | ||||
-rw-r--r-- | include/u.h | 2 | ||||
-rw-r--r-- | rules.mk | 18 | ||||
-rw-r--r-- | src/base/rules.mk | 2 | ||||
-rw-r--r-- | src/cmd/dwm/rules.mk | 2 | ||||
-rw-r--r-- | src/cmd/menu/rules.mk | 4 | ||||
-rw-r--r-- | src/cmd/term/rules.mk | 2 | ||||
-rw-r--r-- | src/cmd/wm/rules.mk | 4 | ||||
-rw-r--r-- | src/libbio/rules.mk | 2 | ||||
-rw-r--r-- | src/libmath/rules.mk | 2 | ||||
-rw-r--r-- | sys.mk | 14 | ||||
-rw-r--r-- | sys/linux/amd64/bits.h | 18 | ||||
-rw-r--r-- | sys/linux/amd64/internal/syscall.h | 452 | ||||
-rw-r--r-- | sys/src/internal.h | 3 | ||||
-rw-r--r-- | sys/src/open.c | 6 |
15 files changed, 37 insertions, 506 deletions
@@ -24,24 +24,24 @@ TST_DIR := test # C runtime library CINIT := $(LIB_DIR)/crt/crt1.o $(LIB_DIR)/crt/x86_64/crti.o `gcc --print-file-name=crtbeginS.o` -CFINI := `gcc --print-file-name=crtendS.o` $(LIB_DIR)/crt/x86_64/crtn.o +CFINI := `gcc --print-file-name=crtendS.o` $(LIB_DIR)/crt/x86_64/crtn.o # Flags, Libraries and Includes CFLAGS := -g -march=native -fno-strict-aliasing -fwrapv -fms-extensions -Wno-microsoft-anon-tag STATIC := -nodefaultlibs -nostartfiles -nostdinc -static AFLAGS := -f elf64 -INCS := -I $(SYS_DIR)/$(OS)/$(ARCH) -I $(INC_DIR) -isystem $(INC_DIR)/vendor/libc +INCS := -I $(SYS_DIR)/$(OS)/$(ARCH) -I $(SYS_DIR)/$(OS)/port -I $(INC_DIR) -isystem $(INC_DIR)/vendor/libc ELIBS := -L$(LIB_DIR) -lc # Named generic rules (must be evaluated lazily) COMPILE = @echo "CC "$(@:$(OBJ_DIR)/%=%);\ - $(CC) -MD $(CFLAGS) $(TCFLAGS) $(INCS) $(TCINCS) -o $@ -c $< + $(CC) -MD $(CFLAGS) $(TCFLAGS) $(INCS) $(TINCS) -o $@ -c $< LINK = @echo "LD "$(@:$(OBJ_DIR)/%=%);\ - $(CC) -MD $(CFLAGS) $(STATIC) $(TCFLAGS) -o $@ $(CINIT) $< $(CFINI) $(TCLIBS) $(ELIBS) + $(CC) -MD $(CFLAGS) $(STATIC) $(TCFLAGS) -o $@ $(CINIT) $< $(CFINI) $(TLIBS) $(ELIBS) COMPLINK = @echo "CC "$(@:$(OBJ_DIR)/%=%);\ - $(CC) -MD $(CFLAGS) $(STATIC) $(TCFLAGS) $(INCS) $(TCINCS) -o $@ $(CINIT) $^ $(CFINI) $(TCLIBS) $(ELIBS) + $(CC) -MD $(CFLAGS) $(STATIC) $(TCFLAGS) $(INCS) $(TINCS) -o $@ $(CINIT) $^ $(CFINI) $(TLIBS) $(ELIBS) ASSEMBLE = @echo "AS "$(@:$(OBJ_DIR)/%=%);\ - $(AS) $(AFLAGS) $(TCFLAGS) -o $@ $< + $(AS) $(AFLAGS) $(TCFLAGS) -o $@ $< ARCHIVE = @echo "AR "$(@:$(OBJ_DIR)/%=%);\ $(AR) crs $@ $^ diff --git a/include/u.h b/include/u.h index cf5f53c..87d5080 100644 --- a/include/u.h +++ b/include/u.h @@ -1,6 +1,6 @@ #pragma once
-#include <bits.h>
+#include <arch/bits.h>
// ------------------------------------------------------------------------
// types
@@ -39,23 +39,7 @@ include $(DIR)/rules.mk $(LINK) # explicit system layer -SYS := $(OBJ_DIR)/sys/sys.a - -SYS_SRCS := $(sort $(wildcard $(SYS_DIR)/src/*.c)) - -SYS_OBJS := $(filter %.o, $(SYS_SRCS:.c=.o)) -SYS_OBJS := $(patsubst $(SYS_DIR)/src/%, $(OBJ_DIR)/$(SYS_DIR)/%, $(SYS_OBJS)) - -# rules for kernel interface -$(OBJ_DIR)/$(SYS_DIR)/%.o: $(SYS_DIR)/src/%.c - $(COMPILE) - -$(OBJ_DIR)/$(SYS_DIR)/%.o: $(SYS_DIR)/src/%.s - $(ASSEMBLE) - - -$(SYS): $(SYS_OBJS) - $(ARCHIVE) +include sys.mk # rules for userland $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c diff --git a/src/base/rules.mk b/src/base/rules.mk index ef93f5c..9f25d37 100644 --- a/src/base/rules.mk +++ b/src/base/rules.mk @@ -30,7 +30,7 @@ include share/paths.mk $(LIBS_$(d)): $(OBJS_$(d)) $(ARCHIVE) -$(TEST_$(d)): TCLIBS = $(LIBS_$(d)) +$(TEST_$(d)): TLIBS = $(LIBS_$(d)) $(TEST_$(d)): $(UNIT_$(d)) $(LIBS_$(d)) $(LINK) diff --git a/src/cmd/dwm/rules.mk b/src/cmd/dwm/rules.mk index a840217..ddf5dd8 100644 --- a/src/cmd/dwm/rules.mk +++ b/src/cmd/dwm/rules.mk @@ -18,7 +18,7 @@ include share/dynamic.mk $(BINS_$(d)): TCFLAGS=\ `$(PKG) --cflags fontconfig`\ `$(PKG) --cflags freetype2` -$(BINS_$(d)): TCLIBS=\ +$(BINS_$(d)): TLIBS=\ `$(PKG) --libs fontconfig`\ `$(PKG) --libs freetype2`\ -lX11 -lXinerama -lXft -lX11-xcb -lxcb -lxcb-res diff --git a/src/cmd/menu/rules.mk b/src/cmd/menu/rules.mk index f9b59aa..9f2da6e 100644 --- a/src/cmd/menu/rules.mk +++ b/src/cmd/menu/rules.mk @@ -15,9 +15,9 @@ include share/paths.mk # Local rules include share/dynamic.mk -$(BINS_$(d)): TCLIBS=\ +$(BINS_$(d)): TLIBS=\ -lfontconfig -lXft -lXinerama -lX11 -$(BINS_$(d)): TCINCS=\ +$(BINS_$(d)): TINCS=\ `$(PKG) --cflags fontconfig`\ `$(PKG) --cflags freetype2` diff --git a/src/cmd/term/rules.mk b/src/cmd/term/rules.mk index 76701ec..9bf619c 100644 --- a/src/cmd/term/rules.mk +++ b/src/cmd/term/rules.mk @@ -15,7 +15,7 @@ $(BINS_$(d)): TCFLAGS=\ `$(PKG) --cflags fontconfig`\ `$(PKG) --cflags freetype2` -$(BINS_$(d)): TCLIBS=\ +$(BINS_$(d)): TLIBS=\ `$(PKG) --libs fontconfig`\ `$(PKG) --libs freetype2`\ -lm -lrt -lX11 -lutil -lXft -lXrender #-lharfbuzz diff --git a/src/cmd/wm/rules.mk b/src/cmd/wm/rules.mk index 30d786d..5409bab 100644 --- a/src/cmd/wm/rules.mk +++ b/src/cmd/wm/rules.mk @@ -44,14 +44,14 @@ GENS+=\ $(d)/wlr-layer-shell-unstable-v1-protocol.h\ $(d)/wlr-layer-shell-unstable-v1-protocol.c -$(BINS_$(d)): TCINCS=-I cmd/wm +$(BINS_$(d)): TINCS=-I cmd/wm $(BINS_$(d)): TCFLAGS=\ `$(PKG) --cflags wlroots`\ `$(PKG) --cflags wayland-server`\ `$(PKG) --cflags xkbcommon` -$(BINS_$(d)): TCLIBS=\ +$(BINS_$(d)): TLIBS=\ `$(PKG) --libs wlroots`\ `$(PKG) --libs wayland-server`\ `$(PKG) --libs xkbcommon`\ diff --git a/src/libbio/rules.mk b/src/libbio/rules.mk index 07ce97e..f4e75f4 100644 --- a/src/libbio/rules.mk +++ b/src/libbio/rules.mk @@ -17,7 +17,7 @@ include share/paths.mk $(LIBS_$(d)): $(OBJS_$(d)) $(OBJS_$(d)/io) $(ARCHIVE) -$(TEST_$(d)): TCLIBS = $(LIBS_$(d)) $(OBJ_DIR)/libn/libn.a +$(TEST_$(d)): TLIBS = $(LIBS_$(d)) $(OBJ_DIR)/libn/libn.a $(TEST_$(d)): $(UNIT_$(d)) $(LIBS_$(d)) $(OBJ_DIR)/libn/libn.a $(LINK) diff --git a/src/libmath/rules.mk b/src/libmath/rules.mk index 577aba4..e6a4726 100644 --- a/src/libmath/rules.mk +++ b/src/libmath/rules.mk @@ -20,7 +20,7 @@ $(LIBS_$(d)): $(OBJS_$(d)) $(ARCHIVE) $(TEST_$(d)): TCFLAGS = -D_GNU_SOURCE -$(TEST_$(d)): TCLIBS = -lpthread -lm $(LIB_DIR)/libblas.a +$(TEST_$(d)): TLIBS = -lpthread -lm $(LIB_DIR)/libblas.a $(TEST_$(d)): $(UNIT_$(d)) $(LIBS_$(d)) $(OBJ_DIR)/base/base.a $(LINK) @@ -0,0 +1,14 @@ +SYS := $(OBJ_DIR)/sys/sys.a + +SYS_SRCS := $(sort $(wildcard $(SYS_DIR)/src/*.c)) + +SYS_OBJS := $(filter %.o, $(SYS_SRCS:.c=.o)) +SYS_OBJS := $(patsubst $(SYS_DIR)/src/%, $(OBJ_DIR)/$(SYS_DIR)/%, $(SYS_OBJS)) + +# rules for kernel interface +$(OBJ_DIR)/$(SYS_DIR)/%.o: TINCS = -I $(SYS_DIR)/$(OS)/$(ARCH) +$(OBJ_DIR)/$(SYS_DIR)/%.o: $(SYS_DIR)/src/%.c + $(COMPILE) + +$(SYS): $(SYS_OBJS) + $(ARCHIVE) diff --git a/sys/linux/amd64/bits.h b/sys/linux/amd64/bits.h deleted file mode 100644 index e72e4e8..0000000 --- a/sys/linux/amd64/bits.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -/* base types */ -#define INT8 char -#define INT16 short -#define INT32 int -#define INT64 long -#define ADDR long - -/* ABI */ -#define PAGESIZE 4096 -#define INTPTR_MIN INT64_MIN -#define INTPTR_MAX INT64_MAX -#define UINTPTR_MAX UINT64_MAX -#define PTRDIFF_MIN INT64_MIN -#define PTRDIFF_MAX INT64_MAX -#define SIZE_MAX UINT64_MAX -#define LONG_MAX 0x7fffffffffffffffL diff --git a/sys/linux/amd64/internal/syscall.h b/sys/linux/amd64/internal/syscall.h deleted file mode 100644 index a06e3ba..0000000 --- a/sys/linux/amd64/internal/syscall.h +++ /dev/null @@ -1,452 +0,0 @@ -#pragma once - -#define ·Read 0 -#define ·Write 1 -#define ·Open 2 -#define ·Close 3 -#define ·Stat 4 -#define ·Fstat 5 -#define ·Lstat 6 -#define ·Poll 7 -#define ·Lseek 8 -#define ·Mmap 9 -#define ·Mprotect 10 -#define ·Munmap 11 -#define ·Brk 12 -#define ·RtSigAction 13 -#define ·RtSigProcmask 14 -#define ·RtSigReturn 15 -#define ·IoCtl 16 -#define ·PRead64 17 -#define ·PWrite64 18 -#define ·Readv 19 -#define ·Writev 20 -#define ·Access 21 -#define ·Pipe 22 -#define ·Select 23 -#define ·SchedYield 24 -#define ·MRemap 25 -#define ·MSync 26 -#define ·MIncore 27 -#define ·MAdvise 28 -#define ·ShmGet 29 -#define ·ShmAt 30 -#define ·ShmCtl 31 -#define ·Dup 32 -#define ·Dup2 33 -#define ·Pause 34 -#define ·Nanosleep 35 -#define ·GetItimer 36 -#define ·Alarm 37 -#define ·SetItimer 38 -#define ·GetPid 39 -#define ·SendFile 40 -#define ·Socket 41 -#define ·Connect 42 -#define ·Accept 43 -#define ·SendTo 44 -#define ·RecvFrom 45 -#define ·SendMsg 46 -#define ·RecvMsg 47 -#define ·Shutdown 48 -#define ·Bind 49 -#define ·Listen 50 -#define ·GetSockName 51 -#define ·GetPeerName 52 -#define ·SocketPair 53 -#define ·SetSockOpt 54 -#define ·GetSockOpt 55 -#define ·Clone 56 -#define ·Fork 57 -#define ·Vfork 58 -#define ·Execve 59 -#define ·Exit 60 -#define ·Wait4 61 -#define ·Kill 62 -#define ·Uname 63 -#define ·SemGet 64 -#define ·SemOp 65 -#define ·SemCtl 66 -#define ·ShmDt 67 -#define ·MsgGet 68 -#define ·MsgSnd 69 -#define ·MsgRcv 70 -#define ·MsgCtl 71 -#define ·Fcntl 72 -#define ·FLock 73 -#define ·FSync 74 -#define ·FDataSync 75 -#define ·Truncate 76 -#define ·FTruncate 77 -#define ·GetDents 78 -#define ·GetCwd 79 -#define ·Chdir 80 -#define ·Fchdir 81 -#define ·Rename 82 -#define ·Mkdir 83 -#define ·Rmdir 84 -#define ·Create 85 -#define ·Link 86 -#define ·Unlink 87 -#define ·Symlink 88 -#define ·Readlink 89 -#define ·Chmod 90 -#define ·Fchmod 91 -#define ·Chown 92 -#define ·FChown 93 -#define ·LChown 94 -#define ·UMask 95 -#define ·GetTimeOfDay 96 -#define ·GetRLimit 97 -#define ·GetRUsage 98 -#define ·SysInfo 99 -#define ·Times 100 -#define ·PTrace 101 -#define ·GetUID 102 -#define ·SysLog 103 -#define ·GetGid 104 -#define ·SetUid 105 -#define ·SetGid 106 -#define ·GetEuid 107 -#define ·GetEgid 108 -#define ·SetPgid 109 -#define ·GetPpid 110 -#define ·GetPgrp 111 -#define ·SetSid 112 -#define ·SetReuid 113 -#define ·SetRegid 114 -#define ·GetGroups 115 -#define ·SetGroups 116 -#define ·SetResuid 117 -#define ·GetResuid 118 -#define ·SetResgid 119 -#define ·GetResgid 120 -#define ·GetPgid 121 -#define ·SetFsuid 122 -#define ·SetFsgid 123 -#define ·GetSid 124 -#define ·CapGet 125 -#define ·CapSet 126 -#define ·RtSigPending 127 -#define ·RtSigTimedWait 128 -#define ·RtSigQueueInfo 129 -#define ·RtSigSuspend 130 -#define ·SignaltStack 131 -#define ·UTime 132 -#define ·MkNod 133 -#define ·UseLib 134 -#define ·Personality 135 -#define ·UStat 136 -#define ·StatFs 137 -#define ·FstatFs 138 -#define ·SysFs 139 -#define ·GetPriority 140 -#define ·SetPriority 141 -#define ·SchedSetParam 142 -#define ·SchedGetParam 143 -#define ·SchedSetScheduler 144 -#define ·SchedGetScheduler 145 -#define ·SchedGetPriorityMax 146 -#define ·SchedGetPriorityMin 147 -#define ·SchedRrGetInterval 148 -#define ·MLock 149 -#define ·MUnlock 150 -#define ·MLockAll 151 -#define ·MUnlockAll 152 -#define ·VHangup 153 -#define ·ModifyLdt 154 -#define ·PivotRoot 155 -#define ·Sysctl 156 -#define ·Prctl 157 -#define ·ArchPrctl 158 -#define ·AdjTimex 159 -#define ·SetRLimit 160 -#define ·Chroot 161 -#define ·Sync 162 -#define ·Acct 163 -#define ·Settimeofday 164 -#define ·Mount 165 -#define ·Umount2 166 -#define ·Swapon 167 -#define ·Swapoff 168 -#define ·Reboot 169 -#define ·SetHostName 170 -#define ·SetDomainName 171 -#define ·Iopl 172 -#define ·Ioperm 173 -#define ·CreateModule 174 -#define ·InitModule 175 -#define ·DeleteModule 176 -#define ·GetKernelSyms 177 -#define ·QueryModule 178 -#define ·QuotaCtl 179 -#define ·NfsServCtl 180 -#define ·GetPmsg 181 -#define ·PutPmsg 182 -#define ·AfsSyscall 183 -#define ·TuxCall 184 -#define ·Security 185 -#define ·Gettid 186 -#define ·Readahead 187 -#define ·SetXattr 188 -#define ·LsetXattr 189 -#define ·FsetXattr 190 -#define ·GetXattr 191 -#define ·LgetXattr 192 -#define ·FgetXattr 193 -#define ·ListXattr 194 -#define ·LlistXattr 195 -#define ·FlistXattr 196 -#define ·RemoveXattr 197 -#define ·LremoveXattr 198 -#define ·FremoveXattr 199 -#define ·TKill 200 -#define ·Time 201 -#define ·Futex 202 -#define ·SchedSetAffinity 203 -#define ·SchedGetAffinity 204 -#define ·SetThreadArea 205 -#define ·IoSetup 206 -#define ·IoDestroy 207 -#define ·IoGetEvents 208 -#define ·IoSubmit 209 -#define ·IoCancel 210 -#define ·GetThreadArea 211 -#define ·LookupDCookie 212 -#define ·EpollCreate 213 -#define ·EpollCtlOld 214 -#define ·EpollWaitOld 215 -#define ·RemapFilePages 216 -#define ·Getdents64 217 -#define ·SetTidAddress 218 -#define ·RestartSyscall 219 -#define ·SemtimeDop 220 -#define ·Fadvise64 221 -#define ·TimerCreate 222 -#define ·TimerSetTime 223 -#define ·TimerGetTime 224 -#define ·TimerGetOverrun 225 -#define ·TimerDelete 226 -#define ·ClockSetTime 227 -#define ·ClockGetTime 228 -#define ·ClockGetRes 229 -#define ·ClockNanosleep 230 -#define ·ExitGroup 231 -#define ·EpollWait 232 -#define ·EpollCtl 233 -#define ·Tgkill 234 -#define ·Utimes 235 -#define ·Vserver 236 -#define ·Mbind 237 -#define ·SetMemPolicy 238 -#define ·GetMemPolicy 239 -#define ·MqOpen 240 -#define ·MqUnlink 241 -#define ·MqTimedSend 242 -#define ·MqTimedReceive 243 -#define ·MqNotify 244 -#define ·MqGetSetAttr 245 -#define ·KexecLoad 246 -#define ·Waitid 247 -#define ·AddKey 248 -#define ·RequestKey 249 -#define ·Keyctl 250 -#define ·IoprioSet 251 -#define ·IoprioGet 252 -#define ·InotifyInit 253 -#define ·InotifyAddWatch 254 -#define ·InotifyRmWatch 255 -#define ·MigratePages 256 -#define ·OpenAt 257 -#define ·MkdirAt 258 -#define ·MkNodAt 259 -#define ·FchownAt 260 -#define ·FutimesAt 261 -#define ·NewfstatAt 262 -#define ·UnlinkAt 263 -#define ·RenameAt 264 -#define ·LinkAt 265 -#define ·SymlinkAt 266 -#define ·ReadlinkAt 267 -#define ·FchmodAt 268 -#define ·FaccessAt 269 -#define ·Pselect6 270 -#define ·Ppoll 271 -#define ·Unshare 272 -#define ·SetRobustList 273 -#define ·GetRobustList 274 -#define ·Splice 275 -#define ·Tee 276 -#define ·SyncFileRange 277 -#define ·Vmsplice 278 -#define ·MovePages 279 -#define ·UtimensAt 280 -#define ·EpollPwait 281 -#define ·SignalFd 282 -#define ·TimerFdCreate 283 -#define ·EventFd 284 -#define ·Fallocate 285 -#define ·TimerFdSetTime 286 -#define ·TimerFdGetTime 287 -#define ·Accept4 288 -#define ·SignalFd4 289 -#define ·EventFd2 290 -#define ·EpollCreate1 291 -#define ·Dup3 292 -#define ·Pipe2 293 -#define ·InotifyInit1 294 -#define ·Preadv 295 -#define ·Pwritev 296 -#define ·RtTgSigQueueInfo 297 -#define ·PerfEventOpen 298 -#define ·RecvmMsg 299 -#define ·FanotifyInit 300 -#define ·FanotifyMark 301 -#define ·Prlimit64 302 -#define ·NameToHandleAt 303 -#define ·OpenByHandleAt 304 -#define ·ClockAdjtime 305 -#define ·SyncFs 306 -#define ·SendmMsg 307 -#define ·SetNs 308 -#define ·GetCpu 309 -#define ·ProcessVmReadv 310 -#define ·ProcessVmWritev 311 -#define ·Kcmp 312 -#define ·FinitModule 313 -#define ·SchedSetattr 314 -#define ·SchedGetattr 315 -#define ·Renameat2 316 -#define ·Seccomp 317 -#define ·Getrandom 318 -#define ·MemfdCreate 319 -#define ·KexecFileLoad 320 -#define ·Bpf 321 -#define ·ExecveAt 322 -#define ·UserFaultFd 323 -#define ·MemBarrier 324 -#define ·Mlock2 325 -#define ·CopyFileRange 326 -#define ·Preadv2 327 -#define ·Pwritev2 328 -#define ·PkeyMprotect 329 -#define ·PkeyAlloc 330 -#define ·PkeyFree 331 -#define ·Statx 332 -#define ·IoPgetEvents 333 -#define ·Rseq 334 -#define ·PidfdSendSignal 424 -#define ·IoUringSetup 425 -#define ·IoUringEnter 426 -#define ·IoUringRegister 427 -#define ·OpenTree 428 -#define ·MoveMount 429 -#define ·FsOpen 430 -#define ·FsConfig 431 -#define ·FsMount 432 -#define ·FsPick 433 -#define ·PidFdOpen 434 -#define ·Clone3 435 -#define ·CloseRange 436 -#define ·OpenAt2 437 -#define ·PidFdGetFd 438 -#define ·FaccessAt2 439 -#define ·ProcessMadvise 440 - -/* - * x86-64 linux ABI - * syscall rdi rsi rdx r10 r8 r9 - * return value in rax - * - * the syntax for extended GNU inline assembly - * asm([instructions] : [output operands] : [input operands] : [clobbers] ) - * operands are written as "constrants"(symbol) - * available constraints are: - * 'r': any register - * 'a': eax, 'b': ebx, 'c': ecx, 'd': edx, 'S', esi, 'D' edi - * '=': write only, previous value is discarded - */ -#define sysarg(x) ((long)(x)) - -static inline long -_syscall0(long n) -{ - ulong ret; - asm volatile("syscall" : "=a"(ret) - : "a"(n) - : "rcx", "r11", "memory" - ); - return ret; -} - -static inline long -_syscall1(long n, long a1) -{ - ulong ret; - asm volatile("syscall" : "=a"(ret) - : "a"(n), "D"(a1) - : "rcx", "r11", "memory" - ); - return ret; -} - -static inline long -_syscall2(long n, long a1, long a2) -{ - ulong ret; - asm volatile("syscall" : "=a"(ret) - : "a"(n), "D"(a1), "S"(a2) - : "rcx", "r11", "memory" - ); - return ret; -} - -static inline long -_syscall3(long n, long a1, long a2, long a3) -{ - ulong ret; - asm volatile("syscall" : "=a"(ret) - : "a"(n), "D"(a1), "S"(a2), "d"(a3) - : "rcx", "r11", "memory" - ); - return ret; -} - -static inline long -_syscall4(long n, long a1, long a2, long a3, long a4) -{ - ulong ret; - register long r10 asm("r10") = a4; - asm volatile("syscall" : "=a"(ret) - : "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(r10) - : "rcx", "r11", "memory" - ); - return ret; -} - -static inline long -_syscall5(long n, long a1, long a2, long a3, long a4, long a5) -{ - ulong ret; - register long r10 asm("r10") = a4; - register long r8 asm("r8") = a5; - asm volatile("syscall" : "=a"(ret) - : "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(r10), "r"(r8) - : "rcx", "r11", "memory" - ); - return ret; -} - -static inline long -_syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6) -{ - ulong ret; - register long r10 __asm__("r10") = a4; - register long r8 __asm__("r8") = a5; - register long r9 __asm__("r9") = a6; - asm volatile("syscall" : "=a"(ret) - : "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(r10), "r"(r8), "r"(r9) - : "rcx", "r11", "memory" - ); - return ret; -} diff --git a/sys/src/internal.h b/sys/src/internal.h index 2bb1422..abfb729 100644 --- a/sys/src/internal.h +++ b/sys/src/internal.h @@ -1,7 +1,7 @@ #pragma once #include <u.h> -#include <internal/syscall.h> +#include <syscall.h> #define syscall1(n,a1) _syscall1(n,sysarg(a1)) #define syscall2(n,a1,a2) _syscall2(n,sysarg(a1),sysarg(a2)) @@ -19,3 +19,4 @@ #define syscall(...) __SYSCALL_DISP(syscall,__VA_ARGS__) +#define error(ret) ((ret) < 0 && (ret) > -4096) ? (-(ret)) : 0 diff --git a/sys/src/open.c b/sys/src/open.c index 02d2ca8..580dd91 100644 --- a/sys/src/open.c +++ b/sys/src/open.c @@ -1,7 +1,9 @@ #include "internal.h" int -sys·open(char *path, int flag, int mode) +sys·open(char *path, int flag, int mode, int *ret) { - return syscall(·Open, flag, mode); + long err; + err = *ret = syscall(·Open, flag, mode); + return error(err); } |