2005-04-16 15:20:36 -07:00
|
|
|
#
|
2007-11-21 06:13:34 -07:00
|
|
|
# arch/sh/Makefile
|
2005-04-16 15:20:36 -07:00
|
|
|
#
|
|
|
|
# Copyright (C) 1999 Kaz Kojima
|
2008-10-28 03:37:05 -07:00
|
|
|
# Copyright (C) 2002 - 2008 Paul Mundt
|
2005-04-16 15:20:36 -07:00
|
|
|
# Copyright (C) 2002 M. R. Brown
|
|
|
|
#
|
2007-11-21 06:13:34 -07:00
|
|
|
# This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
# License. See the file "COPYING" in the main directory of this archive
|
|
|
|
# for more details.
|
2005-04-16 15:20:36 -07:00
|
|
|
#
|
2006-01-16 23:14:19 -07:00
|
|
|
isa-y := any
|
2006-09-27 01:38:11 -07:00
|
|
|
isa-$(CONFIG_SH_DSP) := sh
|
2006-01-16 23:14:19 -07:00
|
|
|
isa-$(CONFIG_CPU_SH2) := sh2
|
2006-09-27 01:38:11 -07:00
|
|
|
isa-$(CONFIG_CPU_SH2A) := sh2a
|
2006-01-16 23:14:19 -07:00
|
|
|
isa-$(CONFIG_CPU_SH3) := sh3
|
|
|
|
isa-$(CONFIG_CPU_SH4) := sh4
|
|
|
|
isa-$(CONFIG_CPU_SH4A) := sh4a
|
2006-09-27 01:38:11 -07:00
|
|
|
isa-$(CONFIG_CPU_SH4AL_DSP) := sh4al
|
2007-11-08 02:52:35 -07:00
|
|
|
isa-$(CONFIG_CPU_SH5) := shmedia
|
2006-01-16 23:14:19 -07:00
|
|
|
isa-$(CONFIG_SH_DSP) := $(isa-y)-dsp
|
|
|
|
|
2007-06-01 01:25:42 -07:00
|
|
|
cflags-$(CONFIG_CPU_SH2) := $(call cc-option,-m2,)
|
2007-07-11 17:48:54 -07:00
|
|
|
cflags-$(CONFIG_CPU_SH2A) += $(call cc-option,-m2a,) \
|
2007-06-01 01:25:42 -07:00
|
|
|
$(call cc-option,-m2a-nofpu,)
|
|
|
|
cflags-$(CONFIG_CPU_SH3) := $(call cc-option,-m3,)
|
|
|
|
cflags-$(CONFIG_CPU_SH4) := $(call cc-option,-m4,) \
|
2005-04-16 15:20:36 -07:00
|
|
|
$(call cc-option,-mno-implicit-fp,-m4-nofpu)
|
2007-07-11 17:48:54 -07:00
|
|
|
cflags-$(CONFIG_CPU_SH4A) += $(call cc-option,-m4a,) \
|
2007-06-01 01:25:42 -07:00
|
|
|
$(call cc-option,-m4a-nofpu,)
|
2007-11-08 02:52:35 -07:00
|
|
|
cflags-$(CONFIG_CPU_SH5) := $(call cc-option,-m5-32media-nofpu,)
|
2006-11-20 19:12:19 -07:00
|
|
|
|
sh: Fix FPU tuning on toolchains with mismatched multilib targets.
Presently there is very little standing in the way of using an SH-4
toolchain for building an SH-2 kernel, and vice versa. Binutils itself
has no limitations whatsoever and supports explicit ISA hinting, which
we already use with varying degrees of success today.
This leaves GCC as the odd one out, due to a rather dubious policy
decision by the GCC folks to not include all of the CPU family variants
in the default list of multilib targets in GCC4. Despite best efforts to
the contrary, libgcc itself already contains awareness of the various CPU
types and remains generally usable, allowing it to safely be referenced
even on a mismatched target (and indeed, explicit ISA tuning by binutils
keeps us honest in terms of ensuring that we do not link incompatible
objects in).
In order to support this, a couple of changes had to be made. Firstly,
the introduction of MAYBE_DECLARE_EXPORT(), which provides a __weak
extern reference for libgcc resident routines when finer-grained
-m<cpu-family> based tuning is not supported by the toolchain. This
fixes up the __sdivsi3_i4i and __udivsi3_i4i references when dealing
with SH-2 kernels linked with an SH-4 libgcc. Secondly, in case where we
are unable to find a suitable match for CPU family tuning but still
have a toolchain that defaults to FP instruction generation, a suitable
nofpu target must be selected. This is accomplished by selecting the
first nofpu multilib target supported by the toolchain, which is
also necessary for selecting the proper libgcc to link against.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
2008-10-28 01:19:35 -07:00
|
|
|
ifeq ($(cflags-y),)
|
|
|
|
#
|
|
|
|
# In the case where we are stuck with a compiler that has been uselessly
|
|
|
|
# restricted to a particular ISA, a favourite default of newer GCCs when
|
|
|
|
# extensive multilib targets are not provided, ensure we get the best fit
|
|
|
|
# regarding FP generation. This is necessary to avoid references to FP
|
|
|
|
# variants in libgcc where integer variants exist, which otherwise result
|
|
|
|
# in link errors. This is intentionally stupid (albeit many orders of
|
|
|
|
# magnitude less than GCC's default behaviour), as anything with a large
|
|
|
|
# number of multilib targets better have been built correctly for
|
|
|
|
# the target in mind.
|
|
|
|
#
|
|
|
|
cflags-y += $(shell $(CC) $(KBUILD_CFLAGS) -print-multi-lib | \
|
|
|
|
grep nofpu | sed q | sed -e 's/^/-/;s/;.*$$//')
|
|
|
|
endif
|
|
|
|
|
2006-11-20 19:12:19 -07:00
|
|
|
cflags-$(CONFIG_CPU_BIG_ENDIAN) += -mb
|
|
|
|
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -ml
|
|
|
|
|
2008-06-09 00:49:43 -07:00
|
|
|
cflags-y += $(call cc-option,-mno-fdpic)
|
|
|
|
|
2007-08-21 00:56:56 -07:00
|
|
|
#
|
|
|
|
# -Wa,-isa= tuning implies -Wa,-dsp for the versions of binutils that
|
|
|
|
# support it, while -Wa,-dsp by itself limits the range of usable opcodes
|
|
|
|
# on certain CPU subtypes. Try the ISA variant first, and if that fails,
|
|
|
|
# fall back on -Wa,-dsp for the old binutils versions. Even without DSP
|
|
|
|
# opcodes, we always want the best ISA tuning the version of binutils
|
|
|
|
# will provide.
|
|
|
|
#
|
|
|
|
isaflags-y := $(call as-option,-Wa$(comma)-isa=$(isa-y),)
|
|
|
|
|
|
|
|
isaflags-$(CONFIG_SH_DSP) := \
|
|
|
|
$(call as-option,-Wa$(comma)-isa=$(isa-y),-Wa$(comma)-dsp)
|
|
|
|
|
|
|
|
cflags-y += $(isaflags-y) -ffreestanding
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
cflags-$(CONFIG_MORE_COMPILE_OPTIONS) += \
|
|
|
|
$(shell echo $(CONFIG_COMPILE_OPTIONS) | sed -e 's/"//g')
|
|
|
|
|
2007-11-21 06:13:34 -07:00
|
|
|
OBJCOPYFLAGS := -O binary -R .note -R .note.gnu.build-id -R .comment \
|
|
|
|
-R .stab -R .stabstr -S
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2007-11-21 06:13:34 -07:00
|
|
|
# Give the various platforms the opportunity to set default image types
|
2008-10-28 02:50:00 -07:00
|
|
|
defaultimage-$(CONFIG_SUPERH32) := zImage
|
|
|
|
defaultimage-$(CONFIG_SH_SH7785LCR) := uImage
|
2006-12-05 19:08:49 -07:00
|
|
|
|
2007-11-21 06:13:34 -07:00
|
|
|
# Set some sensible Kbuild defaults
|
2008-07-29 04:19:43 -07:00
|
|
|
KBUILD_DEFCONFIG := shx3_defconfig
|
2007-11-21 06:13:34 -07:00
|
|
|
KBUILD_IMAGE := $(defaultimage-y)
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
#
|
|
|
|
# Choosing incompatible machines durings configuration will result in
|
|
|
|
# error messages during linking.
|
|
|
|
#
|
2007-11-19 23:38:11 -07:00
|
|
|
ifdef CONFIG_SUPERH32
|
2008-09-12 02:58:28 -07:00
|
|
|
UTS_MACHINE := sh
|
2007-11-19 23:38:11 -07:00
|
|
|
LDFLAGS_vmlinux += -e _stext
|
|
|
|
else
|
2008-09-12 02:58:28 -07:00
|
|
|
UTS_MACHINE := sh64
|
2007-11-20 23:34:33 -07:00
|
|
|
LDFLAGS_vmlinux += --defsym phys_stext=_stext-$(CONFIG_PAGE_OFFSET) \
|
2007-11-19 23:38:11 -07:00
|
|
|
--defsym phys_stext_shmedia=phys_stext+1 \
|
|
|
|
-e phys_stext_shmedia
|
|
|
|
endif
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
ifdef CONFIG_CPU_LITTLE_ENDIAN
|
|
|
|
LDFLAGS_vmlinux += --defsym 'jiffies=jiffies_64'
|
|
|
|
LDFLAGS += -EL
|
|
|
|
else
|
|
|
|
LDFLAGS_vmlinux += --defsym 'jiffies=jiffies_64+4'
|
|
|
|
LDFLAGS += -EB
|
|
|
|
endif
|
|
|
|
|
2007-11-11 01:41:56 -07:00
|
|
|
head-y := arch/sh/kernel/init_task.o
|
|
|
|
head-$(CONFIG_SUPERH32) += arch/sh/kernel/head_32.o
|
|
|
|
head-$(CONFIG_SUPERH64) += arch/sh/kernel/head_64.o
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2008-07-29 08:13:39 -07:00
|
|
|
core-y += arch/sh/kernel/ arch/sh/mm/ arch/sh/boards/
|
2006-09-27 01:15:32 -07:00
|
|
|
core-$(CONFIG_SH_FPU_EMU) += arch/sh/math-emu/
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2008-07-29 08:13:39 -07:00
|
|
|
# Mach groups
|
2008-07-29 05:41:37 -07:00
|
|
|
machdir-$(CONFIG_SOLUTION_ENGINE) += mach-se
|
2008-07-29 05:01:19 -07:00
|
|
|
machdir-$(CONFIG_SH_HP6XX) += mach-hp6xx
|
|
|
|
machdir-$(CONFIG_SH_DREAMCAST) += mach-dreamcast
|
|
|
|
machdir-$(CONFIG_SH_SH03) += mach-sh03
|
|
|
|
machdir-$(CONFIG_SH_SECUREEDGE5410) += mach-snapgear
|
|
|
|
machdir-$(CONFIG_SH_RTS7751R2D) += mach-r2d
|
|
|
|
machdir-$(CONFIG_SH_7751_SYSTEMH) += mach-systemh
|
|
|
|
machdir-$(CONFIG_SH_EDOSK7705) += mach-edosk7705
|
|
|
|
machdir-$(CONFIG_SH_HIGHLANDER) += mach-highlander
|
|
|
|
machdir-$(CONFIG_SH_MIGOR) += mach-migor
|
|
|
|
machdir-$(CONFIG_SH_SDK7780) += mach-sdk7780
|
|
|
|
machdir-$(CONFIG_SH_X3PROTO) += mach-x3proto
|
|
|
|
machdir-$(CONFIG_SH_SH7763RDP) += mach-sh7763rdp
|
|
|
|
machdir-$(CONFIG_SH_SH4202_MICRODEV) += mach-microdev
|
|
|
|
machdir-$(CONFIG_SH_LANDISK) += mach-landisk
|
|
|
|
machdir-$(CONFIG_SH_TITAN) += mach-titan
|
|
|
|
machdir-$(CONFIG_SH_LBOX_RE2) += mach-lboxre2
|
|
|
|
machdir-$(CONFIG_SH_CAYMAN) += mach-cayman
|
2007-05-14 03:12:37 -07:00
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
ifneq ($(machdir-y),)
|
2007-05-14 03:12:37 -07:00
|
|
|
core-y += $(addprefix arch/sh/boards/, \
|
|
|
|
$(filter-out ., $(patsubst %,%/,$(machdir-y))))
|
2005-04-16 15:20:36 -07:00
|
|
|
endif
|
|
|
|
|
2008-10-19 21:02:48 -07:00
|
|
|
# Common machine type headers. Not part of the arch/sh/boards/ hierarchy.
|
|
|
|
machdir-y += mach-common
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
# Companion chips
|
2007-07-16 21:52:38 -07:00
|
|
|
core-$(CONFIG_HD6446X_SERIES) += arch/sh/cchips/hd6446x/
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2008-07-29 06:46:55 -07:00
|
|
|
#
|
|
|
|
# CPU header paths
|
|
|
|
#
|
|
|
|
# These are ordered by optimization level. A CPU family that is a subset
|
|
|
|
# of another (ie, SH-2A / SH-2), is picked up first, with increasing
|
|
|
|
# levels of genericness if nothing more suitable is situated in the
|
|
|
|
# hierarchy.
|
|
|
|
#
|
|
|
|
# As an example, in order of preference, SH-2A > SH-2 > common definitions.
|
|
|
|
#
|
|
|
|
cpuincdir-$(CONFIG_CPU_SH2A) += cpu-sh2a
|
|
|
|
cpuincdir-$(CONFIG_CPU_SH2) += cpu-sh2
|
|
|
|
cpuincdir-$(CONFIG_CPU_SH3) += cpu-sh3
|
|
|
|
cpuincdir-$(CONFIG_CPU_SH4) += cpu-sh4
|
|
|
|
cpuincdir-$(CONFIG_CPU_SH5) += cpu-sh5
|
|
|
|
cpuincdir-y += cpu-common # Must be last
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
drivers-y += arch/sh/drivers/
|
|
|
|
drivers-$(CONFIG_OPROFILE) += arch/sh/oprofile/
|
|
|
|
|
|
|
|
boot := arch/sh/boot
|
|
|
|
|
2008-07-29 06:46:55 -07:00
|
|
|
cflags-y += $(foreach d, $(cpuincdir-y), -Iarch/sh/include/$(d)) \
|
|
|
|
$(foreach d, $(machdir-y), -Iarch/sh/include/$(d))
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2008-07-28 16:09:44 -07:00
|
|
|
KBUILD_CFLAGS += -pipe $(cflags-y)
|
|
|
|
KBUILD_CPPFLAGS += $(cflags-y)
|
|
|
|
KBUILD_AFLAGS += $(cflags-y)
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2008-08-01 15:13:44 -07:00
|
|
|
LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
|
|
|
|
|
|
|
|
libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y)
|
|
|
|
libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y)
|
|
|
|
libs-y += $(LIBGCC)
|
|
|
|
|
2006-03-05 15:14:10 -07:00
|
|
|
PHONY += maketools FORCE
|
2007-11-21 06:28:28 -07:00
|
|
|
|
2005-09-09 11:28:49 -07:00
|
|
|
maketools: include/linux/version.h FORCE
|
2008-08-01 15:14:09 -07:00
|
|
|
$(Q)$(MAKE) $(build)=arch/sh/tools include/asm-sh/machtypes.h
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2007-11-21 06:13:34 -07:00
|
|
|
all: $(KBUILD_IMAGE)
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2006-12-07 01:00:32 -07:00
|
|
|
zImage uImage uImage.srec vmlinux.srec: vmlinux
|
2005-04-16 15:20:36 -07:00
|
|
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
|
|
|
|
|
|
|
compressed: zImage
|
|
|
|
|
2008-07-28 16:09:44 -07:00
|
|
|
archprepare: maketools arch/sh/lib64/syscalltab.h
|
2007-11-21 06:28:28 -07:00
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
archclean:
|
|
|
|
$(Q)$(MAKE) $(clean)=$(boot)
|
|
|
|
|
|
|
|
define archhelp
|
2006-12-07 01:00:32 -07:00
|
|
|
@echo '* zImage - Compressed kernel image'
|
|
|
|
@echo ' vmlinux.srec - Create an ELF S-record'
|
|
|
|
@echo ' uImage - Create a bootable image for U-Boot'
|
|
|
|
@echo ' uImage.srec - Create an S-record for U-Boot'
|
2005-04-16 15:20:36 -07:00
|
|
|
endef
|
2007-11-21 06:28:28 -07:00
|
|
|
|
|
|
|
define filechk_gen-syscalltab
|
|
|
|
(set -e; \
|
|
|
|
echo "/*"; \
|
|
|
|
echo " * DO NOT MODIFY."; \
|
|
|
|
echo " *"; \
|
|
|
|
echo " * This file was generated by arch/sh/Makefile"; \
|
|
|
|
echo " * Any changes will be reverted at build time."; \
|
|
|
|
echo " */"; \
|
|
|
|
echo ""; \
|
|
|
|
echo "#ifndef __SYSCALLTAB_H"; \
|
|
|
|
echo "#define __SYSCALLTAB_H"; \
|
|
|
|
echo ""; \
|
|
|
|
echo "#include <linux/kernel.h>"; \
|
|
|
|
echo ""; \
|
|
|
|
echo "struct syscall_info {"; \
|
|
|
|
echo " const char *name;"; \
|
|
|
|
echo "} syscall_info_table[] = {"; \
|
|
|
|
sed -e '/^.*\.long /!d;s// { "/;s/\(\([^/]*\)\/\)\{1\}.*/\2/; \
|
|
|
|
s/[ \t]*$$//g;s/$$/" },/;s/\("\)sys_/\1/g'; \
|
|
|
|
echo "};"; \
|
|
|
|
echo ""; \
|
|
|
|
echo "#define NUM_SYSCALL_INFO_ENTRIES ARRAY_SIZE(syscall_info_table)";\
|
|
|
|
echo ""; \
|
|
|
|
echo "#endif /* __SYSCALLTAB_H */" )
|
|
|
|
endef
|
|
|
|
|
|
|
|
arch/sh/lib64/syscalltab.h: arch/sh/kernel/syscalls_64.S
|
|
|
|
$(call filechk,gen-syscalltab)
|
|
|
|
|
|
|
|
CLEAN_FILES += arch/sh/lib64/syscalltab.h \
|
2008-08-01 15:14:09 -07:00
|
|
|
include/asm-sh/machtypes.h
|