lkml.org 
[lkml]   [2019]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 02/17] arm64: hibernate: pass the allocated pgdp to ttbr0
    Date
    ttbr0 should be set to the beginning of pgdp, however, currently
    in create_safe_exec_page it is set to pgdp after pgd_offset_raw(),
    which works by accident.

    Fixes: 0194e760f7d2 ("arm64: hibernate: avoid potential TLB conflict")

    Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
    ---
    arch/arm64/kernel/hibernate.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c
    index 9341fcc6e809..025221564252 100644
    --- a/arch/arm64/kernel/hibernate.c
    +++ b/arch/arm64/kernel/hibernate.c
    @@ -201,6 +201,7 @@ static int create_safe_exec_page(void *src_start, size_t length,
    gfp_t mask)
    {
    int rc = 0;
    + pgd_t *trans_pgd;
    pgd_t *pgdp;
    pud_t *pudp;
    pmd_t *pmdp;
    @@ -215,7 +216,8 @@ static int create_safe_exec_page(void *src_start, size_t length,
    memcpy((void *)dst, src_start, length);
    __flush_icache_range(dst, dst + length);

    - pgdp = pgd_offset_raw(allocator(mask), dst_addr);
    + trans_pgd = allocator(mask);
    + pgdp = pgd_offset_raw(trans_pgd, dst_addr);
    if (pgd_none(READ_ONCE(*pgdp))) {
    pudp = allocator(mask);
    if (!pudp) {
    @@ -262,7 +264,7 @@ static int create_safe_exec_page(void *src_start, size_t length,
    */
    cpu_set_reserved_ttbr0();
    local_flush_tlb_all();
    - write_sysreg(phys_to_ttbr(virt_to_phys(pgdp)), ttbr0_el1);
    + write_sysreg(phys_to_ttbr(virt_to_phys(trans_pgd)), ttbr0_el1);
    isb();

    *phys_dst_addr = virt_to_phys((void *)dst);
    --
    2.23.0
    \
     
     \ /
      Last update: 2019-09-09 20:14    [W:4.186 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site