|
@@ -116,13 +116,25 @@ extern void cpu_resume(void);
|
|
|
#define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm)
|
|
|
|
|
|
#ifdef CONFIG_ARM_LPAE
|
|
|
+
|
|
|
+#define cpu_get_ttbr(nr) \
|
|
|
+ ({ \
|
|
|
+ u64 ttbr; \
|
|
|
+ __asm__("mrrc p15, " #nr ", %Q0, %R0, c2" \
|
|
|
+ : "=r" (ttbr)); \
|
|
|
+ ttbr; \
|
|
|
+ })
|
|
|
+
|
|
|
+#define cpu_set_ttbr(nr, val) \
|
|
|
+ do { \
|
|
|
+ u64 ttbr = val; \
|
|
|
+ __asm__("mcrr p15, " #nr ", %Q0, %R0, c2" \
|
|
|
+ : : "r" (ttbr)); \
|
|
|
+ } while (0)
|
|
|
+
|
|
|
#define cpu_get_pgd() \
|
|
|
({ \
|
|
|
- unsigned long pg, pg2; \
|
|
|
- __asm__("mrrc p15, 0, %0, %1, c2" \
|
|
|
- : "=r" (pg), "=r" (pg2) \
|
|
|
- : \
|
|
|
- : "cc"); \
|
|
|
+ u64 pg = cpu_get_ttbr(0); \
|
|
|
pg &= ~(PTRS_PER_PGD*sizeof(pgd_t)-1); \
|
|
|
(pgd_t *)phys_to_virt(pg); \
|
|
|
})
|