linux-stable-sw-v4.19.180-sw64-2203.tar.gz 编译错误排查方法
出现AR arch/sw_64/chip/chip3/built-in.a AR arch/sw_64/chip/built-in.a CC kernel/futex.o {standard input}: Assembler messages: {standard input}:8070: ??? lstw and rd_f the first register must be the same {standard input}:8453: ??? lstw and rd_f the first register must be the same {standard input}:8629: ??? lstw and rd_f the first register must be the same {standard input}:8665: ??? lstw and rd_f the first register must be the same {standard input}:8693: ??? lstw and rd_f the first register must be the same make[1]: *** [scripts/Makefile.build:304?kernel/futex.o] ?? 1这个看不懂原因大概是两个指令的寄存器必须一致吧而这个指令在哪呢打开make的调试日志make ARCHsw_64 CROSS_COMPILEsw_64-sunway-linux-gnu- V1 x.txt查看最后输出的命令sw_64-sunway-linux-gnu-gcc -Wp,-MD,kernel/.futex.o.d -nostdinc -isystem /opt/swgcc/usr/bin/../lib/gcc/sw_64-sunway-linux-gnu/10.3.0/include -I./arch/sw_64/include -I./arch/sw_64/include/generated -I./include -I./arch/sw_64/include/uapi -I./arch/sw_64/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -Werror-implicit-function-declaration -Werrorreturn-type -Wno-format-security -stdgnu89 -fno-PIE -pipe -ffixed-8 -mno-fp-regs -fno-jump-tables -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -Wno-int-in-bool-context -Wno-address-of-packed-member -O2 -fno-allow-store-data-races -Wframe-larger-than2048 -fno-stack-protector -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments -Wdeclaration-after-statement -Wno-pointer-sign -Wno-stringop-truncation -Wno-zero-length-bounds -Wno-array-bounds -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fno-stack-check -fconserve-stack -Werrorimplicit-int -Werrorstrict-prototypes -Werrordate-time -Werrorincompatible-pointer-types -Werrordesignated-init -fmacro-prefix-map./ -Wno-packed-not-aligned -DKBUILD_BASENAMEfutex -DKBUILD_MODNAMEfutex -c -o kernel/.tmp_futex.o kernel/futex.c将这个命令改成编译出汇编sw_64-sunway-linux-gnu-gcc -Wp,-MD,kernel/.futex.o.d -nostdinc -isystem /opt/swgcc/usr/bin/../lib/gcc/sw_64-sunway-linux-gnu/10.3.0/include -I./arch/sw_64/include -I./arch/sw_64/include/generated -I./include -I./arch/sw_64/include/uapi -I./arch/sw_64/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -Werror-implicit-function-declaration -Werrorreturn-type -Wno-format-security -stdgnu89 -fno-PIE -pipe -ffixed-8 -mno-fp-regs -fno-jump-tables -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -Wno-int-in-bool-context -Wno-address-of-packed-member -O2 -fno-allow-store-data-races -Wframe-larger-than2048 -fno-stack-protector -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments -Wdeclaration-after-statement -Wno-pointer-sign -Wno-stringop-truncation -Wno-zero-length-bounds -Wno-array-bounds -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fno-stack-check -fconserve-stack -Werrorimplicit-int -Werrorstrict-prototypes -Werrordate-time -Werrorincompatible-pointer-types -Werrordesignated-init -fmacro-prefix-map./ -Wno-packed-not-aligned-DKBUILD_BASENAMEfutex -DKBUILD_MODNAMEfutex -c -o kernel/.tmp_futex.S -S kernel/futex.c查看汇编的8070行代码来自 futex.h仔细对照能找到对应的函数下面我们从linux-stable-sw-v5.10.229-sw1.3.0.tar.gz 这个代码中找对应的函数因为linux-stable-sw-v5.10.229-sw1.3.0.tar.gz是可以编译通过的#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg, tmp) \ __asm__ __volatile__( \ 1: lldw %0, 0(%3)\n \ ldi %2, 1\n \ wr_f %2\n \ insn \ 2: lstw %1, 0(%3)\n \ rd_f %1\n \ beq %1, 4f\n \ bis $31, $31, %1\n \ 3: .subsection 2\n \ 4: br 1b\n \ .previous\n \ .section __ex_table, \a\\n \ .long 1b-.\n \ ldi $31, 3b-1b(%1)\n \ .long 2b-.\n \ ldi $31, 3b-2b(%1)\n \ .previous\n \ : r (oldval), r(ret), r(tmp) \ : r (uaddr), r(oparg) \ : memory)果然不一样了然后将这个代码修改过去即可/////qemu执行内核的代码#!/bin/bash bin/qemu-system-sw64 \ -M core3 \ -cpu core3 \ -m 4G \ -smp 1\ -name vm001 \ -kernel ./vmlinux \ -drive file./busybox.qcow2,ifvirtio \ -append root/dev/vda rw consolettyS0 ignore_loglevel notc init/init \ -d int,guest_errors -D a.log \ -device VGA \ -serial stdio \ -monitor telnet:localhost:7100,server,nowait,nodelay \ -s内核编译时注意dtb要采用内嵌的名字是chip_vt