我做了一个小的调试代码(见这里。我以前用过类似的代码,但这个似乎更正确。)
我想做一个与此相关的宏。它是用来在缓冲区中写入任意标记数据的。(当然我不能写入这么多数据,因为这个宏不会在边界处进行指针舍入)。
.macro write_mark, data
mov x27, \data
adr_l x26, myptr
ldr x28, [x26]
str x27, [x28], #8
adr_l x26, myptr
str x28, [x26] // store write pointer at myptr
.endm
当我将上面的代码添加到汇编文件的开头时,它工作得很好。
.... (skip) ....
#include <asm/sysreg.h>
#include <asm/thread_info.h>
#include <asm/virt.h>
.global mydstart
.global myptr
.global mydebug2
.macro write_mark, data
mov x27, \data
adr_l x26, myptr
ldr x28, [x26]
str x27, [x28], #8
adr_l x26, myptr
str x28, [x26] // store write pointer at myptr
.endm
#include "efi-header.S"
#define __PHYS_OFFSET KERNEL_START
我创建了arch/arm64/include/asm/ckim.h,并将上面的代码替换为“#include〈asm/ckim.h〉”。
ckim.h文件是这样的。
#ifndef __ASM_ASSEMBLER_H
#define __ASM_ASSEMBLER_H
.global mydstart
.global myptr
.global mydebug2
.macro write_mark, data
mov x27, \data
adr_l x26, myptr
ldr x28, [x26]
str x27, [x28], #8
adr_l x26, myptr
str x28, [x26] // store write pointer at myptr
.endm
#endif /* __ASM_ASSEMBLER_H */
然后当我做“make”时,我得到了这个错误。
ckim@ckim-ubuntu:~/prj1/LinuxDevDrv/linux-5.15.68$ make
CALL scripts/checksyscalls.sh
CALL scripts/atomic/check-atomics.sh
CHK include/generated/compile.h
AS arch/arm64/kernel/head.o
arch/arm64/kernel/head.S: Assembler messages:
arch/arm64/kernel/head.S:118: Error: unknown mnemonic `write_mark' -- `write_mark 0x4444'
make[2]: *** [scripts/Makefile.build:391: arch/arm64/kernel/head.o] Error 1
make[1]: *** [scripts/Makefile.build:552: arch/arm64/kernel] Error 2
make: *** [Makefile:1898: arch/arm64] Error 2
所有其他的asm/*.h包含文件都在arch/arm 64下,所以我把asm/ckim. h放在那里。我错过了什么?
1条答案
按热度按时间fbcarpbf1#
问题是你在include guard中有一个错误的标识符,请使用不同的标识符,如:
你使用了一个在其他包含文件中定义的标识符(特别是
asm/assembler.h
),因此,你的头文件将不包含保护代码