# Linux Kernel Module Cheat

#### 26.12.1. Update GCC: GCC supported by Buildroot

This is of course the simplest case.

You can quickly determine all the GCC versions supported by Buildroot by looking at:

    submodules/buildroot/package/gcc/Config.in.host

For example, in Buildroot 2018.08, which was used at LKMC 5d10529c10ad8a4777b0bac1543320df0c89a1ce, the default toolchain was 7.3.0, and the latest supported one was 8.2.0.

To just upgrade the toolchain to 8.2.0, and rebuild some userland executables to later run them, we could do:

    cd submodules/gcc
    git fetch up
    git checkout -b lkmc-gcc-8_2_0-release gcc-8_2_0-release
    git am ../buildroot/package/gcc/8.2.0/*
    cd ../..
    ./build-buildroot \
      --arch aarch64 \
      --buildroot-build-id gcc-8-2 \
      --config 'BR2_GCC_VERSION_8_X=y' \
      --config 'BR2_GCC_VERSION="8.2.0"' \
      --no-all \
      -- \
      toolchain \
    ;
    ./build-userland \
      --arch aarch64 \
      --buildroot-build-id gcc-8-2 \
      --out-rootfs-overlay-dir-prefix gcc-8-2 \
      --userland-build-id gcc-8-2 \
    ;
    ./build-buildroot --arch aarch64

where the `toolchain` Buildroot target builds only Buildroot: https://stackoverflow.com/questions/44521150/buildroot-install-and-build-the-toolchain-only

Note that this setup did not overwrite any of our default Buildroot due to careful namespacing with our `gcc-8-2` prefix!

Now you can either run the executables on User mode simulation with:

    ./run --arch aarch64 --userland userland/c/hello.c --userland-build-id gcc-8-2

or in full system with:

    ./run --arch aarch64 --eval-after './gcc-8-2/c/hello.out'

where the `gcc-8-2` prefix was added by `--out-rootfs-overlay-dir-prefix`.

ARM SVE support was only added to GCC 8 and can be enabled with the flag: `-march=armv8.2-a+sve`.

We already even had a C SVE test in-tree, but it was disabled because the old toolchain does not support it.

So once the new GCC 8 toolchain was built, we can first enable that test by editing the path_properties.py file to not skip C SVE tests anymore:

                    #os.path.splitext(self.path_components[-1])[1] == '.c' and self['arm_sve']

and then rebuild run one of the experiments from Change ARM SVE vector length in emulators:

    ./build-userland \
      --arch aarch64 \
      --buildroot-build-id gcc-8-2 \
      --force-rebuild \
      --march=armv8.2-a+sve \
      --out-rootfs-overlay-dir-prefix gcc-8-2 \
      --static \
      --userland-build-id gcc-8-2 \
    ;
    ./run \
      --arch aarch64 \
      --userland userland/arch/aarch64/inline_asm/sve_addvl.c \
      --userland-build-id gcc-8-2 \
      --static \
      --gem5-worktree master \
      -- \
      --param 'system.cpu[:].isa[:].sve_vl_se = 4' \

Bibliography:

- https://github.com/cirosantilli/linux-kernel-module-cheat/issues/87