我正在尝试查看" arch / arm64 / kernel / asm-offsets.c"中定义的内容。
但是不了解这个文件的目的,它实际包含什么?
例如:
DEFINE(KVM_TIMER_CNTVOFF, offsetof(struct kvm, arch.timer.cntvoff));
上面的定义是什么意思,arch.timer.cntvoff映射到实际映射的实际CNTVOFF_EL2寄存器?
答案 0 :(得分:2)
此文件包含以汇编程序编写的模块所需的定义,例如,在KVM_TIMER_CNTVOFF
的情况下,它生成一个具有相同名称的符号,该符号包含从{1}开始的arch.timer.cntvoff
字段的偏移量。 kvm
结构(使用offsetof
宏:http://lxr.free-electrons.com/source/tools/include/linux/kernel.h#L15)。
所以,如果你有这个,你可以使用这些符号来访问asm中的结构字段,如下所示:http://tomoyo.osdn.jp/cgi-bin/lxr/source/arch/arm/kvm/interrupts_head.S#L555
555 ldr r4, [vcpu, #VCPU_KVM]
556 ldr r2, [r4, #KVM_TIMER_ENABLED]
557 cmp r2, #0
558 beq 1f
559
560 ldr r2, [r4, #KVM_TIMER_CNTVOFF]
561 ldr r3, [r4, #(KVM_TIMER_CNTVOFF + 4)]
562 mcrr p15, 4, rr_lo_hi(r2, r3), c14 @ CNTVOFF
563
因此,在r4中,您拥有struct kvm
实例的地址和
ldr r2, [r4, #KVM_TIMER_CNTVOFF]
您正在访问字段KVM_TIMER_CNTVOFF
。