lkml.org 
[lkml]   [2020]   [May]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 37/45] powerpc/8xx: Refactor kernel address boundary comparison
    Date
    Now that linear and IMMR dedicated TLB handling is gone, kernel
    boundary address comparison is similar in ITLB miss handler and
    in DTLB miss handler.

    Create a macro named compare_to_kernel_boundary.

    When TASK_SIZE is strictly below 0x80000000 and PAGE_OFFSET is
    above 0x80000000, it is enough to compare to 0x8000000, and this
    can be done with a single instruction.

    Using not. instruction, we get to use 'blt' conditional branch as
    when doing a regular comparison:

    0x00000000 <= addr <= 0x7fffffff ==>
    0xffffffff >= NOT(addr) >= 0x80000000
    The above test corresponds to a 'blt'

    Otherwise, do a regular comparison using two instructions.

    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    ---
    arch/powerpc/kernel/head_8xx.S | 22 ++++++++--------------
    1 file changed, 8 insertions(+), 14 deletions(-)

    diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
    index 9f3f7f3d03a7..9a117b9f0998 100644
    --- a/arch/powerpc/kernel/head_8xx.S
    +++ b/arch/powerpc/kernel/head_8xx.S
    @@ -32,10 +32,15 @@

    #include "head_32.h"

    +.macro compare_to_kernel_boundary scratch, addr
    #if CONFIG_TASK_SIZE <= 0x80000000 && CONFIG_PAGE_OFFSET >= 0x80000000
    /* By simply checking Address >= 0x80000000, we know if its a kernel address */
    -#define SIMPLE_KERNEL_ADDRESS 1
    + not. \scratch, \addr
    +#else
    + rlwinm \scratch, \addr, 16, 0xfff8
    + cmpli cr0, \scratch, PAGE_OFFSET@h
    #endif
    +.endm

    /*
    * We need an ITLB miss handler for kernel addresses if:
    @@ -209,20 +214,11 @@ InstructionTLBMiss:
    mtspr SPRN_MD_EPN, r10
    #ifdef ITLB_MISS_KERNEL
    mfcr r11
    -#if defined(SIMPLE_KERNEL_ADDRESS)
    - cmpi cr0, r10, 0 /* Address >= 0x80000000 */
    -#else
    - rlwinm r10, r10, 16, 0xfff8
    - cmpli cr0, r10, PAGE_OFFSET@h
    -#endif
    + compare_to_kernel_boundary r10, r10
    #endif
    mfspr r10, SPRN_M_TWB /* Get level 1 table */
    #ifdef ITLB_MISS_KERNEL
    -#if defined(SIMPLE_KERNEL_ADDRESS)
    - bge+ 3f
    -#else
    blt+ 3f
    -#endif
    rlwinm r10, r10, 0, 20, 31
    oris r10, r10, (swapper_pg_dir - PAGE_OFFSET)@ha
    3:
    @@ -288,9 +284,7 @@ DataStoreTLBMiss:
    * kernel page tables.
    */
    mfspr r10, SPRN_MD_EPN
    - rlwinm r10, r10, 16, 0xfff8
    - cmpli cr0, r10, PAGE_OFFSET@h
    -
    + compare_to_kernel_boundary r10, r10
    mfspr r10, SPRN_M_TWB /* Get level 1 table */
    blt+ 3f
    rlwinm r10, r10, 0, 20, 31
    --
    2.25.0
    \
     
     \ /
      Last update: 2020-05-19 07:50    [W:4.147 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site