lookup_processor分析

linux-4.4.202\arch\arm\kernel\setup.c

*在支持的处理器类型列表中查找处理器。链接器
根据arch/arm/mm/proc-.S中的条目为我们构建此表
*/

struct proc_info_list *lookup_processor(u32 midr)
{
	struct proc_info_list *list = lookup_processor_type(midr);

	if (!list) {
		pr_err("CPU%u: configuration botched (ID %08x), CPU halted\n",
		       smp_processor_id(), midr);
		while (1)
		/* can't use cpu_relax() here as it may require MMU setup */;
	}

	return list;
}

然后调用lookup_processor_type:

/*
 * This provides a C-API version of __lookup_processor_type
 */

ENTRY(lookup_processor_type)
	stmfd	sp!, {r4 - r6, r9, lr}
	mov	r9, r0
	bl	__lookup_processor_type
	mov	r0, r5
	ldmfd	sp!, {r4 - r6, r9, pc}
ENDPROC(lookup_processor_type)


*读取处理器ID寄存器(CP#15,CR0),并在构建的链接文件中查找
*支持的处理器列表。请注意,对于__proc_info列表我们不能使用绝对地址
,因为我们没有在MMU上运行(因此,我们不在正确的地址空间中)。我们必须计算偏移量。
*

*r9=cpuid

*返回:
*r3、r4、r6 已修改
*r5=物理地址空间中的proc_info指针
*r9=cpuid(保留)

*/

__lookup_processor_type:
	adr	r3, __lookup_processor_type_data
	ldmia	r3, {r4 - r6}
	sub	r3, r3, r4			@ get offset between virt&phys
	add	r5, r5, r3			@ convert virt addresses to
	add	r6, r6, r3			@ physical address space
1:	ldmia	r5, {r3, r4}			@ value, mask
	and	r4, r4, r9			@ mask wanted bits
	teq	r3, r4
	beq	2f
	add	r5, r5, #PROC_INFO_SZ		@ sizeof(proc_info_list)
	cmp	r5, r6
	blo	1b
	mov	r5, #0				@ unknown processor
2:	ret	lr
ENDPROC(__lookup_processor_type)

__lookup_processor_type_data的数据如下:

/*
 * Look in <asm/procinfo.h> for information about the __proc_info structure.
 */
	.align	2
	.type	__lookup_processor_type_data, %object
__lookup_processor_type_data:
	.long	.
	.long	__proc_info_begin
	.long	__proc_info_end
	.size	__lookup_processor_type_data, . - __lookup_processor_type_data

.align::指定了代码对齐方式
.type: __lookup_processor_type_data, %object。 __lookup_processor_type_data类型为数据
.size 设定指定符号的大小。“__lookup_processor_type_data, . - __lookup_processor_type_data”中的”.”表示当前地址,减去__lookup_processor_type_data 符号的地址为整个__lookup_processor_type_data函数的大小。

_proc_info_begin为:
#define PROC_INFO
. = ALIGN(4);
VMLINUX_SYMBOL(__proc_info_begin) = .;
*(.proc.info.init)
VMLINUX_SYMBOL(__proc_info_end) = .;

*(.proc.info.init)定义为:

	.section ".rodata"
	string cpu_arch_name, "armv7m"
	string cpu_elf_name "v7m"
	string cpu_v7m_name "ARMv7-M"

	.section ".proc.info.init", #alloc

	/*
	 * Match any ARMv7-M processor core.
	 */
	.type	__v7m_proc_info, #object
__v7m_proc_info:
	.long	0x000f0000		@ Required ID value
	.long	0x000f0000		@ Mask for ID
	.long   0			@ proc_info_list.__cpu_mm_mmu_flags
	.long   0			@ proc_info_list.__cpu_io_mmu_flags
	initfn	__v7m_setup, __v7m_proc_info	@ proc_info_list.__cpu_flush
	.long	cpu_arch_name
	.long	cpu_elf_name
	.long	HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT
	.long	cpu_v7m_name
	.long	v7m_processor_functions	@ proc_info_list.proc
	.long	0			@ proc_info_list.tlb
	.long	0			@ proc_info_list.user
	.long	nop_cache_fns		@ proc_info_list.cache
	.size	__v7m_proc_info, . - __v7m_proc_info
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l531798151

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值