Commit a3ae565a authored by James Hogan's avatar James Hogan Committed by Ralf Baechle

MIPS: tlbex: Fix broken offsets on r2 without XPA

Commit c5b36783 ("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 commit be0c37c9
("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: c5b36783 ("MIPS: Add support for XPA.")
Signed-off-by: default avatarJames 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: default avatarRalf Baechle <ralf@linux-mips.org>
parent 8e748c8d
...@@ -1623,8 +1623,10 @@ build_pte_present(u32 **p, struct uasm_reloc **r, ...@@ -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, ...@@ -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 :-(*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment