svn commit: r195900 - in projects/ppc64/sys: conf powerpc/aim
powerpc/aim64 powerpc/include powerpc/powerpc
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sun Jul 26 20:52:13 UTC 2009
Author: nwhitehorn
Date: Sun Jul 26 20:52:12 2009
New Revision: 195900
URL: http://svn.freebsd.org/changeset/base/195900
Log:
Add in some more missing bits, and a few beginning corrections for the
dot symbol function descriptor business in the PowerPC64 ABI. This produces
a kernel that compiles, links, and even manages to make it into
powerpc_init().
Added:
projects/ppc64/sys/powerpc/aim64/copyinout.c
- copied, changed from r195651, projects/ppc64/sys/powerpc/aim/copyinout.c
projects/ppc64/sys/powerpc/powerpc/elf64_machdep.c
- copied, changed from r195651, projects/ppc64/sys/powerpc/powerpc/elf_machdep.c
Modified:
projects/ppc64/sys/conf/files.powerpc64
projects/ppc64/sys/powerpc/aim/mmu_oea.c
projects/ppc64/sys/powerpc/aim64/locore.S
projects/ppc64/sys/powerpc/aim64/mmu_oea64.c
projects/ppc64/sys/powerpc/aim64/trap_subr.S
projects/ppc64/sys/powerpc/include/asm.h
projects/ppc64/sys/powerpc/powerpc/in_cksum.c
projects/ppc64/sys/powerpc/powerpc/setjmp.S
Modified: projects/ppc64/sys/conf/files.powerpc64
==============================================================================
--- projects/ppc64/sys/conf/files.powerpc64 Sun Jul 26 20:47:48 2009 (r195899)
+++ projects/ppc64/sys/conf/files.powerpc64 Sun Jul 26 20:52:12 2009 (r195900)
@@ -47,22 +47,13 @@ dev/syscons/scvtb.c optional sc
dev/syscons/teken/teken.c optional sc
dev/uart/uart_cpu_powerpc.c optional uart
kern/syscalls.c optional ktr
-libkern/ashldi3.c standard
-libkern/ashrdi3.c standard
libkern/bcmp.c standard
-libkern/cmpdi2.c standard
-libkern/divdi3.c standard
libkern/ffs.c standard
libkern/ffsl.c standard
libkern/fls.c standard
libkern/flsl.c standard
-libkern/lshrdi3.c standard
libkern/memmove.c standard
libkern/memset.c standard
-libkern/moddi3.c standard
-libkern/ucmpdi2.c standard
-libkern/udivdi3.c standard
-libkern/umoddi3.c standard
powerpc/aim/clock.c optional aim
powerpc/aim/interrupt.c optional aim
powerpc/aim/mp_cpudep.c optional aim smp
@@ -73,7 +64,7 @@ powerpc/aim/platform_chrp.c optional aim
powerpc/aim/trap.c optional aim
powerpc/aim/uma_machdep.c optional aim
powerpc/aim/vm_machdep.c optional aim
-#powerpc/aim64/copyinout.c optional aim
+powerpc/aim64/copyinout.c optional aim
powerpc/aim64/locore.S optional aim no-obj
powerpc/aim64/machdep.c optional aim
powerpc/aim64/mmu_oea64.c optional aim
@@ -112,7 +103,7 @@ powerpc/powerpc/db_hwwatch.c optional dd
powerpc/powerpc/db_interface.c optional ddb
powerpc/powerpc/db_trace.c optional ddb
powerpc/powerpc/dump_machdep.c standard
-powerpc/powerpc/elf_machdep.c standard
+powerpc/powerpc/elf64_machdep.c standard
powerpc/powerpc/fpu.c optional aim
powerpc/powerpc/fuswintr.c standard
powerpc/powerpc/gdb_machdep.c optional gdb
Modified: projects/ppc64/sys/powerpc/aim/mmu_oea.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/mmu_oea.c Sun Jul 26 20:47:48 2009 (r195899)
+++ projects/ppc64/sys/powerpc/aim/mmu_oea.c Sun Jul 26 20:52:12 2009 (r195900)
@@ -193,8 +193,8 @@ struct ofw_map {
*/
static struct mem_region *regions;
static struct mem_region *pregions;
-u_int phys_avail_count;
-int regions_sz, pregions_sz;
+static u_int phys_avail_count;
+static int regions_sz, pregions_sz;
static struct ofw_map *translations;
extern struct pmap ofw_pmap;
Copied and modified: projects/ppc64/sys/powerpc/aim64/copyinout.c (from r195651, projects/ppc64/sys/powerpc/aim/copyinout.c)
==============================================================================
--- projects/ppc64/sys/powerpc/aim/copyinout.c Mon Jul 13 01:37:48 2009 (r195651, copy source)
+++ projects/ppc64/sys/powerpc/aim64/copyinout.c Sun Jul 26 20:52:12 2009 (r195900)
@@ -103,13 +103,13 @@ copyout(const void *kaddr, void *udaddr,
up = udaddr;
while (len > 0) {
- p = (char *)USER_ADDR + ((u_int)up & ~SEGMENT_MASK);
+ p = (char *)USER_ADDR + ((uintptr_t)up & ~SEGMENT_MASK);
l = ((char *)USER_ADDR + SEGMENT_LENGTH) - p;
if (l > len)
l = len;
- set_user_sr(pm->pm_sr[(u_int)up >> ADDR_SR_SHFT]);
+ set_user_sr(pm->pm_sr[(uintptr_t)up >> ADDR_SR_SHFT]);
bcopy(kp, p, l);
@@ -144,13 +144,13 @@ copyin(const void *udaddr, void *kaddr,
up = udaddr;
while (len > 0) {
- p = (char *)USER_ADDR + ((u_int)up & ~SEGMENT_MASK);
+ p = (char *)USER_ADDR + ((uintptr_t)up & ~SEGMENT_MASK);
l = ((char *)USER_ADDR + SEGMENT_LENGTH) - p;
if (l > len)
l = len;
- set_user_sr(pm->pm_sr[(u_int)up >> ADDR_SR_SHFT]);
+ set_user_sr(pm->pm_sr[(uintptr_t)up >> ADDR_SR_SHFT]);
bcopy(p, kp, l);
@@ -218,14 +218,14 @@ subyte(void *addr, int byte)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (char *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+ p = (char *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
return (-1);
}
- set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+ set_user_sr(pm->pm_sr[(uintptr_t)addr >> ADDR_SR_SHFT]);
*p = (char)byte;
@@ -234,6 +234,31 @@ subyte(void *addr, int byte)
}
int
+suword32(void *addr, int word)
+{
+ struct thread *td;
+ pmap_t pm;
+ faultbuf env;
+ int *p;
+
+ td = PCPU_GET(curthread);
+ pm = &td->td_proc->p_vmspace->vm_pmap;
+ p = (int *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+
+ if (setfault(env)) {
+ td->td_pcb->pcb_onfault = NULL;
+ return (-1);
+ }
+
+ set_user_sr(pm->pm_sr[(uintptr_t)addr >> ADDR_SR_SHFT]);
+
+ *p = word;
+
+ td->td_pcb->pcb_onfault = NULL;
+ return (0);
+}
+
+int
suword(void *addr, long word)
{
struct thread *td;
@@ -243,14 +268,14 @@ suword(void *addr, long word)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (long *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+ p = (long *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
return (-1);
}
- set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+ set_user_sr(pm->pm_sr[(uintptr_t)addr >> ADDR_SR_SHFT]);
*p = word;
@@ -259,12 +284,11 @@ suword(void *addr, long word)
}
int
-suword32(void *addr, int32_t word)
+suword64(void *addr, int64_t word)
{
return (suword(addr, (long)word));
}
-
int
fubyte(const void *addr)
{
@@ -276,14 +300,15 @@ fubyte(const void *addr)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (u_char *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+ p = (u_char *)((uintptr_t)USER_ADDR +
+ ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
return (-1);
}
- set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+ set_user_sr(pm->pm_sr[(uintptr_t)addr >> ADDR_SR_SHFT]);
val = *p;
@@ -301,14 +326,14 @@ fuword(const void *addr)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (long *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+ p = (long *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
return (-1);
}
- set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+ set_user_sr(pm->pm_sr[(uintptr_t)addr >> ADDR_SR_SHFT]);
val = *p;
@@ -338,9 +363,10 @@ casuword(volatile u_long *addr, u_long o
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (u_long *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+ p = (u_long *)((uintptr_t)USER_ADDR +
+ ((uintptr_t)addr & ~SEGMENT_MASK));
- set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+ set_user_sr(pm->pm_sr[(uintptr_t)addr >> ADDR_SR_SHFT]);
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
Modified: projects/ppc64/sys/powerpc/aim64/locore.S
==============================================================================
--- projects/ppc64/sys/powerpc/aim64/locore.S Sun Jul 26 20:47:48 2009 (r195899)
+++ projects/ppc64/sys/powerpc/aim64/locore.S Sun Jul 26 20:52:12 2009 (r195900)
@@ -127,8 +127,7 @@ kernel_text:
* segment!
*/
.text
- .globl __start
-__start:
+ASENTRY(__start)
li 8,0
li 9,0x100
mtctr 9
@@ -163,7 +162,8 @@ __start:
mfsprg3 0
stw 0,16(9) /* ofmsr[4] = sprg3 */
- bl OF_initial_setup
+ bl .OF_initial_setup
+ nop
lis 4,end at ha
addi 4,4,end at l
@@ -176,12 +176,15 @@ __start:
mr 6,20
mr 7,21
- bl powerpc_init
+ bl .powerpc_init
+ nop
mr %r1, %r3
li %r3, 0
stw %r3, 0(%r1)
- bl mi_startup
- b OF_exit
+ bl .mi_startup
+ nop
+ b .OF_exit
+ nop
/*
* int setfault()
@@ -191,8 +194,7 @@ __start:
* or the (currently used) C code optimized, so it doesn't use any non-volatile
* registers.
*/
- .globl setfault
-setfault:
+ASENTRY(setfault)
mflr 0
mfcr 12
mfsprg 4,0
@@ -206,4 +208,4 @@ setfault:
xor 3,3,3
blr
-#include <powerpc/aim/trap_subr.S>
+#include <powerpc/aim64/trap_subr.S>
Modified: projects/ppc64/sys/powerpc/aim64/mmu_oea64.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim64/mmu_oea64.c Sun Jul 26 20:47:48 2009 (r195899)
+++ projects/ppc64/sys/powerpc/aim64/mmu_oea64.c Sun Jul 26 20:52:12 2009 (r195900)
@@ -268,9 +268,9 @@ struct ofw_map {
*/
static struct mem_region *regions;
static struct mem_region *pregions;
-extern u_int phys_avail_count;
-extern int regions_sz, pregions_sz;
-extern int ofw_real_mode;
+static u_int phys_avail_count;
+static int regions_sz, pregions_sz;
+static int ofw_real_mode;
static struct ofw_map translations[64];
extern struct pmap ofw_pmap;
@@ -732,11 +732,13 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_o
/* We don't have a direct map since there is no BAT */
hw_direct_map = 0;
+#ifndef __powerpc64__
/* Make sure battable is zero, since we have no BAT */
for (i = 0; i < 16; i++) {
battable[i].batu = 0;
battable[i].batl = 0;
}
+#endif
/* Get physical memory regions from firmware */
mem_regions(&pregions, &pregions_sz, ®ions, ®ions_sz);
Modified: projects/ppc64/sys/powerpc/aim64/trap_subr.S
==============================================================================
--- projects/ppc64/sys/powerpc/aim64/trap_subr.S Sun Jul 26 20:47:48 2009 (r195899)
+++ projects/ppc64/sys/powerpc/aim64/trap_subr.S Sun Jul 26 20:52:12 2009 (r195900)
@@ -478,8 +478,7 @@ CNAME(asttrapexit):
/*
* Deliberate entry to dbtrap
*/
- .globl CNAME(breakpoint)
-CNAME(breakpoint):
+ASENTRY(breakpoint)
mtsprg1 %r1
mfmsr %r3
mtsrr1 %r3
Modified: projects/ppc64/sys/powerpc/include/asm.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/asm.h Sun Jul 26 20:47:48 2009 (r195899)
+++ projects/ppc64/sys/powerpc/include/asm.h Sun Jul 26 20:52:12 2009 (r195900)
@@ -60,8 +60,16 @@
#define _GLOBAL(x) \
.data; .align 2; .globl x; x:
+#ifdef __powerpc64__
+#define _ENTRY(x) \
+ .text; .align 2; .globl x; .section ".opd","aw"; \
+ .align 3; x: \
+ .quad .x,.TOC. at tocbase,0; .previous; \
+ .align 4; .globl .x; .type .x, at function; .x:
+#else
#define _ENTRY(x) \
.text; .align 4; .globl x; .type x, at function; x:
+#endif
#ifdef GPROF
# define _PROF_PROLOGUE mflr 0; stw 0,4(1); bl _mcount
Copied and modified: projects/ppc64/sys/powerpc/powerpc/elf64_machdep.c (from r195651, projects/ppc64/sys/powerpc/powerpc/elf_machdep.c)
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/elf_machdep.c Mon Jul 13 01:37:48 2009 (r195651, copy source)
+++ projects/ppc64/sys/powerpc/powerpc/elf64_machdep.c Sun Jul 26 20:52:12 2009 (r195900)
@@ -48,7 +48,7 @@
#include <machine/elf.h>
#include <machine/md_var.h>
-struct sysentvec elf32_freebsd_sysvec = {
+struct sysentvec elf64_freebsd_sysvec = {
.sv_size = SYS_MAXSYSCALL,
.sv_table = sysent,
.sv_mask = 0,
@@ -62,7 +62,7 @@ struct sysentvec elf32_freebsd_sysvec =
.sv_sigcode = sigcode,
.sv_szsigcode = &szsigcode,
.sv_prepsyscall = NULL,
- .sv_name = "FreeBSD ELF32",
+ .sv_name = "FreeBSD ELF64",
.sv_coredump = __elfN(coredump),
.sv_imgact_try = NULL,
.sv_minsigstksz = MINSIGSTKSZ,
@@ -76,44 +76,44 @@ struct sysentvec elf32_freebsd_sysvec =
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL,
- .sv_flags = SV_ABI_FREEBSD | SV_ILP32
+ .sv_flags = SV_ABI_FREEBSD | SV_LP64
};
-static Elf32_Brandinfo freebsd_brand_info = {
+static Elf64_Brandinfo freebsd_brand_info = {
.brand = ELFOSABI_FREEBSD,
- .machine = EM_PPC,
+ .machine = EM_PPC64,
.compat_3_brand = "FreeBSD",
.emul_path = NULL,
.interp_path = "/libexec/ld-elf.so.1",
- .sysvec = &elf32_freebsd_sysvec,
+ .sysvec = &elf64_freebsd_sysvec,
.interp_newpath = NULL,
- .brand_note = &elf32_freebsd_brandnote,
+ .brand_note = &elf64_freebsd_brandnote,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
};
-SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY,
- (sysinit_cfunc_t) elf32_insert_brand_entry,
+SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY,
+ (sysinit_cfunc_t) elf64_insert_brand_entry,
&freebsd_brand_info);
-static Elf32_Brandinfo freebsd_brand_oinfo = {
+static Elf64_Brandinfo freebsd_brand_oinfo = {
.brand = ELFOSABI_FREEBSD,
- .machine = EM_PPC,
+ .machine = EM_PPC64,
.compat_3_brand = "FreeBSD",
.emul_path = NULL,
.interp_path = "/usr/libexec/ld-elf.so.1",
- .sysvec = &elf32_freebsd_sysvec,
+ .sysvec = &elf64_freebsd_sysvec,
.interp_newpath = NULL,
- .brand_note = &elf32_freebsd_brandnote,
+ .brand_note = &elf64_freebsd_brandnote,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
};
-SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_ANY,
- (sysinit_cfunc_t) elf32_insert_brand_entry,
+SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_ANY,
+ (sysinit_cfunc_t) elf64_insert_brand_entry,
&freebsd_brand_oinfo);
void
-elf32_dump_thread(struct thread *td __unused, void *dst __unused,
+elf64_dump_thread(struct thread *td __unused, void *dst __unused,
size_t *off __unused)
{
}
Modified: projects/ppc64/sys/powerpc/powerpc/in_cksum.c
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/in_cksum.c Sun Jul 26 20:47:48 2009 (r195899)
+++ projects/ppc64/sys/powerpc/powerpc/in_cksum.c Sun Jul 26 20:52:12 2009 (r195900)
@@ -228,7 +228,7 @@ skip_start:
if (len < mlen)
mlen = len;
- if ((clen ^ (int) addr) & 1)
+ if ((clen ^ (long) addr) & 1)
sum += in_cksumdata(addr, mlen) << 8;
else
sum += in_cksumdata(addr, mlen);
Modified: projects/ppc64/sys/powerpc/powerpc/setjmp.S
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/setjmp.S Sun Jul 26 20:47:48 2009 (r195899)
+++ projects/ppc64/sys/powerpc/powerpc/setjmp.S Sun Jul 26 20:52:12 2009 (r195900)
@@ -4,6 +4,8 @@
/* kernel version of this file, does not have signal goop */
/* int setjmp(jmp_buf env) */
+#include <machine/asm.h>
+
#define JMP_r1 0x04
#define JMP_r14 0x08
#define JMP_r15 0x0c
@@ -29,9 +31,7 @@
#define JMP_xer 0x5c
#define JMP_sig 0x60
-
-.globl setjmp
-setjmp:
+ASENTRY(setjmp)
stw 31, JMP_r31(3)
/* r1, r14-r30 */
stw 1, JMP_r1 (3)
@@ -67,8 +67,7 @@ setjmp:
.extern sigsetmask
-.globl longjmp
-longjmp:
+ASENTRY(longjmp)
lwz 31, JMP_r31(3)
/* r1, r14-r30 */
lwz 1, JMP_r1 (3)
More information about the svn-src-projects
mailing list