MIPS: tlbex: Fix broken offsets on r2 without XPA
Commitc5b367835c
("MIPS: Add support for XPA.") changed build_pte_present() and build_pte_writable() to assume a constant offset of _PAGE_READ and _PAGE_WRITE relative to _PAGE_PRESENT, however this is no longer true for some MIPS32R2 builds since commitbe0c37c985
("MIPS: Rearrange PTE bits into fixed positions.") which moved the _PAGE_READ PTE bit away from the _PAGE_PRESENT bit, with the _PAGE_WRITE bit falling into its place. Make use of the _PAGE_READ and _PAGE_WRITE definitions to calculate the correct mask to apply instead of hard coding 3 (for _PAGE_PRESENT | _PAGE_READ) or 5 (for _PAGE_PRESENT | _PAGE_WRITE). Fixes:c5b367835c
("MIPS: Add support for XPA.") Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Steven J. Hill <Steven.Hill@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/9888/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
8e748c8d09
commit
a3ae565a13
1 changed files with 8 additions and 4 deletions
|
@ -1623,8 +1623,10 @@ build_pte_present(u32 **p, struct uasm_reloc **r,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
|
uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
|
||||||
uasm_i_andi(p, t, t, 3);
|
uasm_i_andi(p, t, t,
|
||||||
uasm_i_xori(p, t, t, 3);
|
(_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
|
||||||
|
uasm_i_xori(p, t, t,
|
||||||
|
(_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
|
||||||
uasm_il_bnez(p, r, t, lid);
|
uasm_il_bnez(p, r, t, lid);
|
||||||
if (pte == t)
|
if (pte == t)
|
||||||
/* You lose the SMP race :-(*/
|
/* You lose the SMP race :-(*/
|
||||||
|
@ -1654,8 +1656,10 @@ build_pte_writable(u32 **p, struct uasm_reloc **r,
|
||||||
int t = scratch >= 0 ? scratch : pte;
|
int t = scratch >= 0 ? scratch : pte;
|
||||||
|
|
||||||
uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
|
uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
|
||||||
uasm_i_andi(p, t, t, 5);
|
uasm_i_andi(p, t, t,
|
||||||
uasm_i_xori(p, t, t, 5);
|
(_PAGE_PRESENT | _PAGE_WRITE) >> _PAGE_PRESENT_SHIFT);
|
||||||
|
uasm_i_xori(p, t, t,
|
||||||
|
(_PAGE_PRESENT | _PAGE_WRITE) >> _PAGE_PRESENT_SHIFT);
|
||||||
uasm_il_bnez(p, r, t, lid);
|
uasm_il_bnez(p, r, t, lid);
|
||||||
if (pte == t)
|
if (pte == t)
|
||||||
/* You lose the SMP race :-(*/
|
/* You lose the SMP race :-(*/
|
||||||
|
|
Loading…
Reference in a new issue