diff options
| author | Alexander Potapenko <glider@google.com> | 2024-09-11 17:38:12 +0200 |
|---|---|---|
| committer | Alexander Potapenko <glider@google.com> | 2024-09-25 09:05:57 +0000 |
| commit | 4e0b1d0a9f1fe6044c2113b5b0465cd3f53e29ba (patch) | |
| tree | 787094430da46985e20e272436e69f0768db0076 | |
| parent | 349a68c4b056a06438a1e75e9b8a3a583b06d511 (diff) | |
executor: arm64: factor out setup_vm()
No functional change.
For multiple CPUs within the same VM, calls to syz_kvm_setup_cpu()
will set up the VM memory space multiple times, so only the last one
will take effect.
Prepare to decouple VM setup from CPU setup by factoring this code out
of syz_kvm_setup_cpu().
| -rw-r--r-- | executor/common_kvm_arm64.h | 75 |
1 files changed, 41 insertions, 34 deletions
diff --git a/executor/common_kvm_arm64.h b/executor/common_kvm_arm64.h index 4aac95e20..e77a8d908 100644 --- a/executor/common_kvm_arm64.h +++ b/executor/common_kvm_arm64.h @@ -68,44 +68,11 @@ struct api_fn { void* fn; }; -// syz_kvm_setup_cpu(fd fd_kvmvm, cpufd fd_kvmcpu, usermem vma[24], text ptr[in, array[kvm_text, 1]], ntext len[text], flags flags[kvm_setup_flags], opts ptr[in, array[kvm_setup_opt, 0:2]], nopt len[opts]) -static volatile long syz_kvm_setup_cpu(volatile long a0, volatile long a1, volatile long a2, volatile long a3, volatile long a4, volatile long a5, volatile long a6, volatile long a7) +static void setup_vm(int vmfd, void* host_mem, const void* text, size_t text_size) { - const int vmfd = a0; - const int cpufd = a1; - char* const host_mem = (char*)a2; - const struct kvm_text* const text_array_ptr = (struct kvm_text*)a3; - const uintptr_t text_count = a4; - const uintptr_t flags = a5; - const struct kvm_opt* const opt_array_ptr = (struct kvm_opt*)a6; - uintptr_t opt_count = a7; - - (void)flags; - (void)opt_count; - const uintptr_t page_size = 4 << 10; const uintptr_t guest_mem_size = 24 * page_size; - (void)text_count; // fuzzer can spoof count and we need just 1 text, so ignore text_count - int text_type = text_array_ptr[0].typ; - const void* text = text_array_ptr[0].text; - size_t text_size = text_array_ptr[0].size; - (void)text_type; - (void)opt_array_ptr; - - uint32 features = 0; - if (opt_count > 1) - opt_count = 1; - for (uintptr_t i = 0; i < opt_count; i++) { - uint64 typ = opt_array_ptr[i].typ; - uint64 val = opt_array_ptr[i].val; - switch (typ) { - case 1: - features = val; - break; - } - } - // Guest physical memory layout (must be in sync with executor/kvm.h): // 0x00000000 - unused pages // 0x08000000 - GICv3 distributor region (MMIO, no memory allocated) @@ -141,6 +108,46 @@ static volatile long syz_kvm_setup_cpu(volatile long a0, volatile long a1, volat // Map the remaining pages at address 0. next = alloc_guest_mem(&allocator, allocator.size); vm_set_user_memory_region(vmfd, slot++, 0, 0, next.size, (uintptr_t)next.addr); +} + +// syz_kvm_setup_cpu(fd fd_kvmvm, cpufd fd_kvmcpu, usermem vma[24], text ptr[in, array[kvm_text, 1]], ntext len[text], flags flags[kvm_setup_flags], opts ptr[in, array[kvm_setup_opt, 0:2]], nopt len[opts]) +static volatile long syz_kvm_setup_cpu(volatile long a0, volatile long a1, volatile long a2, volatile long a3, volatile long a4, volatile long a5, volatile long a6, volatile long a7) +{ + const int vmfd = a0; + const int cpufd = a1; + void* const host_mem = (void*)a2; + const struct kvm_text* const text_array_ptr = (struct kvm_text*)a3; + const uintptr_t text_count = a4; + const uintptr_t flags = a5; + const struct kvm_opt* const opt_array_ptr = (struct kvm_opt*)a6; + uintptr_t opt_count = a7; + + (void)flags; + (void)opt_count; + + const uintptr_t page_size = 4 << 10; + + (void)text_count; // fuzzer can spoof count and we need just 1 text, so ignore text_count + int text_type = text_array_ptr[0].typ; + const void* text = text_array_ptr[0].text; + size_t text_size = text_array_ptr[0].size; + (void)text_type; + (void)opt_array_ptr; + + uint32 features = 0; + if (opt_count > 1) + opt_count = 1; + for (uintptr_t i = 0; i < opt_count; i++) { + uint64 typ = opt_array_ptr[i].typ; + uint64 val = opt_array_ptr[i].val; + switch (typ) { + case 1: + features = val; + break; + } + } + + setup_vm(vmfd, host_mem, text, text_size); struct kvm_vcpu_init init; // Queries KVM for preferred CPU target type. |
