OpenRISC fixes for 4.18
Two fixes here which were breaking OpenRISC boot.
- Fix bug in __pte_free_tlb() exposed in 4.18 by Matthew Wilcox's page
table flag addition.
- Fix issue booting on real hardware if delay slot detection emulation
is disabled.
-----BEGIN PGP SIGNATURE-----
iQIcBAABAgAGBQJbOjFIAAoJEMOzHC1eZifkvesP/1WPmI9M6g57kkky7uU5MJi6
cdarrEJbk3KrGFQCJeDkYB3rNQ+NuGebNfbe1AJZabot8raCvU6eGcsvkOVMM4ik
v3iN7Dp4NstKJJ3nr1uAihhJpJdIrVH6caJd21Do23SZGrjUUaa621g72nUCxZT1
u1i4M9YLrUazMtIWhOBL4nkSmVmxL2Qc1fywg/ahDfeUSkqoY3su98HG/sc4t7Yx
j1Bg+ugJyXR87G6mo+wlXF9Y+lXCycSVQC8TEdD0ku9qQzGKsb9ER/wJUSFLcQbP
lrny+rYW79VEbht69NavXTyGV+k+F5+Jr9+w6XN36me3NbmgrBPucpmLj6iGMRDf
xJ0+rS+4/ECy6rGDc3Q3p6SaL/YfJeib0XxmrH5ACg7B4k0Iczk5nuL6sbPcEDLw
a7dOWlLH6DLxmeDF68ExQNi//R+wLe/MRxmOHAoBbyIAXbq+2cvGqp8Jk1V8JQP3
hgQA9BLFb72o7djepJ0MOynXE6nQbWoTIUDQqoy4sLwqCUT40JnRjC4/ji9OcFBe
Ma3CrTTu0RA3U0e984mP025f6MQrLIyhU0AdA+iadnrarC+FIpe/4bzhYfL1OAfy
chsOKAvQnzD9y3b01gbql1x6JV6ro91YGwtP0vdfjiyahQBICIzrglxoZ6byY6AQ
RrwXPgBn8BFEaxAzUBGj
=7uxj
-----END PGP SIGNATURE-----
Merge tag 'for-linus' of git://github.com/stffrdhrn/linux
Pull OpenRISC fixes from Stafford Horne:
"Two fixes for issues which were breaking OpenRISC boot:
- Fix bug in __pte_free_tlb() exposed in 4.18 by Matthew Wilcox's
page table flag addition.
- Fix issue booting on real hardware if delay slot detection
emulation is disabled"
* tag 'for-linus' of git://github.com/stffrdhrn/linux:
openrisc: entry: Fix delay slot exception detection
openrisc: Call destructor during __pte_free_tlb
This commit is contained in:
commit
8d2b6f6b4a
@ -98,8 +98,12 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte)
|
||||
__free_page(pte);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb, pte, addr) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb), (pte)); \
|
||||
} while (0)
|
||||
|
||||
#define __pte_free_tlb(tlb, pte, addr) tlb_remove_page((tlb), (pte))
|
||||
#define pmd_pgtable(pmd) pmd_page(pmd)
|
||||
|
||||
#define check_pgt_cache() do { } while (0)
|
||||
|
||||
@ -277,12 +277,6 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
|
||||
l.addi r3,r1,0 // pt_regs
|
||||
/* r4 set be EXCEPTION_HANDLE */ // effective address of fault
|
||||
|
||||
/*
|
||||
* __PHX__: TODO
|
||||
*
|
||||
* all this can be written much simpler. look at
|
||||
* DTLB miss handler in the CONFIG_GUARD_PROTECTED_CORE part
|
||||
*/
|
||||
#ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX
|
||||
l.lwz r6,PT_PC(r3) // address of an offending insn
|
||||
l.lwz r6,0(r6) // instruction that caused pf
|
||||
@ -314,7 +308,7 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
|
||||
|
||||
#else
|
||||
|
||||
l.lwz r6,PT_SR(r3) // SR
|
||||
l.mfspr r6,r0,SPR_SR // SR
|
||||
l.andi r6,r6,SPR_SR_DSX // check for delay slot exception
|
||||
l.sfne r6,r0 // exception happened in delay slot
|
||||
l.bnf 7f
|
||||
|
||||
@ -210,8 +210,7 @@
|
||||
* r4 - EEAR exception EA
|
||||
* r10 - current pointing to current_thread_info struct
|
||||
* r12 - syscall 0, since we didn't come from syscall
|
||||
* r13 - temp it actually contains new SR, not needed anymore
|
||||
* r31 - handler address of the handler we'll jump to
|
||||
* r30 - handler address of the handler we'll jump to
|
||||
*
|
||||
* handler has to save remaining registers to the exception
|
||||
* ksp frame *before* tainting them!
|
||||
@ -244,6 +243,7 @@
|
||||
/* r1 is KSP, r30 is __pa(KSP) */ ;\
|
||||
tophys (r30,r1) ;\
|
||||
l.sw PT_GPR12(r30),r12 ;\
|
||||
/* r4 use for tmp before EA */ ;\
|
||||
l.mfspr r12,r0,SPR_EPCR_BASE ;\
|
||||
l.sw PT_PC(r30),r12 ;\
|
||||
l.mfspr r12,r0,SPR_ESR_BASE ;\
|
||||
@ -263,7 +263,10 @@
|
||||
/* r12 == 1 if we come from syscall */ ;\
|
||||
CLEAR_GPR(r12) ;\
|
||||
/* ----- turn on MMU ----- */ ;\
|
||||
l.ori r30,r0,(EXCEPTION_SR) ;\
|
||||
/* Carry DSX into exception SR */ ;\
|
||||
l.mfspr r30,r0,SPR_SR ;\
|
||||
l.andi r30,r30,SPR_SR_DSX ;\
|
||||
l.ori r30,r30,(EXCEPTION_SR) ;\
|
||||
l.mtspr r0,r30,SPR_ESR_BASE ;\
|
||||
/* r30: EA address of handler */ ;\
|
||||
LOAD_SYMBOL_2_GPR(r30,handler) ;\
|
||||
|
||||
@ -300,7 +300,7 @@ static inline int in_delay_slot(struct pt_regs *regs)
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
return regs->sr & SPR_SR_DSX;
|
||||
return mfspr(SPR_SR) & SPR_SR_DSX;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user