brep 发表于 2018-6-12 21:51:41

检测龙芯 2K1000B 对 MIPS SIMD 的支持

本帖最后由 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 %, $16, 3\n\t"
                "mfc0 %, $16, 5\n\t"
                : "=r" (msap), "=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
执行结果如下:
$ make
$ sudo insmod msa.ko
$ sudo rmmod msa.ko
$ sudo dmesg | tail -n2
[ 8958.777343] msap=0xD00030A0 msaen=0x0
[ 8968.417968] msa exit
$由执行结果可知,MSA存在位为1,因此龙芯派的2K1000B实现了MSA,而MSA使能位为0,因此默认情况下,2K1000B的MSA并未启用。







sn2015ol 发表于 2018-6-13 16:18:29

页: [1]
查看完整版本: 检测龙芯 2K1000B 对 MIPS SIMD 的支持