Hey thanks for the review. Points about formatting and style all valid, I'll tidy those up. For the others, On Thu Mar 30, 2023 at 6:19 AM AEST, Sean Christopherson wrote: > On Thu, Mar 16, 2023, Nicholas Piggin wrote: > > +#ifdef __powerpc__ > > + TEST_ASSERT(getpagesize() == 64*1024, > > This can use SZ_64K (we really need to convert a bunch of open coded stuff...) > > > + "KVM selftests requires 64K host page size\n"); > > What is the actual requirement? E.g. is it that the host and guest page sizes > must match, or is that the selftest setup itself only supports 64KiB pages? If > it's the former, would it make sense to assert outside of the switch statement, e.g. > > diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c > index 298c4372fb1a..920813a71be0 100644 > --- a/tools/testing/selftests/kvm/lib/kvm_util.c > +++ b/tools/testing/selftests/kvm/lib/kvm_util.c > @@ -291,6 +291,10 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode) > #ifdef __aarch64__ > if (vm->pa_bits != 40) > vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits); > +#endif > +#ifdef __powerpc__ > + TEST_ASSERT(getpagesize() == vm->page_size, "blah blah blah"); > + > #endif > > vm_open(vm); > > If it's the latter (selftests limitation), can you add a comment explaining the > limitation? It's the selftests setup, requires both host and guest to be 64k page size. I think it shouldn't be *too* hard to add any mix of 64k/4k, but there are a few quirks like requiring pgd to have 64k size allocation. 64/64 is the most important for us, but it would be nice to get other combos working soon if nothing else than because they don't get as much testing in other ways. I can add a comment. > > + > > + /* If needed, create page table */ > > + if (vm->pgd_created) > > + return; > > Heh, every arch has this. Any objection to moving the check to virt_pgd_alloc() > as a prep patch? I have no objection, I can do that for the next spin. > > + "PTE not valid at level: %u gva: 0x%lx pte:0x%lx\n", > > + level, gva, pte); > > + > > + return (pte & PTE_PAGE_MASK) + (gva & (vm->page_size - 1)); > > +} > > + > > +static void virt_arch_dump_pt(FILE *stream, struct kvm_vm *vm, vm_paddr_t pt, vm_vaddr_t va, int level, uint8_t indent) > > And here. Actually, why bother with the helper? There's one caller, and that > callers checks pgd_created, i.e. is already assuming its dumping only page tables. > Ooh, nevermind, it's recursive. > > Can you drop "arch" from the name? Selftests uses "arch" to tag functions that > are provided by arch code for use in generic code. Yeah agree, I'll drop that. > > + } else { > > + virt_arch_dump_pt(stream, vm, pte & PDE_PT_MASK, va, level + 1, indent); > > + } > > + } > > + va += pt_entry_coverage(vm, level); > > The shift is constant for vm+level, correct? In that case, can't this be written > as > > for (idx = 0; idx < size; idx++, va += va_coverage) { > > or even without a snapshot > > for (idx = 0; idx < size; idx++, va += pt_entry_coverage(vm, level)) { > > That would allow > > if (!(pte & PTE_VALID) > continue > > to reduce the indentation of the printing. It is constant for a given (vm, level). Good thinking, that should work. > > + stack_vaddr = __vm_vaddr_alloc(vm, stack_size, > > + DEFAULT_GUEST_STACK_VADDR_MIN, > > + MEM_REGION_DATA); > > + > > + vcpu = __vm_vcpu_add(vm, vcpu_id); > > + > > + vcpu_enable_cap(vcpu, KVM_CAP_PPC_PAPR, 1); > > + > > + /* Setup guest registers */ > > + vcpu_regs_get(vcpu, ®s); > > + vcpu_get_reg(vcpu, KVM_REG_PPC_LPCR_64, &lpcr); > > + > > + regs.pc = (uintptr_t)guest_code; > > + regs.gpr[12] = (uintptr_t)guest_code; > > + regs.msr = 0x8000000002103032ull; > > + regs.gpr[1] = stack_vaddr + stack_size - 256; > > + > > + if (BYTE_ORDER == LITTLE_ENDIAN) { > > + regs.msr |= 0x1; // LE > > + lpcr |= 0x0000000002000000; // ILE > > Would it be appropriate to add #defines to processor.h instead of open coding the > magic numbers? Yes it would. I should have not been lazy about it from the start, will fix. (Other comments snipped but agreed for all) Thanks, Nick