From: Pete P. <pp...@us...> - 2001-10-31 06:16:27
|
Update of /cvsroot/linux-mips/linux/arch/mips/mm In directory usw-pr-cvs1:/tmp/cvs-serv20100/arch/mips/mm Modified Files: tlbex-r4k.S Log Message: Sync up with oss tree: * explicitly set polarity of all interrupts * added pci_auto config option * updated defconfig file * moved the au1000 specific tlb handler to tlbex-r4k.S * updated au1000.h with IrDA registers Index: tlbex-r4k.S =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/mm/tlbex-r4k.S,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- tlbex-r4k.S 2001/10/22 20:43:28 1.1 +++ tlbex-r4k.S 2001/10/31 06:16:24 1.2 @@ -259,6 +259,29 @@ END(except_vec0_r4k_MP250MHZhwbug) #endif +#ifdef CONFIG_MIPS_AU1000 + /* TLB refill, EXL == 0, Au1000 version */ + /* we'll worry about smp later */ + .set noreorder + .set noat + LEAF(except_vec0_au1000) + .set mips3 + mfc0 k0, CP0_BADVADDR # Get faulting address + srl k0, k0, 22 # get pgd only bits + lw k1, pgd_current # get pgd pointer + sll k0, k0, 2 + addu k1, k1, k0 # add in pgd offset + mfc0 k0, CP0_CONTEXT # get context reg + lw k1, (k1) + srl k0, k0, 1 # get pte offset + and k0, k0, 0xff8 + addu k1, k1, k0 # add in offset + j translate_pte + nop + END(except_vec0_au1000) +#endif + + __FINIT /* @@ -467,3 +490,132 @@ nowrite_mod: DO_FAULT(1) END(handle_mod) + +#ifdef CONFIG_MIPS_AU1000 +/* + * On entry k0 contains the pte with the pseudo address. + * On exit, k0 contains the "real" address, which is a + * 36 bit physicall address. + * This function is called only after it has been + * determined that the pte is a pseudo physical address. + * + * Destroys k0, k1, and at. It's assumed that the calling + * function will preserve those. + */ +LEAF(get_real_pte) + .set mips3 + + li k1, 0xe0000000 # check lcd + bltu k0, k1, check_pcmcia_socket_1 + nop + # lcd pseudo access + li k1, 0x0fffffff + and k0, k0, k1 # get offset + srl k0, k0, 6 + lui k1, 0xe000>>2 + or k0, k0, k1 + j ra + nop +check_pcmcia_socket_1: + li k1, 0xD0000000 + bltu k0, k1, pcmcia_socket_0 + nop + # famous last words, should not happen ... +1: + b 1b # fixme -- to something a little more useful + # pcmcia socket 1 pseudo access + +pcmcia_socket_0: + # check mem access + li k1, 0xC8000000 + bltu k0, k1, check_attr + # handle pseudo memory access + li k1, 0x00ffffff + and k1, k0, k1 # get access offset + lui k0, 0x8000 + or k0, k0, k1 + # now we have the correct even pte ... bits 31:0 + srl k0, k0, 6 + lui k1, 0xf000>>2 + or k0, k0, k1 + j ra # done + nop +check_attr: + li k1, 0xC4000000 + bltu k0, k1, io_access + # handle pseudo attribute access + li k1, 0x00ffffff + and k1, k0, k1 # get access offset + lui k0, 0x4000 + or k0, k0, k1 + # now we have the correct even pte ... bits 31:0 + srl k0, k0, 6 + lui k1, 0xf000>>2 + or k0, k0, k1 + j ra # done + nop +io_access: + # handle pseudo io access + li k1, 0x00ffffff + and k0, k0, k1 # get access offset + # now we have the correct even pte ... bits 31:0 + srl k0, k0, 6 + lui k1, 0xf000>>2 + or k0, k0, k1 + j ra # done + nop +END(get_real_pte) + +/* + * On entry k1 contains pte pointer. Clobbers only k0 and k1. + */ + LEAF(translate_pte) + .set mips3 + lui k0, %hi(__saved_at) + sw $at, %lo(__saved_at)(k0) # save at + sw k1, %lo(__saved_pte)(k0) # save pte pointer + sw ra, %lo(__saved_ra)(k0) # save ra + lw k0, 0(k1) # get even pte + + li k1, 0xC0000000 # check pseudo addr + bltu k0, k1, 1f + nop + bal get_real_pte + nop + b 2f + nop +1: + srl k0, k0, 6 +2: + mtc0 k0, CP0_ENTRYLO0 # load it + + lui k1, %hi(__saved_pte) + lw k1, %lo(__saved_pte)(k1) # recover pte pointer + lw k0, 4(k1) # get odd pte + + li k1, 0xC0000000 # check pseudo addr + bltu k0, k1, 1f + nop + bal get_real_pte + nop + b 2f + nop + +1: + srl k0, k0, 6 # convert to entrylo0 +2: + mtc0 k0, CP0_ENTRYLO1 # load it + nop + b 1f + tlbwr # write random tlb entry +1: + lui k0, %hi(__saved_at) + lw $at, %lo(__saved_at)(k0) # restore at + lw ra, %lo(__saved_ra)(k0) # restore ra + eret # return from trap + END(translate_pte) + +__saved_at: PTR 0 +__saved_pte: PTR 0 +__saved_ra: PTR 0 +#endif |