• D
    livepatch/core: Revert module_enable_ro and module_disable_ro · f440d90f
    Dong Kai 提交于
    hulk inclusion
    category: feature
    bugzilla: 51921
    CVE: NA
    
    ---------------------------
    
    After commit d556e1be ("livepatch: Remove module_disable_ro() usage")
    and commit 0d9fbf78 ("module: Remove module_disable_ro()") and
    commit e6eff437 ("module: Make module_enable_ro() static again") merged,
    the module_disable_ro is removed and module_enable_ro is make static.
    
    It's ok for x86/ppc platform because the livepatch module relocation is
    done by text poke func which internally modify the text addr by remap
    to high virtaddr which has write permission.
    
    However for arm/arm64 platform, it's apply_relocate[_add] still directly
    modify the text code so we should change the module text permission before
    relocation. Otherwise it will lead to following problem:
    
      Unable to handle kernel write to read-only memory at virtual address ffff800008a95288
      Mem abort info:
      ESR = 0x9600004f
      EC = 0x25: DABT (current EL), IL = 32 bits
      SET = 0, FnV = 0
      EA = 0, S1PTW = 0
      Data abort info:
      ISV = 0, ISS = 0x0000004f
      CM = 0, WnR = 1
      swapper pgtable: 4k pages, 48-bit VAs, pgdp=000000004133c000
      [ffff800008a95288] pgd=00000000bdfff003, p4d=00000000bdfff003, pud=00000000bdffe003,
    		     pmd=0000000080ce7003, pte=0040000080d5d783
      Internal error: Oops: 9600004f [#1] PREEMPT SMP
      Modules linked in: livepatch_testmod_drv(OK+) testmod_drv(O)
      CPU: 0 PID: 139 Comm: insmod Tainted: G           O  K   5.10.0-01131-gf6b4602e09b2-dirty #35
      Hardware name: linux,dummy-virt (DT)
      pstate: 80000005 (Nzcv daif -PAN -UAO -TCO BTYPE=--)
      pc : reloc_insn_imm+0x54/0x78
      lr : reloc_insn_imm+0x50/0x78
      sp : ffff800011cf3910
      ...
      Call trace:
       reloc_insn_imm+0x54/0x78
       apply_relocate_add+0x464/0x680
       klp_apply_section_relocs+0x11c/0x148
       klp_enable_patch+0x338/0x998
       patch_init+0x338/0x1000 [livepatch_testmod_drv]
       do_one_initcall+0x60/0x1d8
       do_init_module+0x58/0x1e0
       load_module+0x1fb4/0x2688
       __do_sys_finit_module+0xc0/0x128
       __arm64_sys_finit_module+0x20/0x30
       do_el0_svc+0x84/0x1b0
       el0_svc+0x14/0x20
       el0_sync_handler+0x90/0xc8
       el0_sync+0x158/0x180
       Code: 2a0503e0 9ad42a73 97d6a499 91000673 (b90002a0)
       ---[ end trace 67dd2ef1203ed335 ]---
    
    Though the permission change is not necessary to x86/ppc platform, consider
    that the jump_label_register api may modify the text code either, we just
    put the change handle here instead of putting it in arch-specific relocate.
    
    Besides, the jump_label_module_nb callback called in jump_label_register
    also maybe need motify the module code either, it sort and swap the jump
    entries if necessary. So just disable ro before jump_label handling and
    restore it back.
    Signed-off-by: NDong Kai <dongkai11@huawei.com>
    Signed-off-by: NYe Weihua <yeweihua4@huawei.com>
    Reviewed-by: NYang Jihong <yangjihong1@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    f440d90f
module.h 25.2 KB