In the device driver, I wanted to read the first data pointed to by the ttbr0_el1 register (translation table base register for EL1) like below. But referencing the the pointer causes trap(data access abort). What is wrong?
static inline uint64_t system_read_TTBR0_EL1(void)
{
uint64_t val;
asm volatile("mrs %0, ttbr0_el1" : "=r" (val));
return val;
}
static inline uint64_t system_read_TTBR1_EL1(void)
{
uint64_t val;
asm volatile("mrs %0, ttbr1_el1" : "=r" (val));
return val;
}
ttbr0_el1 = system_read_TTBR0_EL1();
ttbr1_el1 = system_read_TTBR1_EL1();
printk("ttbr0 = %llx\n", ttbr0_el1);
printk("ttbr1 = %llx\n", ttbr1_el1);
printk("*ttbr1 = %llx\n", *(uint64_t *)ttbr1_el1);
printk("*ttbr0 = %llx\n", *(uint64_t *)ttbr0_el1);
output
[100450.356279] ttbr0 = 27f0000042dd7001
[100450.356595] ttbr1 = 27f00000414ab001
[100450.357015] Unable to handle kernel paging request at virtual address 27f00000414ab001
[100450.357564] Mem abort info:
[100450.357803] ESR = 0x96000004
[100450.358116] EC = 0x25: DABT (current EL), IL = 32 bits
[100450.358535] SET = 0, FnV = 0
[100450.359256] EA = 0, S1PTW = 0
[100450.359537] Data abort info:
[100450.359785] ISV = 0, ISS = 0x00000004
[100450.360101] CM = 0, WnR = 0
[100450.360449] [27f00000414ab001] address between user and kernel address ranges
[100450.360986] Internal error: Oops: 96000004 [#22] SMP