summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/powerpc
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2015-11-29 07:16:08 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2015-11-29 07:16:08 +0000
commit25ef2e53c976d01ffd90c9d2091d5cc562993e6b (patch)
tree077c419550d7a3ffb86e03720bd4f886e967013d /sys/powerpc/powerpc
parent30151e3525326f123feec03d52cb20e7fd25e4c3 (diff)
downloadFreeBSD-src-25ef2e53c976d01ffd90c9d2091d5cc562993e6b.zip
FreeBSD-src-25ef2e53c976d01ffd90c9d2091d5cc562993e6b.tar.gz
Make ELFv2 powerpc64 kernels build and run. Loader support will come in a
separate commit.
Diffstat (limited to 'sys/powerpc/powerpc')
-rw-r--r--sys/powerpc/powerpc/exec_machdep.c3
-rw-r--r--sys/powerpc/powerpc/swtch64.S4
-rw-r--r--sys/powerpc/powerpc/vm_machdep.c5
3 files changed, 9 insertions, 3 deletions
diff --git a/sys/powerpc/powerpc/exec_machdep.c b/sys/powerpc/powerpc/exec_machdep.c
index 88bbf7cb..e9eff54 100644
--- a/sys/powerpc/powerpc/exec_machdep.c
+++ b/sys/powerpc/powerpc/exec_machdep.c
@@ -972,11 +972,12 @@ cpu_set_upcall(struct thread *td, struct thread *td0)
cf->cf_arg1 = (register_t)tf;
pcb2->pcb_sp = (register_t)cf;
- #ifdef __powerpc64__
+ #if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
pcb2->pcb_lr = ((register_t *)fork_trampoline)[0];
pcb2->pcb_toc = ((register_t *)fork_trampoline)[1];
#else
pcb2->pcb_lr = (register_t)fork_trampoline;
+ pcb2->pcb_context[0] = pcb2->pcb_lr;
#endif
pcb2->pcb_cpu.aim.usr_vsid = 0;
diff --git a/sys/powerpc/powerpc/swtch64.S b/sys/powerpc/powerpc/swtch64.S
index d2f6863..fbec9a5 100644
--- a/sys/powerpc/powerpc/swtch64.S
+++ b/sys/powerpc/powerpc/swtch64.S
@@ -65,6 +65,10 @@
#include <machine/param.h>
#include <machine/asm.h>
+#ifdef _CALL_ELF
+.abiversion _CALL_ELF
+#endif
+
TOC_ENTRY(blocked_lock)
/*
diff --git a/sys/powerpc/powerpc/vm_machdep.c b/sys/powerpc/powerpc/vm_machdep.c
index c816e32..3d4e58b 100644
--- a/sys/powerpc/powerpc/vm_machdep.c
+++ b/sys/powerpc/powerpc/vm_machdep.c
@@ -143,7 +143,7 @@ cpu_fork(struct thread *td1, struct proc *p2, struct thread *td2, int flags)
cf = (struct callframe *)tf - 1;
memset(cf, 0, sizeof(struct callframe));
- #ifdef __powerpc64__
+ #if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
cf->cf_toc = ((register_t *)fork_return)[1];
#endif
cf->cf_func = (register_t)fork_return;
@@ -152,11 +152,12 @@ cpu_fork(struct thread *td1, struct proc *p2, struct thread *td2, int flags)
pcb->pcb_sp = (register_t)cf;
KASSERT(pcb->pcb_sp % 16 == 0, ("stack misaligned"));
- #ifdef __powerpc64__
+ #if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
pcb->pcb_lr = ((register_t *)fork_trampoline)[0];
pcb->pcb_toc = ((register_t *)fork_trampoline)[1];
#else
pcb->pcb_lr = (register_t)fork_trampoline;
+ pcb->pcb_context[0] = pcb->pcb_lr;
#endif
#ifdef AIM
pcb->pcb_cpu.aim.usr_vsid = 0;
OpenPOWER on IntegriCloud