USE_LLVM := 1 CROSS_GCC := arm-none-eabi- ifeq ($(USE_LLVM),1) COMPILER := LLVM=1 else COMPILER := CROSS_COMPILE=$(CROSS_GCC) endif build_dir := $(CURDIR)/build-vexpress #dtb := $(build_dir)/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dtb #dtb := $(build_dir)/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb dtb := $(build_dir)/arch/arm/boot/dts/vexpress-v2p-ca9.dtb fallback_dtb := $(HOME)/vexpress-v2p-ca15_a7.dtb output_dir := $(HOME) output_nfs := /mnt/storage/nfsroot/vexpress rootfs := $(HOME)/rootfs-vexpress.cpio config_file := $(build_dir)/.config rootfsbase := $(shell basename $(rootfs)) makejobs := $(shell grep '^processor' /proc/cpuinfo | sort -u | wc -l) makethreads := $(shell dc -e "$(makejobs) 1 + p") console := console=ttyAMA0,38400n8 tftproot := /mnt/storage/tftpboot nfsroot := 192.168.1.140\:/mnt/storage/nfsroot/nfsroot-vexpress-ca9 make_parallel := -j$(makethreads) -l$(makejobs) make_options := -f Makefile \ ARCH=arm \ $(make_parallel) \ $(COMPILER) \ KBUILD_OUTPUT=$(build_dir) # make_flags := CONFIG_DEBUG_SECTION_MISMATCH=y .PHONY: help help: @echo "make config - configure build dir for Vexpress" @echo "make build - build the kernel and produce a RAMdisk image" @echo @echo "example:" @echo "make -f vexpress.mak config" @echo "make -f vexpress.mak build" .PHONY: have-rootfs have-rootfs: @if [ ! -f $(rootfs) ] ; then \ echo "ERROR: no rootfs at $(rootfs)" ; \ echo "This is needed to boot the system." ; \ echo "ABORTING." ; \ exit 1 ; \ else \ echo "Rootfs available at $(rootfs)" ; \ fi @if [ ! -r $(rootfs) ] ; then \ echo "ERROR: rootfs at $(rootfs) not readable" ; \ echo "ABORTING." ; \ exit 1 ; \ fi .PHONY: have-crosscompiler have-crosscompiler: @if [ $(USE_LLVM) -eq 1 ] ; then \ echo "LLVM OK" ; \ else \ echo -n "Check that $(CROSS_COMPILE)gcc is available..." ; \ which $(CROSS_COMPILE)gcc > /dev/null ; \ if [ ! $$? -eq 0 ] ; then \ echo "ERROR: cross-compiler $(CROSS_COMPILE)gcc not in PATH=$$PATH!" ; \ echo "ABORTING." ; \ exit 1 ; \ else \ echo "OK" ;\ fi \ fi .PHONY: have-mkimage have-mkimage: @echo -n "Check that mkimage is available..." @which mkimage > /dev/null ; \ if [ ! $$? -eq 0 ] ; then \ echo "ERROR: mkimage not in PATH=$$PATH!" ; \ echo "This toom creates the uImage and comes from the uboot tools" ; \ echo "On Ubuntu/Debian sudo apt-get install uboot-mkimage" ; \ echo "ABORTING." ; \ exit 1 ; \ else \ echo "OK" ;\ fi config-base: FORCE @mkdir -p $(build_dir) $(MAKE) $(make_options) vexpress_defconfig # Config options needed to bring up rootfs on distros config-distro: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable PARTITION_ADVANCED \ --enable LDM_PARTITION \ --enable MSDOS_PARTITION \ --enable EXT4_FS \ --enable DEVTMPFS \ --enable CGROUPS \ --enable CGROUP_FREEZER \ --enable CGROUP_DEVICE \ --enable CPUSETS \ --enable PROC_PID_CPUSET \ --enable CGROUP_CPUACCT \ --enable RESOURCE_COUNTERS \ --enable CGROUP_MEM_RES_CTLR \ --enable CGROUP_MEM_RES_CTLR_DISABLED \ --enable CGROUP_MEM_RES_CTLR_SWAP \ --enable CGROUP_SCHED \ --enable FAIR_GROUP_SCHED \ --enable BLK_CGROUP \ --enable NAMESPACES \ --enable SCHED_AUTOGROUP \ --enable FHANDLE \ --enable SWAP \ --enable AUTOFS4_FS \ --enable BSD_PROCESS_ACCT \ --enable BSD_PROCESS_ACCT_V3 \ --enable TASKSTATS \ --enable TASK_DELAY_ACCT \ --enable TASK_XACCT \ --enable TASK_IO_ACCOUNTING \ --enable BUILD_BIN2C \ --enable IKCONFIG \ --enable IKCONFIG_PROC \ --enable PAGE_COUNTER \ --enable MEMCG \ --enable MEMCG_SWAP \ --enable MEMCG_SWAP_ENABLED \ --enable MEMCG_KMEM \ --enable CGROUP_PERF \ --enable CGROUP_WRITEBACK \ --enable USER_NS \ --enable BLK_DEV_BSG \ --enable BLK_DEV_BSGLIB \ --enable BLK_DEV_INTEGRITY \ --enable NET_INGRESS \ --enable IP_ADVANCED_ROUTER \ --set-str UEVENT_HELPER_PATH "" \ --enable WANT_DEV_COREDUMP \ --enable DEV_COREDUMP \ --enable CHR_DEV_SG \ --enable KEYS \ --enable ENCRYPTED_KEYS \ --enable SECURITY \ --enable SECURITYFS \ --enable SECURITY_NETWORK \ --enable SECURITY_NETWORK_XFRM \ --enable SECURITY_PATH \ --enable INTEGRITY \ --enable CRYPTO_USER_API \ --enable CRYPTO_USER_API_HASH \ --enable CRYPTO_USER_API_SKCIPHER \ --enable CRYPTO_USER_API_AEAD \ --enable ARM_CRYPTO \ --enable CRYPTO_SHA1_ARM \ --enable CRYPTO_SHA256_ARM \ --enable CRYPTO_SHA512_ARM \ --enable CRYPTO_AES_ARM \ --enable BINARY_PRINTF \ --enable MD \ --enable BLK_DEV_DM_BUILTIN \ --enable BLK_DEV_DM \ --enable DM_CRYPT \ --enable DM_UEVENT config-mainlined: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable FB \ --disable FB_ARMCLCD \ --enable CMA \ --enable CMA_DEBUG \ --enable CMA_DEBUGFS \ --enable DMA_CMA \ --enable DRM \ --enable DRM_PL111 \ --enable FRAMEBUFFER_CONSOLE \ --enable DRM_PANEL \ --enable DRM_PANEL_SIMPLE \ --enable DRM_BRIDGE \ --enable DRM_PANEL_BRIDGE \ --enable DRM_SII902X \ --enable LOGO \ --enable MTD_AFS_PARTS config-initramfs: have-rootfs config-base @cp $(rootfs) $(build_dir)/$(rootfsbase) # Configure in the initramfs $(CURDIR)/scripts/config --file $(config_file) \ --enable BLK_DEV_INITRD \ --set-str INITRAMFS_SOURCE $(rootfsbase) \ --enable RD_BZIP2 \ --enable INITRAMFS_COMPRESSION_BZIP2 # NFS exports configuration: # /mnt/storage/nfsroot/nfsroot-vexpress-ca9 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash,no_all_squash) config-nfsroot: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable NET \ --enable INET \ --enable NETDEVICES \ --enable ETHERNET \ --enable NETWORK_FILESYSTEMS \ --enable NFS_FS \ --disable NFS_V2 \ --enable ROOT_NFS \ --disable BLK_DEV_INITRD \ --set-str CMDLINE "${console} root=/dev/nfs rw nfsroot=${nfsroot},tcp,v3 ip=dhcp" \ --enable CONFIG_CMDLINE_FORCE config-ca9: config-base $(CURDIR)/scripts/config --file $(config_file) \ --disable CACHE_L2X0 \ --enable CPU_ICACHE_DISABLE # DEBUG_VEXPRESS_UART0_CA9 for CA9 # DEBUG_VEXPRESS_UART0_RS1 for RS1 (CA15) config-earlydebug: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable DEBUG_LL \ --enable EARLY_PRINTK \ --enable DEBUG_VEXPRESS_UART0_RS1 \ --enable DEBUG_UNCOMPRESS \ --set-str CMDLINE "${console} root=/dev/ram0 earlyprintk mem=128M" config-ftrace-console: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable FTRACE \ --enable BOOTTIME_TRACING \ --enable FUNCTION_TRACER \ --disable CMDLINE_FROM_BOOTLOADER \ --enable CMDLINE_FORCE \ --set-str CMDLINE "${console} root=/dev/ram0 earlyprintk mem=128M ftrace=function_graph ftrace_filter=init_* tp_printk tp_printk_stop_on_boot" config-dt: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable USE_OF \ --disable ATAGS \ --disable ARM_ATAG_DTB_COMPAT \ --enable LEDS_SYSCON \ --enable REGULATOR \ --enable REGULATOR_FIXED_VOLTAGE \ --enable PROC_DEVICETREE config-dt-appended: config-dt $(CURDIR)/scripts/config --file $(config_file) \ --enable ARM_APPENDED_DTB config-kernel-in-vmalloc: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable EMBEDDED \ --disable ARM_PATCH_PHYS_VIRT \ --enable ARM_KERNEL_IN_VMALLOC \ --disable CPU_IDLE config-lpae: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable ARM_LPAE \ --disable CPU_TTBR0_PAN \ --disable ARM_PAN config-lpae-pan: config-lpae $(CURDIR)/scripts/config --file $(config_file) \ --enable ARM_PAN \ --enable CPU_TTBR0_PAN \ --enable LKDTM config-addsep: config-base config-kernel-in-vmalloc config-lpae $(CURDIR)/scripts/config --file $(config_file) \ --enable ARM_KERNEL_SEPARATION config-kasan: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable KASAN \ --enable KASAN_OUTLINE \ --enable STACKTRACE \ --enable SLUB_DEBUG_ON \ --enable TEST_KASAN config-cfi: config-base $(CURDIR)/scripts/config --file $(config_file) \ --enable CFI_CLANG \ --enable CFI_PERMISSIVE \ --enable FTRACE \ --enable FUNCTION_TRACER \ --enable LKDTM # We disable modules while developing so the first executable # paged in will be /sbin/init and not /sbin/modprobe config-4g-4g: config-base config-kernel-in-vmalloc config-addsep config-lpae $(CURDIR)/scripts/config --file $(config_file) \ --disable MODULES \ --enable VMSPLIT_4G_4G #config: config-base config-initramfs config-kernel-in-vmalloc config-earlydebug #config: config-initramfs config-kasan #config: config-base config-dt config-distro #config-lpae config-kernel-in-vmalloc config-4g-4g #config-nfsroot # --enable ARM_BIG_LITTLE_CPUIDLE # config-kernel-in-vmalloc config-lpae # config-kernel-in-vmalloc config-addsep #config: config-base config-initramfs config-kernel-in-vmalloc config-addsep #config: config-base config-initramfs config-kernel-in-vmalloc config-lpae #config: config-base config-initramfs config-lpae-pan config: config-base config-initramfs config-cfi # Reconfigure a bit $(CURDIR)/scripts/config --file $(config_file) \ --enable SMP \ --enable REGULATOR_GPIO \ --enable MCPM \ --enable BIG_LITTLE \ --disable BL_SWITCHER \ --enable ARM_CCI400_PORT_CTRL \ --enable CPU_FREQ \ --enable CPUFREQ_DT \ --enable CPUFREQ_DT_PLATDEV \ --enable ARCH_VEXPRESS_DCSCB \ --enable ARCH_VEXPRESS_SPC \ --enable ARCH_VEXPRESS_TC2_PM \ --enable DEBUG \ --enable DEBUG_FS \ --enable DEBUG_VM_PGTABLE \ --set-str LOG_BUF_SHIFT "18" \ --disable MODULES yes "" | make $(make_options) oldconfig # Under consideration # --enable LEDS_TRIGGER_ARM_CPU # --enable DMADEVICES # --enable AMBA_PL08X menuconfig: FORCE $(MAKE) $(make_options) menuconfig saveconfig: config-base config-mainlined $(MAKE) $(make_options) savedefconfig cp $(build_dir)/defconfig arch/arm/configs/vexpress_defconfig build-dtbs: FORCE #$(MAKE) $(make_options) dtbs $(make_flags) echo "Skip building DTB" check-bindings: FORCE $(MAKE) $(make_options) dt_binding_check -k $(make_flags) $(MAKE) $(make_options) dtbs_check -k $(make_flags) build-zimage: have-crosscompiler $(MAKE) $(make_options) zImage $(make_flags) @echo "Copy vmlinux to $(output_dir)/vmlinux..." @cp -f $(build_dir)/vmlinux $(output_dir)/vmlinux @echo "Copy zImage to $(output_dir)/zImage..." @cp -f $(build_dir)/arch/arm/boot/zImage $(output_dir)/zImage build-zimage-dt: build-zimage build-dtbs @if [ ! -r $(dtb) ] ; then \ echo "Warning: NO DTB in $(dtb)! Using fallback." ; \ fi @echo "Catenate DTB onto zImage $(output_dir)/zImage..." @if [ -r $(dtb) ] ; then \ cat $(dtb) >> $(output_dir)/zImage ; \ else \ cat $(fallback_dtb) >> $(output_dir)/zImage ; \ fi build-modules: build-zimage build-dtbs $(MAKE) $(make_options) modules $(make_flags) build: build-zimage build-dtbs # Example create assembly for a single file # $(MAKE) $(make_options) lib/strnlen_user.s $(make_flags) @if [ -r $(dtb) ] ; then \ echo "Copy DTB to $(output_dir)/$(dtb)..." ; \ cp -f $(dtb) $(output_dir) ; \ fi @if [ -w $(tftproot) ] ; then \ echo "Copy to TFTP output dir $(tftproot)" ; \ cp $(output_dir)/vmlinux $(tftproot) ; \ cp $(output_dir)/zImage $(tftproot) ; \ if [ -r $(dtb) ] ; then \ cp $(dtb) $(tftproot)/vexpress.dtb ; \ echo "copied $(dtb) to $(tftproot)/vexpress.dtb ; \ else \ cp $(fallback_dtb) $(tftproot)/vexpress.dtb ; \ echo "copied $(fallback_dtb) to $(tftproot)/vexpress.dtb ; \ fi \ fi @if [ -w $(output_nfs) ]; then \ echo "Copying to NFS root $(output_nfs)" ; \ cp -f $(output_dir)/vmlinux $(output_nfs) ; \ cp -f $(output_dir)/zImage $(output_nfs) ; \ if [ -r $(dtb) ] ; then \ cp $(dtb) $(output_nfs) ; \ cp $(dtb) $(output_nfs)/vexpress.dtb ; \ fi \ fi @echo "TFTP boot:" @echo "setenv bootargs mem=128M console=ttyAMA0,38400n8 root=/dev/sda1 rw rootwait rootfstype=ext4 init=/sbin/init" @echo "set serverip 192.168.1.140 ; set ipaddr 192.168.1.35 ; tftpboot 0x62000000 zImage ; tftpboot 0x68000000 vexpress.dtb ; bootz 0x62000000 - 0x68000000" @echo "setenv fdt_high 0xffffffff ; setenv serverip 192.168.1.140 ; setenv ipaddr 192.168.1.35 ; tftpboot 0x80008000 zImage ; tftpboot 0x81000000 vexpress.dtb ; bootz 0x80008000 - 0x81000000" clean: $(MAKE) -f Makefile clean rm -rf $(build_dir) # Rules without commands or prerequisites that do not match a file name # are considered to always change when make runs. This means that any rule # that depends on FORCE will always be remade also. FORCE: