__get_cpu_architecture
来源:互联网 发布:大米营销软件骗局 编辑:程序博客网 时间:2024/06/03 20:12
/*read c0, Main ID Register (MIDR)
31 24 23 20 19 16 15 4 3 0
Implementer Variant Architecture Primary part number Revision
Table B3-21 Architecture codes
Bits [19:16] Architecture
0x1 ARMv4
0x2 ARMv4T
0x3 ARMv5 (obsolete)
0x4 ARMv5T
0x5 ARMv5TE
0x6 ARMv5TEJ
0x7 ARMv6
0xF Defined by CPUID scheme
*/
static int __get_cpu_architecture(void)
{
int cpu_arch;
if ((read_cpuid_id() & 0x0008f000) == 0) {
//bit19&bit[15:12] == 0-> MSB of architecture field & top four bits of the primary part number both are 0x0.
cpu_arch = CPU_ARCH_UNKNOWN;
} else if ((read_cpuid_id() & 0x0008f000) == 0x00007000) {
//MSB of architecture field is 0, top four bits of the primary part number are 0x7.
cpu_arch = (read_cpuid_id() & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3;
/*If bit[23] is 1, the processor is an ARMv4T processor and bits[22:16] are an IMPLEMENTATION
DEFINED variant number. Bits[31:24,15:0] are as described for ARMv7.
If bit[23] is 0, the processor is an obsolete ARMv3 processor.
*/
} else if ((read_cpuid_id() & 0x00080000) == 0x00000000) {
//MSB of architecture field is 0, upon Table B3-21 to find arch.
cpu_arch = (read_cpuid_id() >> 16) & 7;
if (cpu_arch)
cpu_arch += CPU_ARCH_ARMv3;
} else if ((read_cpuid_id() & 0x000f0000) == 0x000f0000) {
unsigned int mmfr0;
/* Revised CPUID format. Read the Memory Model Feature
* Register 0 and check for VMSAv7 or PMSAv7 */
/* read Memory Model Feature Register 0 (ID_MMFR0)
PMSA support, bits [7:4]
Indicates support for a PMSA. Permitted values are:
0b0000 Not supported.
0b0001 Support for IMPLEMENTATION DEFINED PMSA.
0b0010 Support for PMSAv6, with a Cache Type Register implemented.
0b0011 Support for PMSAv7, with support for memory subsections. ARMv7-R profile.
When the PMSA support field is set to a value other than 0b0000 the VMSA support field
must be set to 0b0000.
VMSA support, bits [3:0]
Indicates support for a VMSA. Permitted values are:
0b0000 Not supported.
0b0001 Support for IMPLEMENTATION DEFINED VMSA.
0b0010 Support for VMSAv6, with Cache and TLB Type Registers implemented.
0b0011 Support for VMSAv7, with support for remapping and the access flag.
ARMv7-A profile.
When the VMSA support field is set to a value other than 0b0000 the PMSA support field
must be set to 0b0000.
*/
asm("mrc p15, 0, %0, c0, c1, 4"
: "=r" (mmfr0));
if ((mmfr0 & 0x0000000f) >= 0x00000003 ||
(mmfr0 & 0x000000f0) >= 0x00000030)
cpu_arch = CPU_ARCH_ARMv7;
else if ((mmfr0 & 0x0000000f) == 0x00000002 ||
(mmfr0 & 0x000000f0) == 0x00000020)
cpu_arch = CPU_ARCH_ARMv6;
else
cpu_arch = CPU_ARCH_UNKNOWN;
} else
cpu_arch = CPU_ARCH_UNKNOWN;
return cpu_arch;
}
- __get_cpu_architecture
- C语言笔记1--类型、运算符与表达式
- Ubuntu12.04下的超级终端:C-kermit 安装及使用方法
- ubuntu安装Memcache
- 键盘各键对应的编码值(key code)
- BZOJ1053
- __get_cpu_architecture
- Java Lambda表达式入门
- tomcat在Debug模式下无法启动解决办法
- 控制APP端,各种浏览器兼容问题,自适应尺寸
- C++浅拷贝与深拷贝
- 个人学习收藏-全国省市数据库
- 关于vim的学习经验
- 关于PKCS5Padding与PKCS7Padding的区别
- condition variable 和 srwlock的一个例子