diff options
author | Nathan Whitehorn <nwhitehorn@FreeBSD.org> | 2015-11-29 07:16:08 +0000 |
---|---|---|
committer | Nathan Whitehorn <nwhitehorn@FreeBSD.org> | 2015-11-29 07:16:08 +0000 |
commit | 7c259020fb2dbab85352a42ebe466befbe6063bd (patch) | |
tree | 077c419550d7a3ffb86e03720bd4f886e967013d /sys | |
parent | 466d476aacb7b4356bcc396aa7461485e0253ef1 (diff) | |
download | src-7c259020fb2dbab85352a42ebe466befbe6063bd.tar.gz src-7c259020fb2dbab85352a42ebe466befbe6063bd.zip |
Make ELFv2 powerpc64 kernels build and run. Loader support will come in a
separate commit.
Notes
Notes:
svn path=/head/; revision=291442
Diffstat (limited to 'sys')
-rw-r--r-- | sys/powerpc/aim/locore64.S | 4 | ||||
-rw-r--r-- | sys/powerpc/include/asm.h | 15 | ||||
-rw-r--r-- | sys/powerpc/powerpc/exec_machdep.c | 3 | ||||
-rw-r--r-- | sys/powerpc/powerpc/swtch64.S | 4 | ||||
-rw-r--r-- | sys/powerpc/powerpc/vm_machdep.c | 5 |
5 files changed, 27 insertions, 4 deletions
diff --git a/sys/powerpc/aim/locore64.S b/sys/powerpc/aim/locore64.S index e1fcd3ab050a..fc2fa8de3255 100644 --- a/sys/powerpc/aim/locore64.S +++ b/sys/powerpc/aim/locore64.S @@ -65,6 +65,10 @@ #include <machine/spr.h> #include <machine/asm.h> +#ifdef _CALL_ELF +.abiversion _CALL_ELF +#endif + /* Locate the per-CPU data structure */ #define GET_CPUINFO(r) \ mfsprg0 r diff --git a/sys/powerpc/include/asm.h b/sys/powerpc/include/asm.h index e5ec398e47ba..b3c979c79b50 100644 --- a/sys/powerpc/include/asm.h +++ b/sys/powerpc/include/asm.h @@ -87,7 +87,9 @@ .tc name[TC],name #endif -#if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1) +#ifdef __powerpc64__ + +#if !defined(_CALL_ELF) || _CALL_ELF == 1 #define _ENTRY(name) \ .section ".text"; \ .p2align 2; \ @@ -100,6 +102,17 @@ .p2align 4; \ TYPE_ENTRY(name) \ DOT_LABEL(name): +#else +#define _ENTRY(name) \ + .text; \ + .p2align 4; \ + .globl name; \ + .type name,@function; \ +name: \ + addis %r2, %r12, (.TOC.-name)@ha; \ + addi %r2, %r2, (.TOC.-name)@l; \ + .localentry name, .-name; +#endif #define _END(name) \ .long 0; \ diff --git a/sys/powerpc/powerpc/exec_machdep.c b/sys/powerpc/powerpc/exec_machdep.c index 88bbf7cb7e7e..e9eff548a3f3 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 d2f686372b1d..fbec9a548484 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 c816e32cc2b4..3d4e58b779ef 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; |