|
本帖最后由 brep 于 2018-6-12 22:07 编辑
根据《MIPS® Architecture for Programmers Volume IV-j: The MIPS64® SIMD Architecture Module》的说明,Config3 (CP0 Register 16, Select 3) 的Bit28是 MSA 实现的存在位,如果此位为1,则说明CPU中存在MSA实现,如果为0,则说明CPU没有实现MSA,这个位是由硬件设置的只读位;Config5 (CP0 Register 16, Select 5) 的Bit27是MSA使能位,这个位是可读写的,如果将此位置1,则启用MSA,置0,则关闭MSA。
为此编写下列程序,对龙芯派上的2K1000B CPU进行检测,看看它是否支持MSA,是否启用了MSA,源程序msa.c内容如下:
- #include <linux/init.h>
- #include <linux/module.h>
- MODULE_LICENSE("GPL");
- static int msa_init(void)
- {
- int msap;
- int msaen;
- asm (
- "mfc0 %[result1], $16, 3\n\t"
- "mfc0 %[result2], $16, 5\n\t"
- : [result1] "=r" (msap), [result2] "=r" (msaen)
- );
- printk(KERN_ALERT "msap=0x%X msaen=0x%X\n", msap, msaen);
- return 0;
- }
- static void msa_exit(void)
- {
- printk(KERN_ALERT "msa exit\n");
- }
- module_init(msa_init);
- module_exit(msa_exit);
复制代码
Makefile 内容如下:
- MODDIR ?= /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- obj-m += msa.o
- modules:
- $(MAKE) -C $(MODDIR) M=$(PWD) modules
- clean:
- rm -rf *.o *.ko *.cmd *.mod.* Module.symvers modules.order
- .PHONY: modules
复制代码 执行结果如下:
- [brep@LoongsonPi]$ make
- [brep@LoongsonPi]$ sudo insmod msa.ko
- [brep@LoongsonPi]$ sudo rmmod msa.ko
- [brep@LoongsonPi]$ sudo dmesg | tail -n2
- [ 8958.777343] msap=0xD00030A0 msaen=0x0
- [ 8968.417968] msa exit
- [brep@LoongsonPi]$
复制代码 由执行结果可知,MSA存在位为1,因此龙芯派的2K1000B实现了MSA,而MSA使能位为0,因此默认情况下,2K1000B的MSA并未启用。
|
|