提交 13f659b0 编写于 作者: C Cyril Chemparathy 提交者: Will Deacon

ARM: LPAE: use phys_addr_t in switch_mm()

This patch modifies the switch_mm() processor functions to use phys_addr_t.
On LPAE systems, we now honor the upper 32-bits of the physical address that
is being passed in, and program these into TTBR as expected.
Signed-off-by: NCyril Chemparathy <cyril@ti.com>
Signed-off-by: NVitaly Andrianov <vitalya@ti.com>
Reviewed-by: NNicolas Pitre <nico@linaro.org>
Tested-by: NSantosh Shilimkar <santosh.shilimkar@ti.com>
Tested-by: NSubash Patel <subash.rp@samsung.com>
[will: fixed up conflict in 3-level switch_mm with big-endian changes]
Signed-off-by: NWill Deacon <will.deacon@arm.com>
上级 de22cc6e
...@@ -60,7 +60,7 @@ extern struct processor { ...@@ -60,7 +60,7 @@ extern struct processor {
/* /*
* Set the page table * Set the page table
*/ */
void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm); void (*switch_mm)(phys_addr_t pgd_phys, struct mm_struct *mm);
/* /*
* Set a possibly extended PTE. Non-extended PTEs should * Set a possibly extended PTE. Non-extended PTEs should
* ignore 'ext'. * ignore 'ext'.
...@@ -82,7 +82,7 @@ extern void cpu_proc_init(void); ...@@ -82,7 +82,7 @@ extern void cpu_proc_init(void);
extern void cpu_proc_fin(void); extern void cpu_proc_fin(void);
extern int cpu_do_idle(void); extern int cpu_do_idle(void);
extern void cpu_dcache_clean_area(void *, int); extern void cpu_dcache_clean_area(void *, int);
extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); extern void cpu_do_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm);
#ifdef CONFIG_ARM_LPAE #ifdef CONFIG_ARM_LPAE
extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte); extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte);
#else #else
......
...@@ -39,6 +39,14 @@ ...@@ -39,6 +39,14 @@
#define TTB_FLAGS_SMP (TTB_IRGN_WBWA|TTB_S|TTB_RGN_OC_WBWA) #define TTB_FLAGS_SMP (TTB_IRGN_WBWA|TTB_S|TTB_RGN_OC_WBWA)
#define PMD_FLAGS_SMP (PMD_SECT_WBWA|PMD_SECT_S) #define PMD_FLAGS_SMP (PMD_SECT_WBWA|PMD_SECT_S)
#ifndef __ARMEB__
# define rpgdl r0
# define rpgdh r1
#else
# define rpgdl r1
# define rpgdh r0
#endif
/* /*
* cpu_v7_switch_mm(pgd_phys, tsk) * cpu_v7_switch_mm(pgd_phys, tsk)
* *
...@@ -47,10 +55,10 @@ ...@@ -47,10 +55,10 @@
*/ */
ENTRY(cpu_v7_switch_mm) ENTRY(cpu_v7_switch_mm)
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
mmid r1, r1 @ get mm->context.id mmid r2, r2
asid r3, r1 asid r2, r2
mov r3, r3, lsl #(48 - 32) @ ASID orr rpgdh, rpgdh, r2, lsl #(48 - 32) @ upper 32-bits of pgd
mcrr p15, 0, r0, r3, c2 @ set TTB 0 mcrr p15, 0, rpgdl, rpgdh, c2 @ set TTB 0
isb isb
#endif #endif
mov pc, lr mov pc, lr
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册