当前位置: 首页 > 工具软件 > cpuid > 使用案例 >

linux read_cpuid

澹台景山
2023-12-01

#define read_cpuid(reg) ({                      \
    u64 __val;                          \
    asm("mrs    %0, " #reg : "=r" (__val));         \
    __val;                              \
})

主要读取一些只读寄存器,封装如下

#ifndef __ASSEMBLY__

/*
 * The CPU ID never changes at run time, so we might as well tell the
 * compiler that it's constant.  Use this function to read the CPU ID
 * rather than directly reading processor_id or read_cpuid() directly.
 */
static inline u32 __attribute_const__ read_cpuid_id(void)
{
    return read_cpuid(MIDR_EL1);
}

static inline u64 __attribute_const__ read_cpuid_mpidr(void)-----------经常使用
{
    return read_cpuid(MPIDR_EL1);
}

static inline unsigned int __attribute_const__ read_cpuid_implementor(void)
{
    return MIDR_IMPLEMENTOR(read_cpuid_id());
}

static inline unsigned int __attribute_const__ read_cpuid_part_number(void)
{
    return MIDR_PARTNUM(read_cpuid_id());
}

static inline u32 __attribute_const__ read_cpuid_cachetype(void)
{
    return read_cpuid(CTR_EL0);
}

static inline bool id_aa64mmfr0_mixed_endian_el0(u64 mmfr0)
{
    return (ID_AA64MMFR0_BIGEND(mmfr0) == 0x1) ||
        (ID_AA64MMFR0_BIGENDEL0(mmfr0) == 0x1);
}
#endif /* __ASSEMBLY__ */

封装后的函数使用如下

void __init smp_setup_processor_id(void)
{
    u64 mpidr = read_cpuid_mpidr() & MPIDR_HWID_BITMASK;
    cpu_logical_map(0) = mpidr;

    /*
     * clear __my_cpu_offset on boot CPU to avoid hang caused by
     * using percpu variable early, for example, lockdep will
     * access percpu variable inside lock_release
     */
    set_my_cpu_offset(0);
    pr_info("Booting Linux on physical CPU 0x%lx\n", (unsigned long)mpidr);
}

 类似资料:

相关阅读

相关文章

相关问答