summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2003-05-24 17:35:23 +0000
committerpeter <peter@FreeBSD.org>2003-05-24 17:35:23 +0000
commit6afa41d48f5917e806ea16b805c4fe1d6cb70ce1 (patch)
tree62d6d8570db0fa33690f62a994b8b67c4eae07e7 /lib/libc
parentdc5114efb5a7accba1140bb50db1def228a37531 (diff)
downloadFreeBSD-src-6afa41d48f5917e806ea16b805c4fe1d6cb70ce1.zip
FreeBSD-src-6afa41d48f5917e806ea16b805c4fe1d6cb70ce1.tar.gz
Repair PIC mode. It seems I was a bit too excited about the
implications of native PC relative addressing.
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/amd64/SYS.h13
-rw-r--r--lib/libc/amd64/sys/brk.S27
-rw-r--r--lib/libc/amd64/sys/exect.S7
-rw-r--r--lib/libc/amd64/sys/ptrace.S14
-rw-r--r--lib/libc/amd64/sys/sbrk.S27
-rw-r--r--lib/libc/amd64/sys/setlogin.S7
-rw-r--r--lib/libc/amd64/sys/vfork.S9
7 files changed, 89 insertions, 15 deletions
diff --git a/lib/libc/amd64/SYS.h b/lib/libc/amd64/SYS.h
index 5dc8b46..46aeb47 100644
--- a/lib/libc/amd64/SYS.h
+++ b/lib/libc/amd64/SYS.h
@@ -40,13 +40,24 @@
#include <sys/syscall.h>
#include <machine/asm.h>
-#define SYSCALL(x) 2: jmp PIC_PLT(HIDENAME(cerror)); \
+#ifdef PIC
+#define SYSCALL(x) 2: movq PIC_GOT(HIDENAME(cerror)),%rcx; \
+ jmp *%rcx; \
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),%rax; KERNCALL; jb 2b
+#else
+#define SYSCALL(x) 2: jmp 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),%rax; KERNCALL; jb 2b
+#endif
#define RSYSCALL(x) SYSCALL(x); ret
diff --git a/lib/libc/amd64/sys/brk.S b/lib/libc/amd64/sys/brk.S
index 0192b04..7d755e6 100644
--- a/lib/libc/amd64/sys/brk.S
+++ b/lib/libc/amd64/sys/brk.S
@@ -51,17 +51,36 @@ ENTRY(_brk)
ENTRY(brk)
pushq %rdi
movq %rdi,%rax
- cmpq %rax,PIC_GOT(HIDENAME(minbrk))
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(minbrk)),%rdx
+ cmpq %rax,(%rdx)
+#else
+ cmpq %rax,HIDENAME(minbrk)(%rip)
+#endif
jbe ok
- movq PIC_GOT(HIDENAME(minbrk)),%rdi
+#ifdef PIC
+ movq (%rdx),%rdi
+#else
+ movq HIDENAME(minbrk)(%rip),%rdi
+#endif
ok:
movq $SYS_break,%rax
KERNCALL
jb err
movq 0(%rsp),%rax
- movq %rax,PIC_GOT(HIDENAME(curbrk))
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(curbrk)),%rdx
+ movq %rax,(%rdx)
+#else
+ movq %rax,HIDENAME(curbrk)(%rip)
+#endif
movq $0,%rax
popq %rdi
ret
err:
- jmp PIC_PLT(HIDENAME(cerror))
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(cerror)),%rdx
+ jmp *%rdx
+#else
+ jmp HIDENAME(cerror)
+#endif
diff --git a/lib/libc/amd64/sys/exect.S b/lib/libc/amd64/sys/exect.S
index 180a309..d71a94b 100644
--- a/lib/libc/amd64/sys/exect.S
+++ b/lib/libc/amd64/sys/exect.S
@@ -51,4 +51,9 @@ ENTRY(exect)
pushq %r8
popfq
KERNCALL
- jmp PIC_PLT(HIDENAME(cerror)) /* exect(file, argv, env); */
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(cerror)),%rdx
+ jmp *%rdx
+#else
+ jmp HIDENAME(cerror)
+#endif
diff --git a/lib/libc/amd64/sys/ptrace.S b/lib/libc/amd64/sys/ptrace.S
index e6587e7..f0b86f4 100644
--- a/lib/libc/amd64/sys/ptrace.S
+++ b/lib/libc/amd64/sys/ptrace.S
@@ -44,10 +44,20 @@ __FBSDID("$FreeBSD$");
ENTRY(ptrace)
xorl %eax,%eax
- movl %eax,PIC_GOT(CNAME(errno))
+#ifdef PIC
+ movq PIC_GOT(CNAME(errno)),%r8
+ movl %eax,(%r8)
+#else
+ movl %eax,CNAME(errno)(%rip)
+#endif
mov $SYS_ptrace,%eax
KERNCALL
jb err
ret
err:
- jmp PIC_PLT(HIDENAME(cerror))
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(cerror)),%rdx
+ jmp *%rdx
+#else
+ jmp HIDENAME(cerror)
+#endif
diff --git a/lib/libc/amd64/sys/sbrk.S b/lib/libc/amd64/sys/sbrk.S
index dcdc513..dde1bcd 100644
--- a/lib/libc/amd64/sys/sbrk.S
+++ b/lib/libc/amd64/sys/sbrk.S
@@ -54,19 +54,38 @@ HIDENAME(curbrk): .quad CNAME(_end)
ENTRY(sbrk)
pushq %rdi
movq %rdi,%rcx
- movq PIC_GOT(HIDENAME(curbrk)),%rax
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(curbrk)),%rdx
+ movq (%rdx),%rax
+#else
+ movq HIDENAME(curbrk)(%rip),%rax
+#endif
testq %rcx,%rcx
jz back
addq %rax,%rdi
mov $SYS_break,%eax
KERNCALL
jb err
- movq PIC_GOT(HIDENAME(curbrk)),%rax
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(curbrk)),%rdx
+ movq (%rdx),%rax
+#else
+ movq HIDENAME(curbrk)(%rip),%rax
+#endif
movq 0(%rsp), %rcx
- addq %rcx,PIC_GOT(HIDENAME(curbrk))
+#ifdef PIC
+ addq %rcx,(%rdx)
+#else
+ addq %rcx,HIDENAME(curbrk)(%rip)
+#endif
back:
addq $8, %rsp
ret
err:
addq $8, %rsp
- jmp PIC_PLT(HIDENAME(cerror))
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(cerror)),%rdx
+ jmp *%rdx
+#else
+ jmp HIDENAME(cerror)
+#endif
diff --git a/lib/libc/amd64/sys/setlogin.S b/lib/libc/amd64/sys/setlogin.S
index 54acef8..cb355d2 100644
--- a/lib/libc/amd64/sys/setlogin.S
+++ b/lib/libc/amd64/sys/setlogin.S
@@ -45,5 +45,10 @@ __FBSDID("$FreeBSD$");
.globl CNAME(_logname_valid) /* in _getlogin() */
SYSCALL(setlogin)
- movl $0,PIC_GOT(CNAME(_logname_valid))
+#ifdef PIC
+ movq PIC_GOT(CNAME(_logname_valid)),%rdx
+ movl $0,(%rdx)
+#else
+ movl $0,CNAME(_logname_valid)(%rip)
+#endif
ret /* setlogin(name) */
diff --git a/lib/libc/amd64/sys/vfork.S b/lib/libc/amd64/sys/vfork.S
index b3fc3cf..fe9313e 100644
--- a/lib/libc/amd64/sys/vfork.S
+++ b/lib/libc/amd64/sys/vfork.S
@@ -53,5 +53,10 @@ ENTRY(__sys_vfork)
jb 1f
jmp *%rsi
1:
- pushq %rcx
- jmp PIC_PLT(HIDENAME(cerror))
+ pushq %rsi
+#ifdef PIC
+ movq PIC_GOT(HIDENAME(cerror)),%rdx
+ jmp *%rdx
+#else
+ jmp HIDENAME(cerror)
+#endif
OpenPOWER on IntegriCloud