ANDROID: arm64: patching: Add aarch64_addr_write()

The process of applying hypervisor relocations involves patching
addresses in the hypervisor object. In the existing KVM nVHE relocation
procedure, the relocations are applied early enough for write-permission
not to be a problem when touching e.g. the rodata section. But applying
relocations on hypervisor modules embedded in a kernel module proves
more challenging, as the kernel module loader will actively map text and
rodata sections read-only. In order to allow patching in those sections,
let's introduce a new helper function using the text fixmap to
temporarily map the relevant pages writable.

Bug: 244543039
Bug: 244373730
Change-Id: I9dcdade1927e5bc121db87bc950fb70a374c44cd
Signed-off-by: Quentin Perret <qperret@google.com>
This commit is contained in:
Quentin Perret
2022-12-05 15:52:57 +00:00
parent 378e0dbd91
commit d996511e43
2 changed files with 6 additions and 0 deletions

View File

@@ -6,6 +6,7 @@
int aarch64_insn_read(void *addr, u32 *insnp);
int aarch64_insn_write(void *addr, u32 insn);
int aarch64_addr_write(void *addr, u64 dst);
int aarch64_insn_patch_text_nosync(void *addr, u32 insn);
int aarch64_insn_patch_text(void *addrs[], u32 insns[], int cnt);

View File

@@ -90,6 +90,11 @@ int __kprobes aarch64_insn_write(void *addr, u32 insn)
return __aarch64_text_write(addr, &__insn, AARCH64_INSN_SIZE);
}
int __kprobes aarch64_addr_write(void *addr, u64 dst)
{
return __aarch64_text_write(addr, &dst, sizeof(dst));
}
int __kprobes aarch64_insn_patch_text_nosync(void *addr, u32 insn)
{
u32 *tp = addr;