From: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
To: linux-kernel@vger.kernel.org, linux@openrisc.net
Cc: jonas@southpole.se
Subject: Re: [PATCH] openrisc: tlb miss handler optimizations
Date: Fri, 6 Dec 2013 12:28:29 +0200 [thread overview]
Message-ID: <20131206102828.GA1369@chokladfabriken.org> (raw)
In-Reply-To: <1375343170-17848-1-git-send-email-stefan.kristiansson@saunalahti.fi>
Hi Jonas,
I realised that this haven't been picked up nor commented on (and that I missed
CC you on it).
Could you take a look at it?
Stefan
On Thu, Aug 01, 2013 at 10:46:10AM +0300, Stefan Kristiansson wrote:
> By slightly reorganizing the code, the number of registers
> used in the tlb miss handlers can be reduced by two,
> thus removing the need to save them to memory.
>
> Also, some dead and commented out code is removed.
>
> No functional change.
>
> Signed-off-by: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
> ---
> arch/openrisc/kernel/head.S | 141 +++++++++++++++-----------------------------
> 1 file changed, 46 insertions(+), 95 deletions(-)
>
> diff --git a/arch/openrisc/kernel/head.S b/arch/openrisc/kernel/head.S
> index 1d3c9c2..eecc8df 100644
> --- a/arch/openrisc/kernel/head.S
> +++ b/arch/openrisc/kernel/head.S
> @@ -976,8 +976,6 @@ ENTRY(dtlb_miss_handler)
> EXCEPTION_STORE_GPR2
> EXCEPTION_STORE_GPR3
> EXCEPTION_STORE_GPR4
> - EXCEPTION_STORE_GPR5
> - EXCEPTION_STORE_GPR6
> /*
> * get EA of the miss
> */
> @@ -985,91 +983,70 @@ ENTRY(dtlb_miss_handler)
> /*
> * pmd = (pmd_t *)(current_pgd + pgd_index(daddr));
> */
> - GET_CURRENT_PGD(r3,r5) // r3 is current_pgd, r5 is temp
> + GET_CURRENT_PGD(r3,r4) // r3 is current_pgd, r4 is temp
> l.srli r4,r2,0x18 // >> PAGE_SHIFT + (PAGE_SHIFT - 2)
> l.slli r4,r4,0x2 // to get address << 2
> - l.add r5,r4,r3 // r4 is pgd_index(daddr)
> + l.add r3,r4,r3 // r4 is pgd_index(daddr)
> /*
> * if (pmd_none(*pmd))
> * goto pmd_none:
> */
> - tophys (r4,r5)
> + tophys (r4,r3)
> l.lwz r3,0x0(r4) // get *pmd value
> l.sfne r3,r0
> l.bnf d_pmd_none
> - l.andi r3,r3,~PAGE_MASK //0x1fff // ~PAGE_MASK
> - /*
> - * if (pmd_bad(*pmd))
> - * pmd_clear(pmd)
> - * goto pmd_bad:
> - */
> -// l.sfeq r3,r0 // check *pmd value
> -// l.bf d_pmd_good
> - l.addi r3,r0,0xffffe000 // PAGE_MASK
> -// l.j d_pmd_bad
> -// l.sw 0x0(r4),r0 // clear pmd
> + l.addi r3,r0,0xffffe000 // PAGE_MASK
> +
> d_pmd_good:
> /*
> * pte = *pte_offset(pmd, daddr);
> */
> l.lwz r4,0x0(r4) // get **pmd value
> l.and r4,r4,r3 // & PAGE_MASK
> - l.srli r5,r2,0xd // >> PAGE_SHIFT, r2 == EEAR
> - l.andi r3,r5,0x7ff // (1UL << PAGE_SHIFT - 2) - 1
> + l.srli r2,r2,0xd // >> PAGE_SHIFT, r2 == EEAR
> + l.andi r3,r2,0x7ff // (1UL << PAGE_SHIFT - 2) - 1
> l.slli r3,r3,0x2 // to get address << 2
> l.add r3,r3,r4
> - l.lwz r2,0x0(r3) // this is pte at last
> + l.lwz r3,0x0(r3) // this is pte at last
> /*
> * if (!pte_present(pte))
> */
> - l.andi r4,r2,0x1
> + l.andi r4,r3,0x1
> l.sfne r4,r0 // is pte present
> l.bnf d_pte_not_present
> - l.addi r3,r0,0xffffe3fa // PAGE_MASK | DTLB_UP_CONVERT_MASK
> + l.addi r4,r0,0xffffe3fa // PAGE_MASK | DTLB_UP_CONVERT_MASK
> /*
> * fill DTLB TR register
> */
> - l.and r4,r2,r3 // apply the mask
> + l.and r4,r3,r4 // apply the mask
> // Determine number of DMMU sets
> - l.mfspr r6, r0, SPR_DMMUCFGR
> - l.andi r6, r6, SPR_DMMUCFGR_NTS
> - l.srli r6, r6, SPR_DMMUCFGR_NTS_OFF
> + l.mfspr r2, r0, SPR_DMMUCFGR
> + l.andi r2, r2, SPR_DMMUCFGR_NTS
> + l.srli r2, r2, SPR_DMMUCFGR_NTS_OFF
> l.ori r3, r0, 0x1
> - l.sll r3, r3, r6 // r3 = number DMMU sets DMMUCFGR
> - l.addi r6, r3, -1 // r6 = nsets mask
> - l.and r5, r5, r6 // calc offset: & (NUM_TLB_ENTRIES-1)
> + l.sll r3, r3, r2 // r3 = number DMMU sets DMMUCFGR
> + l.addi r2, r3, -1 // r2 = nsets mask
> + l.mfspr r3, r0, SPR_EEAR_BASE
> + l.srli r3, r3, 0xd // >> PAGE_SHIFT
> + l.and r2, r3, r2 // calc offset: & (NUM_TLB_ENTRIES-1)
> //NUM_TLB_ENTRIES
> - l.mtspr r5,r4,SPR_DTLBTR_BASE(0)
> + l.mtspr r2,r4,SPR_DTLBTR_BASE(0)
> /*
> * fill DTLB MR register
> */
> - l.mfspr r2,r0,SPR_EEAR_BASE
> - l.addi r3,r0,0xffffe000 // PAGE_MASK
> - l.and r4,r2,r3 // apply PAGE_MASK to EA (__PHX__ do we really need this?)
> - l.ori r4,r4,0x1 // set hardware valid bit: DTBL_MR entry
> - l.mtspr r5,r4,SPR_DTLBMR_BASE(0)
> + l.slli r3, r3, 0xd /* << PAGE_SHIFT => EA & PAGE_MASK */
> + l.ori r4,r3,0x1 // set hardware valid bit: DTBL_MR entry
> + l.mtspr r2,r4,SPR_DTLBMR_BASE(0)
>
> EXCEPTION_LOAD_GPR2
> EXCEPTION_LOAD_GPR3
> EXCEPTION_LOAD_GPR4
> - EXCEPTION_LOAD_GPR5
> - EXCEPTION_LOAD_GPR6
> - l.rfe
> -d_pmd_bad:
> - l.nop 1
> - EXCEPTION_LOAD_GPR2
> - EXCEPTION_LOAD_GPR3
> - EXCEPTION_LOAD_GPR4
> - EXCEPTION_LOAD_GPR5
> - EXCEPTION_LOAD_GPR6
> l.rfe
> d_pmd_none:
> d_pte_not_present:
> EXCEPTION_LOAD_GPR2
> EXCEPTION_LOAD_GPR3
> EXCEPTION_LOAD_GPR4
> - EXCEPTION_LOAD_GPR5
> - EXCEPTION_LOAD_GPR6
> EXCEPTION_HANDLE(_dtlb_miss_page_fault_handler)
>
> /* ==============================================[ ITLB miss handler ]=== */
> @@ -1077,8 +1054,6 @@ ENTRY(itlb_miss_handler)
> EXCEPTION_STORE_GPR2
> EXCEPTION_STORE_GPR3
> EXCEPTION_STORE_GPR4
> - EXCEPTION_STORE_GPR5
> - EXCEPTION_STORE_GPR6
> /*
> * get EA of the miss
> */
> @@ -1088,30 +1063,19 @@ ENTRY(itlb_miss_handler)
> * pmd = (pmd_t *)(current_pgd + pgd_index(daddr));
> *
> */
> - GET_CURRENT_PGD(r3,r5) // r3 is current_pgd, r5 is temp
> + GET_CURRENT_PGD(r3,r4) // r3 is current_pgd, r5 is temp
> l.srli r4,r2,0x18 // >> PAGE_SHIFT + (PAGE_SHIFT - 2)
> l.slli r4,r4,0x2 // to get address << 2
> - l.add r5,r4,r3 // r4 is pgd_index(daddr)
> + l.add r3,r4,r3 // r4 is pgd_index(daddr)
> /*
> * if (pmd_none(*pmd))
> * goto pmd_none:
> */
> - tophys (r4,r5)
> + tophys (r4,r3)
> l.lwz r3,0x0(r4) // get *pmd value
> l.sfne r3,r0
> l.bnf i_pmd_none
> - l.andi r3,r3,0x1fff // ~PAGE_MASK
> - /*
> - * if (pmd_bad(*pmd))
> - * pmd_clear(pmd)
> - * goto pmd_bad:
> - */
> -
> -// l.sfeq r3,r0 // check *pmd value
> -// l.bf i_pmd_good
> - l.addi r3,r0,0xffffe000 // PAGE_MASK
> -// l.j i_pmd_bad
> -// l.sw 0x0(r4),r0 // clear pmd
> + l.addi r3,r0,0xffffe000 // PAGE_MASK
>
> i_pmd_good:
> /*
> @@ -1120,35 +1084,36 @@ i_pmd_good:
> */
> l.lwz r4,0x0(r4) // get **pmd value
> l.and r4,r4,r3 // & PAGE_MASK
> - l.srli r5,r2,0xd // >> PAGE_SHIFT, r2 == EEAR
> - l.andi r3,r5,0x7ff // (1UL << PAGE_SHIFT - 2) - 1
> + l.srli r2,r2,0xd // >> PAGE_SHIFT, r2 == EEAR
> + l.andi r3,r2,0x7ff // (1UL << PAGE_SHIFT - 2) - 1
> l.slli r3,r3,0x2 // to get address << 2
> l.add r3,r3,r4
> - l.lwz r2,0x0(r3) // this is pte at last
> + l.lwz r3,0x0(r3) // this is pte at last
> /*
> * if (!pte_present(pte))
> *
> */
> - l.andi r4,r2,0x1
> + l.andi r4,r3,0x1
> l.sfne r4,r0 // is pte present
> l.bnf i_pte_not_present
> - l.addi r3,r0,0xffffe03a // PAGE_MASK | ITLB_UP_CONVERT_MASK
> + l.addi r4,r0,0xffffe03a // PAGE_MASK | ITLB_UP_CONVERT_MASK
> /*
> * fill ITLB TR register
> */
> - l.and r4,r2,r3 // apply the mask
> - l.andi r3,r2,0x7c0 // _PAGE_EXEC | _PAGE_SRE | _PAGE_SWE | _PAGE_URE | _PAGE_UWE
> -// l.andi r3,r2,0x400 // _PAGE_EXEC
> + l.and r4,r3,r4 // apply the mask
> + l.andi r3,r3,0x7c0 // _PAGE_EXEC | _PAGE_SRE | _PAGE_SWE | _PAGE_URE | _PAGE_UWE
> l.sfeq r3,r0
> l.bf itlb_tr_fill //_workaround
> // Determine number of IMMU sets
> - l.mfspr r6, r0, SPR_IMMUCFGR
> - l.andi r6, r6, SPR_IMMUCFGR_NTS
> - l.srli r6, r6, SPR_IMMUCFGR_NTS_OFF
> + l.mfspr r2, r0, SPR_IMMUCFGR
> + l.andi r2, r2, SPR_IMMUCFGR_NTS
> + l.srli r2, r2, SPR_IMMUCFGR_NTS_OFF
> l.ori r3, r0, 0x1
> - l.sll r3, r3, r6 // r3 = number IMMU sets IMMUCFGR
> - l.addi r6, r3, -1 // r6 = nsets mask
> - l.and r5, r5, r6 // calc offset: & (NUM_TLB_ENTRIES-1)
> + l.sll r3, r3, r2 // r3 = number IMMU sets IMMUCFGR
> + l.addi r2, r3, -1 // r2 = nsets mask
> + l.mfspr r3, r0, SPR_EEAR_BASE
> + l.srli r3, r3, 0xd // >> PAGE_SHIFT
> + l.and r2, r3, r2 // calc offset: & (NUM_TLB_ENTRIES-1)
>
> /*
> * __PHX__ :: fixme
> @@ -1160,38 +1125,24 @@ i_pmd_good:
> itlb_tr_fill_workaround:
> l.ori r4,r4,0xc0 // | (SPR_ITLBTR_UXE | ITLBTR_SXE)
> itlb_tr_fill:
> - l.mtspr r5,r4,SPR_ITLBTR_BASE(0)
> + l.mtspr r2,r4,SPR_ITLBTR_BASE(0)
> /*
> * fill DTLB MR register
> */
> - l.mfspr r2,r0,SPR_EEAR_BASE
> - l.addi r3,r0,0xffffe000 // PAGE_MASK
> - l.and r4,r2,r3 // apply PAGE_MASK to EA (__PHX__ do we really need this?)
> - l.ori r4,r4,0x1 // set hardware valid bit: DTBL_MR entry
> - l.mtspr r5,r4,SPR_ITLBMR_BASE(0)
> + l.slli r3, r3, 0xd /* << PAGE_SHIFT => EA & PAGE_MASK */
> + l.ori r4,r3,0x1 // set hardware valid bit: ITBL_MR entry
> + l.mtspr r2,r4,SPR_ITLBMR_BASE(0)
>
> EXCEPTION_LOAD_GPR2
> EXCEPTION_LOAD_GPR3
> EXCEPTION_LOAD_GPR4
> - EXCEPTION_LOAD_GPR5
> - EXCEPTION_LOAD_GPR6
> l.rfe
>
> -i_pmd_bad:
> - l.nop 1
> - EXCEPTION_LOAD_GPR2
> - EXCEPTION_LOAD_GPR3
> - EXCEPTION_LOAD_GPR4
> - EXCEPTION_LOAD_GPR5
> - EXCEPTION_LOAD_GPR6
> - l.rfe
> i_pmd_none:
> i_pte_not_present:
> EXCEPTION_LOAD_GPR2
> EXCEPTION_LOAD_GPR3
> EXCEPTION_LOAD_GPR4
> - EXCEPTION_LOAD_GPR5
> - EXCEPTION_LOAD_GPR6
> EXCEPTION_HANDLE(_itlb_miss_page_fault_handler)
>
> /* ==============================================[ boot tlb handlers ]=== */
> --
> 1.8.1.2
>
next prev parent reply other threads:[~2013-12-06 10:29 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-01 7:46 [PATCH] openrisc: tlb miss handler optimizations Stefan Kristiansson
2013-12-06 10:28 ` Stefan Kristiansson [this message]
2013-12-06 11:11 ` Jonas Bonn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131206102828.GA1369@chokladfabriken.org \
--to=stefan.kristiansson@saunalahti.fi \
--cc=jonas@southpole.se \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@openrisc.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox