@@ -691,22 +691,28 @@ extern void dcache_disable(void);
691691#else
692692/* Assembly version */
693693#ifdef CORE_E6500
694- /* e6500 has 64-bit MAS registers - must clear upper 32 bits */
694+ /* e6500 has 64-bit MAS registers - must clear upper 32 bits.
695+ * Using lis would sign-extend values with bit 15 set (e.g., 0xC000xxxx).
696+ * Use li 0; oris; ori pattern for all MAS registers. */
695697#define set_tlb (tlb , esel , epn , rpn , urpn , perms , winge , ts , tsize , iprot , reg ) \
696- lis reg, BOOKE_MAS0(tlb, esel, 0)@h; \
698+ li reg, 0; \
699+ oris reg, reg, BOOKE_MAS0(tlb, esel, 0)@h; \
697700 ori reg, reg, BOOKE_MAS0(tlb, esel, 0)@l; \
698701 mtspr MAS0, reg;\
699- lis reg, BOOKE_MAS1(1, iprot, 0, ts, tsize)@h; \
702+ li reg, 0; \
703+ oris reg, reg, BOOKE_MAS1(1, iprot, 0, ts, tsize)@h; \
700704 ori reg, reg, BOOKE_MAS1(1, iprot, 0, ts, tsize)@l; \
701705 mtspr MAS1, reg; \
702706 li reg, 0; \
703707 oris reg, reg, BOOKE_MAS2(epn, winge)@h; \
704708 ori reg, reg, BOOKE_MAS2(epn, winge)@l; \
705709 mtspr MAS2, reg; \
706- lis reg, BOOKE_MAS3(rpn, 0, perms)@h; \
710+ li reg, 0; \
711+ oris reg, reg, BOOKE_MAS3(rpn, 0, perms)@h; \
707712 ori reg, reg, BOOKE_MAS3(rpn, 0, perms)@l; \
708713 mtspr MAS3, reg; \
709- lis reg, urpn@h; \
714+ li reg, 0; \
715+ oris reg, reg, urpn@h; \
710716 ori reg, reg, urpn@l; \
711717 mtspr MAS7, reg; \
712718 isync; \
0 commit comments