aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Potapenko <glider@google.com>2024-09-11 17:38:12 +0200
committerAlexander Potapenko <glider@google.com>2024-09-25 09:05:57 +0000
commit4e0b1d0a9f1fe6044c2113b5b0465cd3f53e29ba (patch)
tree787094430da46985e20e272436e69f0768db0076
parent349a68c4b056a06438a1e75e9b8a3a583b06d511 (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.h75
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.