mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 17:54:13 +08:00
MIPS: tlbex: Avoid unnecessary _PAGE_PRESENT shifts
Commitc5b367835c
("MIPS: Add support for XPA.") added generation of a shift by _PAGE_PRESENT_SHIFT in build_pte_present() and build_pte_writable(), however except for the XPA case this is always zero making it unnecessary. Make the shift conditional upon _PAGE_PRESENT_SHIFT being non-zero to save an instruction in those cases. 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/9889/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
a3ae565a13
commit
8fe4908b83
@ -1608,22 +1608,29 @@ build_pte_present(u32 **p, struct uasm_reloc **r,
|
||||
int pte, int ptr, int scratch, enum label_id lid)
|
||||
{
|
||||
int t = scratch >= 0 ? scratch : pte;
|
||||
int cur = pte;
|
||||
|
||||
if (cpu_has_rixi) {
|
||||
if (use_bbit_insns()) {
|
||||
uasm_il_bbit0(p, r, pte, ilog2(_PAGE_PRESENT), lid);
|
||||
uasm_i_nop(p);
|
||||
} else {
|
||||
uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
|
||||
uasm_i_andi(p, t, t, 1);
|
||||
if (_PAGE_PRESENT_SHIFT) {
|
||||
uasm_i_srl(p, t, cur, _PAGE_PRESENT_SHIFT);
|
||||
cur = t;
|
||||
}
|
||||
uasm_i_andi(p, t, cur, 1);
|
||||
uasm_il_beqz(p, r, t, lid);
|
||||
if (pte == t)
|
||||
/* You lose the SMP race :-(*/
|
||||
iPTE_LW(p, pte, ptr);
|
||||
}
|
||||
} else {
|
||||
uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
|
||||
uasm_i_andi(p, t, t,
|
||||
if (_PAGE_PRESENT_SHIFT) {
|
||||
uasm_i_srl(p, t, cur, _PAGE_PRESENT_SHIFT);
|
||||
cur = t;
|
||||
}
|
||||
uasm_i_andi(p, t, cur,
|
||||
(_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
|
||||
uasm_i_xori(p, t, t,
|
||||
(_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
|
||||
@ -1654,9 +1661,13 @@ build_pte_writable(u32 **p, struct uasm_reloc **r,
|
||||
enum label_id lid)
|
||||
{
|
||||
int t = scratch >= 0 ? scratch : pte;
|
||||
int cur = pte;
|
||||
|
||||
uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
|
||||
uasm_i_andi(p, t, t,
|
||||
if (_PAGE_PRESENT_SHIFT) {
|
||||
uasm_i_srl(p, t, cur, _PAGE_PRESENT_SHIFT);
|
||||
cur = t;
|
||||
}
|
||||
uasm_i_andi(p, t, cur,
|
||||
(_PAGE_PRESENT | _PAGE_WRITE) >> _PAGE_PRESENT_SHIFT);
|
||||
uasm_i_xori(p, t, t,
|
||||
(_PAGE_PRESENT | _PAGE_WRITE) >> _PAGE_PRESENT_SHIFT);
|
||||
|
Loading…
Reference in New Issue
Block a user