Your code should work fine (though you need to remove volatile
from printk
lines, and ASM command should be asm volatile
, not the other way around). Try to check next things:
- QEMU version. I'm using 2.12 and your code works. So if you're using older version, try 2.12 too.
- Emulated machine and cpu. Not sure if it affects CP registers, but I'm using "virt" machine with no CPU specified, you can try this configuration too.
- If this doesn't help, check more details about my configuration below.
My configuration
I'm using next command to run QEMU:
$ qemu-system-arm -kernel $zimage -initrd $rootfs \
-machine virt -nographic -m 512 \
--append "root=/dev/ram0 rw console=ttyAMA0,115200 mem=512M"
where:
$zimage
is path to zImage
file (my kernel is linux-mainline on tag v4.18
, built with multi_v7_defconfig
configuration)
$rootfs
is path to CPIO archive with minimal BusyBox rootfs
My kernel module code is next:
#include <linux/module.h>
static int __init mrc_init(void)
{
u32 acr;
/*
* Read Coprocessor Access Control Register.
* See Cortex-A9 TRM for details.
*/
asm volatile ("mrc p15, 0, %0, c1, c0, 2\n" : "=r" (acr));
pr_info("ACR = 0x%x\n", acr);
return 0;
}
static void __exit mrc_exit(void)
{
}
module_init(mrc_init);
module_exit(mrc_exit);
MODULE_AUTHOR("Sam Protsenko");
MODULE_DESCRIPTION("Test MRC on QEMU");
MODULE_LICENSE("GPL");
After loading this module I can see next output in dmesg
:
ACR = 0xf00000