sh: Tidy up NEFF-based sign extension for SH-5.
This consolidates all of the NEFF-based sign extension for SH-5. In the future the other SH code will need to make use of this as well, so make it generic in preparation for more 32/64 consolidation. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Цей коміт міститься в:
@@ -56,16 +56,7 @@ inline void __do_tlb_refill(unsigned long address,
|
||||
/*
|
||||
* Set PTEH register
|
||||
*/
|
||||
pteh = address & MMU_VPN_MASK;
|
||||
|
||||
/* Sign extend based on neff. */
|
||||
#if (NEFF == 32)
|
||||
/* Faster sign extension */
|
||||
pteh = (unsigned long long)(signed long long)(signed long)pteh;
|
||||
#else
|
||||
/* General case */
|
||||
pteh = (pteh & NEFF_SIGN) ? (pteh | NEFF_MASK) : pteh;
|
||||
#endif
|
||||
pteh = neff_sign_extend(address & MMU_VPN_MASK);
|
||||
|
||||
/* Set the ASID. */
|
||||
pteh |= get_asid() << PTEH_ASID_SHIFT;
|
||||
|
@@ -117,26 +117,15 @@ int sh64_put_wired_dtlb_entry(unsigned long long entry)
|
||||
* Load up a virtual<->physical translation for @eaddr<->@paddr in the
|
||||
* pre-allocated TLB slot @config_addr (see sh64_get_wired_dtlb_entry).
|
||||
*/
|
||||
inline void sh64_setup_tlb_slot(unsigned long long config_addr,
|
||||
unsigned long eaddr,
|
||||
unsigned long asid,
|
||||
unsigned long paddr)
|
||||
void sh64_setup_tlb_slot(unsigned long long config_addr, unsigned long eaddr,
|
||||
unsigned long asid, unsigned long paddr)
|
||||
{
|
||||
unsigned long long pteh, ptel;
|
||||
|
||||
/* Sign extension */
|
||||
#if (NEFF == 32)
|
||||
pteh = (unsigned long long)(signed long long)(signed long) eaddr;
|
||||
#else
|
||||
#error "Can't sign extend more than 32 bits yet"
|
||||
#endif
|
||||
pteh = neff_sign_extend(eaddr);
|
||||
pteh &= PAGE_MASK;
|
||||
pteh |= (asid << PTEH_ASID_SHIFT) | PTEH_VALID;
|
||||
#if (NEFF == 32)
|
||||
ptel = (unsigned long long)(signed long long)(signed long) paddr;
|
||||
#else
|
||||
#error "Can't sign extend more than 32 bits yet"
|
||||
#endif
|
||||
ptel = neff_sign_extend(paddr);
|
||||
ptel &= PAGE_MASK;
|
||||
ptel |= (_PAGE_CACHABLE | _PAGE_READ | _PAGE_WRITE);
|
||||
|
||||
@@ -152,5 +141,5 @@ inline void sh64_setup_tlb_slot(unsigned long long config_addr,
|
||||
*
|
||||
* Teardown any existing mapping in the TLB slot @config_addr.
|
||||
*/
|
||||
inline void sh64_teardown_tlb_slot(unsigned long long config_addr)
|
||||
void sh64_teardown_tlb_slot(unsigned long long config_addr)
|
||||
__attribute__ ((alias("__flush_tlb_slot")));
|
||||
|
@@ -337,7 +337,7 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)
|
||||
/*
|
||||
* Sign-extend based on neff.
|
||||
*/
|
||||
lpage = (page & NEFF_SIGN) ? (page | NEFF_MASK) : page;
|
||||
lpage = neff_sign_extend(page);
|
||||
match = (asid << PTEH_ASID_SHIFT) | PTEH_VALID;
|
||||
match |= lpage;
|
||||
|
||||
|
Посилання в новій задачі
Заблокувати користувача