Kernel build failed

I can’t build kernel successfully when I use these command as follow. I can’t slove it.

Command:

TEGRA_KERNEL_OUT=/home/mysystem/nvidia/nvidia_sdk/image
export LOCALVERSION=-tegra
export CROSS_COMPILE=aarch64-linux-gnu-
mkdir -p $TEGRA_KERNEL_OUT
make ARCH=arm64 O=$TEGRA_KERNEL_OUT tegra_defconfig
make ARCH=arm64 O=$TEGRA_KERNEL_OUT -j1

Error:

/home/mysystem/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P2888/Linux_for_Tegra/sources/kernel/nvidia/drivers/net/ethernet/nvidia/pcie/tegra_vnet.c: In function ‘process_ctrl_msg’:
/home/mysystem/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P2888/Linux_for_Tegra/sources/kernel/nvidia/drivers/net/ethernet/nvidia/pcie/tegra_vnet.c:974:11: error: ‘msg.msg_id’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
   else if (msg.msg_id == CTRL_MSG_LINK_DOWN_ACK)
           ^
cc1: all warnings being treated as errors
/home/mysystem/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P2888/Linux_for_Tegra/sources/kernel/kernel-4.9/scripts/Makefile.build:335: recipe for target 'drivers/net/ethernet/nvidia/pcie/tegra_vnet.o' failed
make[6]: *** [drivers/net/ethernet/nvidia/pcie/tegra_vnet.o] Error 1
/home/mysystem/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P2888/Linux_for_Tegra/sources/kernel/kernel-4.9/scripts/Makefile.build:649: recipe for target 'drivers/net/ethernet/nvidia/pcie' failed
make[5]: *** [drivers/net/ethernet/nvidia/pcie] Error 2
/home/mysystem/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P2888/Linux_for_Tegra/sources/kernel/kernel-4.9/scripts/Makefile.build:649: recipe for target 'drivers/net/ethernet/nvidia' failed
make[4]: *** [drivers/net/ethernet/nvidia] Error 2
/home/mysystem/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P2888/Linux_for_Tegra/sources/kernel/kernel-4.9/scripts/Makefile.build:649: recipe for target 'drivers/net/ethernet' failed
make[3]: *** [drivers/net/ethernet] Error 2
/home/mysystem/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P2888/Linux_for_Tegra/sources/kernel/kernel-4.9/scripts/Makefile.build:649: recipe for target 'drivers/net' failed
make[2]: *** [drivers/net] Error 2
/home/mysystem/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P2888/Linux_for_Tegra/sources/kernel/kernel-4.9/Makefile:1104: recipe for target 'drivers' failed
make[1]: *** [drivers] Error 2
make[1]: Leaving directory '/home/mysystem/nvidia/nvidia_sdk/image'
Makefile:171: recipe for target 'sub-make' failed
make: *** [sub-make] Error 2

Which kernel are you compiling, and what download source? What is your output from “aarch64-linux-gnu-gcc --version”?

kernel is 4.9, and I just use this command to get the kernel:

./source_sync.sh -k tegra-l4t-r32.2.0

After getting kernel, I use last commands to build kernel, but failed.

the aarch64-linux-gnu-gcc version is as follow:

aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

I have tried many times, even I clone the kernel source again and again.

Hi,

The issue can be solved by initializing msg as shown below

--- a/kernel/nvidia/drivers/net/ethernet/nvidia/pcie/tegra_vnet.c
+++ b/kernel/nvidia/drivers/net/ethernet/nvidia/pcie/tegra_vnet.c
@@ -964,6 +964,7 @@ static void process_ctrl_msg(struct work_struct *work)
        struct ep_ring_buf *ep_mem = &tvnet->ep_mem;
        struct ep_own_cnt *ep_cnt = ep_mem->ep_cnt;
        struct ctrl_msg msg;
+       memset(&msg, 0, sizeof(msg));
 
        while (tvnet_ivc_rd_available(ep_cnt, host_cnt, EP2H_CTRL)) {
                tvnet_read_ctrl_msg(tvnet, &msg);

--- a/kernel/nvidia/drivers/pci/endpoint/functions/pci-epf-tegra-vnet.c
+++ b/kernel/nvidia/drivers/pci/endpoint/functions/pci-epf-tegra-vnet.c
@@ -1004,6 +1004,7 @@ static void process_ctrl_msg(struct work_struct *work)
        struct ep_ring_buf *ep_ring_buf = &tvnet->ep_ring_buf;
        struct ep_own_cnt *ep_cnt = ep_ring_buf->ep_cnt;
        struct ctrl_msg msg;
+       memset(&msg, 0, sizeof(msg));
 
        while (tvnet_ivc_rd_available(ep_cnt, host_cnt, H2EP_CTRL)) {
                tvnet_read_ctrl_msg(tvnet, &msg);

There has been some progress in using newer gcc releases. If you run “which aarch64-linux-gnu-gcc”, where is it located?

FYI, this would install the newer version of the cross compiler:

sudo apt-get install gcc-aarch64-linux-gnu
# Then to see version (you may need to specify full path in "export CROSS_COMPILE" if it still sees the older one):
aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0

Using this I don’t run into the issue. I’m thinking that what you are seeing is related to compiler version differences.

I fix this problem by this way.