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