From 2faf74f7083c4a8ba724b14c2d88e61d63519c2f Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Tue, 25 Aug 2020 10:49:00 +0800 Subject: [PATCH] Revert "drop FSBL" Gitea issue #94 This reverts commit 67ff3c36e242b5eb4fd4d4e6a59a266490e3d780. --- default.nix | 30 ++++++++++- fsbl.nix | 37 +++++++++++++ fsbl.patch | 31 +++++++++++ gnutoolchain.nix | 134 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 fsbl.nix create mode 100644 fsbl.patch create mode 100644 gnutoolchain.nix diff --git a/default.nix b/default.nix index 47941bce..5a1973bf 100644 --- a/default.nix +++ b/default.nix @@ -7,6 +7,7 @@ let rustPlatform = (import ./rustPlatform.nix { inherit pkgs; }); artiqpkgs = import { inherit pkgs; }; vivado = import { inherit pkgs; }; + zc706-fsbl = import ./fsbl.nix { inherit pkgs; }; mkbootimage = (import ./mkbootimage.nix { inherit pkgs; }); build-zc706 = { variant }: let firmware = rustPlatform.buildRustPackage rec { @@ -54,6 +55,7 @@ let echo file binary-dist $out/top.bit >> $out/nix-support/hydra-build-products ''; + # SZL startup jtag = pkgs.runCommand "zc706-${variant}-jtag" {} '' mkdir $out @@ -82,11 +84,36 @@ let mkbootimage boot.bif $out/boot.bin echo file binary-dist $out/boot.bin >> $out/nix-support/hydra-build-products ''; + + # FSBL startup + fsbl-sd = pkgs.runCommand "zc706-${variant}-fsbl-sd" + { + buildInputs = [ mkbootimage ]; + } + '' + bifdir=`mktemp -d` + cd $bifdir + ln -s ${zc706-fsbl}/fsbl.elf fsbl.elf + ln -s ${gateware}/top.bit top.bit + ln -s ${firmware}/runtime.elf runtime.elf + cat > boot.bif << EOF + the_ROM_image: + { + [bootloader]fsbl.elf + top.bit + runtime.elf + } + EOF + mkdir $out $out/nix-support + mkbootimage boot.bif $out/boot.bin + echo file binary-dist $out/boot.bin >> $out/nix-support/hydra-build-products + ''; in { "zc706-${variant}-firmware" = firmware; "zc706-${variant}-gateware" = gateware; "zc706-${variant}-jtag" = jtag; "zc706-${variant}-sd" = sd; + "zc706-${variant}-fsbl-sd" = fsbl-sd; }; in ( @@ -95,5 +122,6 @@ in (build-zc706 { variant = "nist_qc2"; }) // (build-zc706 { variant = "acpki_simple"; }) // (build-zc706 { variant = "acpki_nist_clock"; }) // - (build-zc706 { variant = "acpki_nist_qc2"; }) + (build-zc706 { variant = "acpki_nist_qc2"; }) // + { inherit zc706-fsbl; } ) diff --git a/fsbl.nix b/fsbl.nix new file mode 100644 index 00000000..2acd272d --- /dev/null +++ b/fsbl.nix @@ -0,0 +1,37 @@ +{ pkgs, board ? "zc706" }: +let + gnutoolchain = import ./gnutoolchain.nix { inherit pkgs; }; +in +pkgs.stdenv.mkDerivation { + name = "${board}-fsbl"; + src = pkgs.fetchFromGitHub { + owner = "Xilinx"; + repo = "embeddedsw"; + rev = "65c849ed46c88c67457e1fc742744f96db968ff1"; + sha256 = "1rvl06ha40dzd6s9aa4sylmksh4xb9dqaxq462lffv1fdk342pda"; + }; + patches = [ ./fsbl.patch ]; + nativeBuildInputs = [ + pkgs.gnumake + gnutoolchain.binutils + gnutoolchain.gcc + ]; + patchPhase = + '' + patch -p1 -i ${./fsbl.patch} + patchShebangs lib/sw_apps/zynq_fsbl/misc/copy_bsp.sh + echo 'SEARCH_DIR("${gnutoolchain.newlib}/arm-none-eabi/lib");' >> lib/sw_apps/zynq_fsbl/src/lscript.ld + ''; + buildPhase = + '' + cd lib/sw_apps/zynq_fsbl/src + make BOARD=${board} "CFLAGS=-DFSBL_DEBUG_INFO -g" + ''; + installPhase = + '' + mkdir $out + cp fsbl.elf $out + ''; + doCheck = false; + dontFixup = true; +} diff --git a/fsbl.patch b/fsbl.patch new file mode 100644 index 00000000..2537177c --- /dev/null +++ b/fsbl.patch @@ -0,0 +1,31 @@ +diff --git a/lib/sw_apps/zynq_fsbl/src/Makefile b/lib/sw_apps/zynq_fsbl/src/Makefile +index 0e3ccdf1c5..a5b02f386e 100644 +--- a/lib/sw_apps/zynq_fsbl/src/Makefile ++++ b/lib/sw_apps/zynq_fsbl/src/Makefile +@@ -71,11 +71,14 @@ endif + all: $(EXEC) + + $(EXEC): $(LIBS) $(OBJS) $(INCLUDES) +- cp $(BSP_DIR)/$(BOARD)/ps7_init.* . + $(LINKER) $(LD1FLAGS) -o $@ $(OBJS) $(LDFLAGS) + rm -rf $(OBJS) +- +- ++ ++.PHONY: ps7_init ++ ++ps7_init: ++ cp $(BSP_DIR)/$(BOARD)/ps7_init.* . ++ + $(LIBS): + echo "Copying BSP files" + $(BSP_DIR)/copy_bsp.sh $(BOARD) $(CC) +@@ -86,7 +89,7 @@ $(LIBS): + make -C $(BSP_DIR) -k all "CC=armcc" "AR=armar" "C_FLAGS= -O2 -c" "EC_FLAGS=--debug --wchar32"; \ + fi; + +-%.o:%.c ++%.o:%.c ps7_init + $(CC) $(CC_FLAGS) $(CFLAGS) $(ECFLAGS) -c $< -o $@ $(INCLUDEPATH) + + %.o:%.S diff --git a/gnutoolchain.nix b/gnutoolchain.nix new file mode 100644 index 00000000..0a00a567 --- /dev/null +++ b/gnutoolchain.nix @@ -0,0 +1,134 @@ +{ pkgs ? import }: +let + +platform = "arm-none-eabi"; + +binutils-pkg = { stdenv, buildPackages +, fetchurl, zlib +, extraConfigureFlags ? [] +}: + +stdenv.mkDerivation rec { + basename = "binutils"; + version = "2.30"; + name = "${basename}-${platform}-${version}"; + src = fetchurl { + url = "https://ftp.gnu.org/gnu/binutils/binutils-${version}.tar.bz2"; + sha256 = "028cklfqaab24glva1ks2aqa1zxa6w6xmc8q34zs1sb7h22dxspg"; + }; + configureFlags = [ + "--enable-deterministic-archives" + "--target=${platform}" + "--with-cpu=cortex-a9" + "--with-fpu=vfpv3" + "--with-float=hard" + "--with-mode=thumb" + ] ++ extraConfigureFlags; + outputs = [ "out" "info" "man" ]; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + buildInputs = [ zlib ]; + enableParallelBuilding = true; + meta = { + description = "Tools for manipulating binaries (linker, assembler, etc.)"; + longDescription = '' + The GNU Binutils are a collection of binary tools. The main + ones are `ld' (the GNU linker) and `as' (the GNU assembler). + They also include the BFD (Binary File Descriptor) library, + `gprof', `nm', `strip', etc. + ''; + homepage = http://www.gnu.org/software/binutils/; + license = stdenv.lib.licenses.gpl3Plus; + /* Give binutils a lower priority than gcc-wrapper to prevent a + collision due to the ld/as wrappers/symlinks in the latter. */ + priority = "10"; + }; +}; + + +gcc-pkg = { stdenv, buildPackages +, fetchurl, gmp, mpfr, libmpc, platform-binutils +, extraConfigureFlags ? [] +}: + +stdenv.mkDerivation rec { + basename = "gcc"; + version = "9.1.0"; + name = "${basename}-${platform}-${version}"; + src = fetchurl { + url = "https://ftp.gnu.org/gnu/gcc/gcc-${version}/gcc-${version}.tar.xz"; + sha256 = "1817nc2bqdc251k0lpc51cimna7v68xjrnvqzvc50q3ax4s6i9kr"; + }; + preConfigure = + '' + mkdir build + cd build + ''; + configureScript = "../configure"; + configureFlags = + [ "--target=${platform}" + "--with-arch=armv7-a" + "--with-tune=cortex-a9" + "--with-fpu=vfpv3" + "--with-float=hard" + "--disable-libssp" + "--enable-languages=c" + "--with-as=${platform-binutils}/bin/${platform}-as" + "--with-ld=${platform-binutils}/bin/${platform}-ld" ] ++ extraConfigureFlags; + outputs = [ "out" "info" "man" ]; + hardeningDisable = [ "format" "pie" ]; + propagatedBuildInputs = [ gmp mpfr libmpc platform-binutils ]; + enableParallelBuilding = true; + dontFixup = true; +}; + + +newlib-pkg = { stdenv, fetchurl, buildPackages, platform-binutils, platform-gcc }: + +stdenv.mkDerivation rec { + pname = "newlib"; + version = "3.1.0"; + src = fetchurl { + url = "ftp://sourceware.org/pub/newlib/newlib-${version}.tar.gz"; + sha256 = "0ahh3n079zjp7d9wynggwrnrs27440aac04340chf1p9476a2kzv"; + }; + + nativeBuildInputs = [ platform-binutils platform-gcc ]; + + configureFlags = [ + "--target=${platform}" + + "--with-cpu=cortex-a9" + "--with-fpu=vfpv3" + "--with-float=hard" + "--with-mode=thumb" + "--enable-interwork" + "--disable-multilib" + + "--disable-newlib-supplied-syscalls" + "--with-gnu-ld" + "--with-gnu-as" + "--disable-newlib-io-float" + "--disable-werror" + ]; + dontFixup = true; +}; + + +in rec { + binutils-bootstrap = pkgs.callPackage binutils-pkg { }; + gcc-bootstrap = pkgs.callPackage gcc-pkg { + platform-binutils = binutils-bootstrap; + extraConfigureFlags = [ "--disable-libgcc" ]; + }; + newlib = pkgs.callPackage newlib-pkg { + platform-binutils = binutils-bootstrap; + platform-gcc = gcc-bootstrap; + }; + binutils = pkgs.callPackage binutils-pkg { + extraConfigureFlags = [ "--with-lib-path=${newlib}/arm-none-eabi/lib" ]; + }; + gcc = pkgs.callPackage gcc-pkg { + platform-binutils = binutils; + extraConfigureFlags = [ "--enable-newlib" "--with-headers=${newlib}/arm-none-eabi/include" ]; + }; +}