PERFORCE change 122686 for review
Peter Wemm
peter at FreeBSD.org
Mon Jul 2 01:21:39 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=122686
Change 122686 by peter at peter_overcee on 2007/07/02 01:21:30
PSEUDO() was missing the errno handling. Ooops. For example,
gen/getlogin.c was calling _getlogin(), and examining errno.
i386/amd64 PSEUDO(getlogin) macros didn't set errno. This was
copied to some other platforms.
The real difference between SYSCALL, RSYSCALL and PSEUDO is that
SYSCALL is a basic syscall (not used on i386/amd64), RSYSCALL is
SYSCALL with a 'ret' after it. SYSCALL/SYSCALL define __sys_sc
(where "sc" == name), with _sc and sc as weak aliases.
PSEUDO is like RSYSCALL, except with just __sys_sc and _sc.
Affected files ...
.. //depot/projects/hammer/lib/libc/amd64/SYS.h#8 edit
.. //depot/projects/hammer/lib/libc/i386/SYS.h#4 edit
Differences ...
==== //depot/projects/hammer/lib/libc/amd64/SYS.h#8 (text+ko) ====
@@ -44,6 +44,12 @@
.set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
mov __CONCAT($SYS_,x),%rax; KERNCALL; jb 2f; ret; \
2: movq PIC_GOT(HIDENAME(cerror)),%rcx; jmp *%rcx
+
+#define PSEUDO(x) ENTRY(__CONCAT(__sys_,x)); \
+ .weak CNAME(__CONCAT(_,x)); \
+ .set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
+ mov __CONCAT($SYS_,x),%rax; KERNCALL; jb 2f; ret ; \
+ 2: movq PIC_GOT(HIDENAME(cerror)),%rcx; jmp *%rcx
#else
#define RSYSCALL(x) ENTRY(__CONCAT(__sys_,x)); \
.weak CNAME(x); \
@@ -52,11 +58,12 @@
.set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
mov __CONCAT($SYS_,x),%rax; KERNCALL; jb 2f; ret; \
2: jmp HIDENAME(cerror)
-#endif
#define PSEUDO(x) ENTRY(__CONCAT(__sys_,x)); \
.weak CNAME(__CONCAT(_,x)); \
.set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
- mov __CONCAT($SYS_,x),%rax; KERNCALL; ret
+ mov __CONCAT($SYS_,x),%rax; KERNCALL; jb 2f; ret; \
+ 2: jmp HIDENAME(cerror)
+#endif
#define KERNCALL movq %rcx, %r10; syscall
==== //depot/projects/hammer/lib/libc/i386/SYS.h#4 (text+ko) ====
@@ -36,20 +36,19 @@
#include <sys/syscall.h>
#include <machine/asm.h>
-#define SYSCALL(x) 2: PIC_PROLOGUE; jmp PIC_PLT(HIDENAME(cerror)); \
+#define RSYSCALL(x) 2: PIC_PROLOGUE; jmp PIC_PLT(HIDENAME(cerror)); \
ENTRY(__CONCAT(__sys_,x)); \
.weak CNAME(x); \
.set CNAME(x),CNAME(__CONCAT(__sys_,x)); \
.weak CNAME(__CONCAT(_,x)); \
.set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
- mov __CONCAT($SYS_,x),%eax; KERNCALL; jb 2b
+ mov __CONCAT($SYS_,x),%eax; KERNCALL; jb 2b; ret
-#define RSYSCALL(x) SYSCALL(x); ret
-
-#define PSEUDO(x) ENTRY(__CONCAT(__sys_,x)); \
+#define PSEUDO(x) 2: PIC_PROLOGUE; jmp mp PIC_PLT(HIDENAME(cerror)); \
+ ENTRY(__CONCAT(__sys_,x)); \
.weak CNAME(__CONCAT(_,x)); \
.set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
- mov __CONCAT($SYS_,x),%eax; KERNCALL; ret
+ mov __CONCAT($SYS_,x),%eax; KERNCALL; jb 2b; ret
/* gas messes up offset -- although we don't currently need it, do for BCS */
#define LCALL(x,y) .byte 0x9a ; .long y; .word x
More information about the p4-projects
mailing list