Build changes that allow the modules on arm64.

- Move the required kernel compiler flags from Makefile.arm64 to kern.mk.
- Build arm64 modules as PIC; non-PIC relocations in .o for shared object
  output cannot be handled.
- Do not try to install aarch64 symlink.
- A hack for arm64 to avoid ld -r stage.  See the comment for the explanation.
  Some functionality is lost, like ctf handling, but hopefully will be
  restored after newer linker is available.

Reviewed by:	andrew, emaste
Tested by:	andrew (on real hardware)
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D3796
This commit is contained in:
kib 2015-10-08 17:42:08 +00:00
parent 48b0cbf71b
commit b2d840b61f
5 changed files with 23 additions and 9 deletions

View File

@ -22,7 +22,6 @@ cpu ARM64
ident GENERIC
makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
makeoptions NO_MODULES=1 # We don't yet support modules on arm64
options SCHED_ULE # ULE scheduler
options PREEMPTION # Enable kernel thread preemption

View File

@ -27,12 +27,6 @@ S= ../../..
INCLUDES+= -I$S/contrib/libfdt
# We generally don't want fpu instructions in the kernel.
CFLAGS += -mgeneral-regs-only
# Reserve x18 for pcpu data
CFLAGS += -ffixed-x18
.if !empty(DDB_ENABLED)
CFLAGS += -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
.endif

View File

@ -97,6 +97,13 @@ INLINE_LIMIT?= 8000
INLINE_LIMIT?= 8000
.endif
.if ${MACHINE_CPUARCH} == "aarch64"
# We generally don't want fpu instructions in the kernel.
CFLAGS += -mgeneral-regs-only
# Reserve x18 for pcpu data
CFLAGS += -ffixed-x18
.endif
#
# For sparc64 we want the medany code model so modules may be located
# anywhere in the 64-bit address space. We also tell GCC to use floating

View File

@ -212,7 +212,7 @@ SRCS= assym.s vnode_if.h ${BEFORE_DEPEND} ${CFILES} \
mv .newdep .depend
_ILINKS= machine
.if ${MACHINE} != ${MACHINE_CPUARCH}
.if ${MACHINE} != ${MACHINE_CPUARCH} && ${MACHINE} != "arm64"
_ILINKS+= ${MACHINE_CPUARCH}
.endif
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"

View File

@ -113,6 +113,10 @@ CFLAGS+= ${DEBUG_FLAGS}
CFLAGS+= -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
.endif
.if ${MACHINE_CPUARCH} == "aarch64"
CFLAGS+= -fPIC
.endif
# Temporary workaround for PR 196407, which contains the fascinating details.
# Don't allow clang to use fpu instructions or registers in kernel modules.
.if ${MACHINE_CPUARCH} == arm
@ -182,7 +186,17 @@ ${PROG}.debug: ${FULLPROG}
.if ${__KLD_SHARED} == yes
${FULLPROG}: ${KMOD}.kld
.if ${MACHINE_CPUARCH} != "aarch64"
${LD} -Bshareable ${_LDFLAGS} -o ${.TARGET} ${KMOD}.kld
.else
#XXXKIB Relocatable linking in aarch64 ld from binutils 2.25.1 does
# not work. The linker corrupts the references to the external
# symbols which are defined by other object in the linking set
# and should therefore loose the GOT entry. The problem seems
# to be fixed in the binutils-gdb git HEAD as of 2015-10-04. Hack
# below allows to get partially functioning modules for now.
${LD} -Bshareable ${_LDFLAGS} -o ${.TARGET} ${OBJS}
.endif
.if !defined(DEBUG_FLAGS)
${OBJCOPY} --strip-debug ${.TARGET}
.endif
@ -220,7 +234,7 @@ ${FULLPROG}: ${OBJS}
.endif
_ILINKS=machine
.if ${MACHINE} != ${MACHINE_CPUARCH}
.if ${MACHINE} != ${MACHINE_CPUARCH} && ${MACHINE} != "arm64"
_ILINKS+=${MACHINE_CPUARCH}
.endif
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"