From: Steven Price <steven.price@arm.com> To: Zhi Wang <zhi.wang.linux@gmail.com> Cc: kvm@vger.kernel.org, kvmarm@lists.linux.dev, Catalin Marinas <catalin.marinas@arm.com>, Marc Zyngier <maz@kernel.org>, Will Deacon <will@kernel.org>, James Morse <james.morse@arm.com>, Oliver Upton <oliver.upton@linux.dev>, Suzuki K Poulose <suzuki.poulose@arm.com>, Zenghui Yu <yuzenghui@huawei.com>, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly <joey.gouly@arm.com>, Alexandru Elisei <alexandru.elisei@arm.com>, Christoffer Dall <christoffer.dall@arm.com>, Fuad Tabba <tabba@google.com>, linux-coco@lists.linux.dev Subject: Re: [RFC PATCH 16/28] arm64: RME: Allow populating initial contents Date: Fri, 10 Mar 2023 15:47:16 +0000 [thread overview] Message-ID: <6c6ff608-2314-a49a-84ee-fac883c4e227@arm.com> (raw) In-Reply-To: <20230306193439.000048f2@gmail.com> On 06/03/2023 17:34, Zhi Wang wrote: > On Fri, 27 Jan 2023 11:29:20 +0000 > Steven Price <steven.price@arm.com> wrote: > >> The VMM needs to populate the realm with some data before starting (e.g. >> a kernel and initrd). This is measured by the RMM and used as part of >> the attestation later on. >> >> Signed-off-by: Steven Price <steven.price@arm.com> >> --- >> arch/arm64/kvm/rme.c | 366 +++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 366 insertions(+) >> >> diff --git a/arch/arm64/kvm/rme.c b/arch/arm64/kvm/rme.c >> index 16e0bfea98b1..3405b43e1421 100644 >> --- a/arch/arm64/kvm/rme.c >> +++ b/arch/arm64/kvm/rme.c >> @@ -4,6 +4,7 @@ >> */ >> >> #include <linux/kvm_host.h> >> +#include <linux/hugetlb.h> >> >> #include <asm/kvm_emulate.h> >> #include <asm/kvm_mmu.h> >> @@ -426,6 +427,359 @@ void kvm_realm_unmap_range(struct kvm *kvm, unsigned long ipa, u64 size) >> } >> } >> >> +static int realm_create_protected_data_page(struct realm *realm, >> + unsigned long ipa, >> + struct page *dst_page, >> + struct page *tmp_page) >> +{ >> + phys_addr_t dst_phys, tmp_phys; >> + int ret; >> + >> + copy_page(page_address(tmp_page), page_address(dst_page)); >> + >> + dst_phys = page_to_phys(dst_page); >> + tmp_phys = page_to_phys(tmp_page); >> + >> + if (rmi_granule_delegate(dst_phys)) >> + return -ENXIO; >> + >> + ret = rmi_data_create(dst_phys, virt_to_phys(realm->rd), ipa, tmp_phys, >> + RMI_MEASURE_CONTENT); >> + >> + if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) { >> + /* Create missing RTTs and retry */ >> + int level = RMI_RETURN_INDEX(ret); >> + >> + ret = realm_create_rtt_levels(realm, ipa, level, >> + RME_RTT_MAX_LEVEL, NULL); >> + if (ret) >> + goto err; >> + >> + ret = rmi_data_create(dst_phys, virt_to_phys(realm->rd), ipa, >> + tmp_phys, RMI_MEASURE_CONTENT); >> + } >> + >> + if (ret) >> + goto err; >> + >> + return 0; >> + >> +err: >> + if (WARN_ON(rmi_granule_undelegate(dst_phys))) { >> + /* Page can't be returned to NS world so is lost */ >> + get_page(dst_page); >> + } >> + return -ENXIO; >> +} >> + >> +static int fold_rtt(phys_addr_t rd, unsigned long addr, int level, >> + struct realm *realm) >> +{ >> + struct rtt_entry rtt; >> + phys_addr_t rtt_addr; >> + >> + if (rmi_rtt_read_entry(rd, addr, level, &rtt)) >> + return -ENXIO; >> + >> + if (rtt.state != RMI_TABLE) >> + return -EINVAL; >> + >> + rtt_addr = rmi_rtt_get_phys(&rtt); >> + if (rmi_rtt_fold(rtt_addr, rd, addr, level + 1)) >> + return -ENXIO; >> + >> + free_delegated_page(realm, rtt_addr); >> + >> + return 0; >> +} >> + >> +int realm_map_protected(struct realm *realm, >> + unsigned long hva, >> + unsigned long base_ipa, >> + struct page *dst_page, >> + unsigned long map_size, >> + struct kvm_mmu_memory_cache *memcache) >> +{ >> + phys_addr_t dst_phys = page_to_phys(dst_page); >> + phys_addr_t rd = virt_to_phys(realm->rd); >> + unsigned long phys = dst_phys; >> + unsigned long ipa = base_ipa; >> + unsigned long size; >> + int map_level; >> + int ret = 0; >> + >> + if (WARN_ON(!IS_ALIGNED(ipa, map_size))) >> + return -EINVAL; >> + >> + switch (map_size) { >> + case PAGE_SIZE: >> + map_level = 3; >> + break; >> + case RME_L2_BLOCK_SIZE: >> + map_level = 2; >> + break; >> + default: >> + return -EINVAL; >> + } >> + >> + if (map_level < RME_RTT_MAX_LEVEL) { >> + /* >> + * A temporary RTT is needed during the map, precreate it, >> + * however if there is an error (e.g. missing parent tables) >> + * this will be handled below. >> + */ >> + realm_create_rtt_levels(realm, ipa, map_level, >> + RME_RTT_MAX_LEVEL, memcache); >> + } >> + >> + for (size = 0; size < map_size; size += PAGE_SIZE) { >> + if (rmi_granule_delegate(phys)) { >> + struct rtt_entry rtt; >> + >> + /* >> + * It's possible we raced with another VCPU on the same >> + * fault. If the entry exists and matches then exit >> + * early and assume the other VCPU will handle the >> + * mapping. >> + */ >> + if (rmi_rtt_read_entry(rd, ipa, RME_RTT_MAX_LEVEL, &rtt)) >> + goto err; >> + >> + // FIXME: For a block mapping this could race at level >> + // 2 or 3... >> + if (WARN_ON((rtt.walk_level != RME_RTT_MAX_LEVEL || >> + rtt.state != RMI_ASSIGNED || >> + rtt.desc != phys))) { >> + goto err; >> + } >> + >> + return 0; >> + } >> + >> + ret = rmi_data_create_unknown(phys, rd, ipa); >> + >> + if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) { >> + /* Create missing RTTs and retry */ >> + int level = RMI_RETURN_INDEX(ret); >> + >> + ret = realm_create_rtt_levels(realm, ipa, level, >> + RME_RTT_MAX_LEVEL, >> + memcache); >> + WARN_ON(ret); >> + if (ret) >> + goto err_undelegate; >> + >> + ret = rmi_data_create_unknown(phys, rd, ipa); >> + } >> + WARN_ON(ret); >> + >> + if (ret) >> + goto err_undelegate; >> + >> + phys += PAGE_SIZE; >> + ipa += PAGE_SIZE; >> + } >> + >> + if (map_size == RME_L2_BLOCK_SIZE) >> + ret = fold_rtt(rd, base_ipa, map_level, realm); >> + if (WARN_ON(ret)) >> + goto err; >> + >> + return 0; >> + >> +err_undelegate: >> + if (WARN_ON(rmi_granule_undelegate(phys))) { >> + /* Page can't be returned to NS world so is lost */ >> + get_page(phys_to_page(phys)); >> + } >> +err: >> + while (size > 0) { >> + phys -= PAGE_SIZE; >> + size -= PAGE_SIZE; >> + ipa -= PAGE_SIZE; >> + >> + rmi_data_destroy(rd, ipa); >> + >> + if (WARN_ON(rmi_granule_undelegate(phys))) { >> + /* Page can't be returned to NS world so is lost */ >> + get_page(phys_to_page(phys)); >> + } >> + } >> + return -ENXIO; >> +} >> + > > There seems no caller to the function above. Better move it to the related > patch. Indeed this should really be in the next patch - will move as it's very confusing having it in this patch (sorry about that). >> +static int populate_par_region(struct kvm *kvm, >> + phys_addr_t ipa_base, >> + phys_addr_t ipa_end) >> +{ >> + struct realm *realm = &kvm->arch.realm; >> + struct kvm_memory_slot *memslot; >> + gfn_t base_gfn, end_gfn; >> + int idx; >> + phys_addr_t ipa; >> + int ret = 0; >> + struct page *tmp_page; >> + phys_addr_t rd = virt_to_phys(realm->rd); >> + >> + base_gfn = gpa_to_gfn(ipa_base); >> + end_gfn = gpa_to_gfn(ipa_end); >> + >> + idx = srcu_read_lock(&kvm->srcu); >> + memslot = gfn_to_memslot(kvm, base_gfn); >> + if (!memslot) { >> + ret = -EFAULT; >> + goto out; >> + } >> + >> + /* We require the region to be contained within a single memslot */ >> + if (memslot->base_gfn + memslot->npages < end_gfn) { >> + ret = -EINVAL; >> + goto out; >> + } >> + >> + tmp_page = alloc_page(GFP_KERNEL); >> + if (!tmp_page) { >> + ret = -ENOMEM; >> + goto out; >> + } >> + >> + mmap_read_lock(current->mm); >> + >> + ipa = ipa_base; >> + >> + while (ipa < ipa_end) { >> + struct vm_area_struct *vma; >> + unsigned long map_size; >> + unsigned int vma_shift; >> + unsigned long offset; >> + unsigned long hva; >> + struct page *page; >> + kvm_pfn_t pfn; >> + int level; >> + >> + hva = gfn_to_hva_memslot(memslot, gpa_to_gfn(ipa)); >> + vma = vma_lookup(current->mm, hva); >> + if (!vma) { >> + ret = -EFAULT; >> + break; >> + } >> + >> + if (is_vm_hugetlb_page(vma)) >> + vma_shift = huge_page_shift(hstate_vma(vma)); >> + else >> + vma_shift = PAGE_SHIFT; >> + >> + map_size = 1 << vma_shift; >> + >> + /* >> + * FIXME: This causes over mapping, but there's no good >> + * solution here with the ABI as it stands >> + */ >> + ipa = ALIGN_DOWN(ipa, map_size); >> + >> + switch (map_size) { >> + case RME_L2_BLOCK_SIZE: >> + level = 2; >> + break; >> + case PAGE_SIZE: >> + level = 3; >> + break; >> + default: >> + WARN_ONCE(1, "Unsupport vma_shift %d", vma_shift); >> + ret = -EFAULT; >> + break; >> + } >> + >> + pfn = gfn_to_pfn_memslot(memslot, gpa_to_gfn(ipa)); >> + >> + if (is_error_pfn(pfn)) { >> + ret = -EFAULT; >> + break; >> + } >> + >> + ret = rmi_rtt_init_ripas(rd, ipa, level); >> + if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) { >> + ret = realm_create_rtt_levels(realm, ipa, >> + RMI_RETURN_INDEX(ret), >> + level, NULL); >> + if (ret) >> + break; >> + ret = rmi_rtt_init_ripas(rd, ipa, level); >> + if (ret) { >> + ret = -ENXIO; >> + break; >> + } >> + } >> + >> + if (level < RME_RTT_MAX_LEVEL) { >> + /* >> + * A temporary RTT is needed during the map, precreate >> + * it, however if there is an error (e.g. missing >> + * parent tables) this will be handled in the >> + * realm_create_protected_data_page() call. >> + */ >> + realm_create_rtt_levels(realm, ipa, level, >> + RME_RTT_MAX_LEVEL, NULL); >> + } >> + >> + page = pfn_to_page(pfn); >> + >> + for (offset = 0; offset < map_size && !ret; >> + offset += PAGE_SIZE, page++) { >> + phys_addr_t page_ipa = ipa + offset; >> + >> + ret = realm_create_protected_data_page(realm, page_ipa, >> + page, tmp_page); >> + } >> + if (ret) >> + goto err_release_pfn; >> + >> + if (level == 2) { >> + ret = fold_rtt(rd, ipa, level, realm); >> + if (ret) >> + goto err_release_pfn; >> + } >> + >> + ipa += map_size; > >> + kvm_set_pfn_accessed(pfn); >> + kvm_set_pfn_dirty(pfn); > > kvm_release_pfn_dirty() has already called kvm_set_pfn_{accessed, dirty}(). Will remove those calls. >> + kvm_release_pfn_dirty(pfn); >> +err_release_pfn: >> + if (ret) { >> + kvm_release_pfn_clean(pfn); >> + break; >> + } >> + } >> + >> + mmap_read_unlock(current->mm); >> + __free_page(tmp_page); >> + >> +out: >> + srcu_read_unlock(&kvm->srcu, idx); >> + return ret; >> +} >> + >> +static int kvm_populate_realm(struct kvm *kvm, >> + struct kvm_cap_arm_rme_populate_realm_args *args) >> +{ >> + phys_addr_t ipa_base, ipa_end; >> + > > Check kvm_is_realm(kvm) here or in the kvm_realm_enable_cap(). I'm going to update kvm_vm_ioctl_enable_cap() to check kvm_is_realm() so we won't get here. >> + if (kvm_realm_state(kvm) != REALM_STATE_NEW) >> + return -EBUSY; > > Maybe -EINVAL? The realm hasn't been created (RMI_REALM_CREATE is not called > yet). The userspace shouldn't reach this path. Well user space can attempt to populate in the ACTIVE state - which is where the idea of 'busy' comes from. Admittedly it's a little confusing when RMI_REALM_CREATE hasn't been called. I'm not particularly bothered about the return code, but it's useful to have a different code to -EINVAL as it's not an invalid argument, but calling at the wrong time. I can't immediately see a better error code though. Steve >> + >> + if (!IS_ALIGNED(args->populate_ipa_base, PAGE_SIZE) || >> + !IS_ALIGNED(args->populate_ipa_size, PAGE_SIZE)) >> + return -EINVAL; >> + >> + ipa_base = args->populate_ipa_base; >> + ipa_end = ipa_base + args->populate_ipa_size; >> + >> + if (ipa_end < ipa_base) >> + return -EINVAL; >> + >> + return populate_par_region(kvm, ipa_base, ipa_end); >> +} >> + >> static int set_ipa_state(struct kvm_vcpu *vcpu, >> unsigned long ipa, >> unsigned long end, >> @@ -748,6 +1102,18 @@ int kvm_realm_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) >> r = kvm_init_ipa_range_realm(kvm, &args); >> break; >> } >> + case KVM_CAP_ARM_RME_POPULATE_REALM: { >> + struct kvm_cap_arm_rme_populate_realm_args args; >> + void __user *argp = u64_to_user_ptr(cap->args[1]); >> + >> + if (copy_from_user(&args, argp, sizeof(args))) { >> + r = -EFAULT; >> + break; >> + } >> + >> + r = kvm_populate_realm(kvm, &args); >> + break; >> + } >> default: >> r = -EINVAL; >> break; >
WARNING: multiple messages have this Message-ID (diff)
From: Steven Price <steven.price@arm.com> To: Zhi Wang <zhi.wang.linux@gmail.com> Cc: kvm@vger.kernel.org, kvmarm@lists.linux.dev, Catalin Marinas <catalin.marinas@arm.com>, Marc Zyngier <maz@kernel.org>, Will Deacon <will@kernel.org>, James Morse <james.morse@arm.com>, Oliver Upton <oliver.upton@linux.dev>, Suzuki K Poulose <suzuki.poulose@arm.com>, Zenghui Yu <yuzenghui@huawei.com>, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly <joey.gouly@arm.com>, Alexandru Elisei <alexandru.elisei@arm.com>, Christoffer Dall <christoffer.dall@arm.com>, Fuad Tabba <tabba@google.com>, linux-coco@lists.linux.dev Subject: Re: [RFC PATCH 16/28] arm64: RME: Allow populating initial contents Date: Fri, 10 Mar 2023 15:47:16 +0000 [thread overview] Message-ID: <6c6ff608-2314-a49a-84ee-fac883c4e227@arm.com> (raw) In-Reply-To: <20230306193439.000048f2@gmail.com> On 06/03/2023 17:34, Zhi Wang wrote: > On Fri, 27 Jan 2023 11:29:20 +0000 > Steven Price <steven.price@arm.com> wrote: > >> The VMM needs to populate the realm with some data before starting (e.g. >> a kernel and initrd). This is measured by the RMM and used as part of >> the attestation later on. >> >> Signed-off-by: Steven Price <steven.price@arm.com> >> --- >> arch/arm64/kvm/rme.c | 366 +++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 366 insertions(+) >> >> diff --git a/arch/arm64/kvm/rme.c b/arch/arm64/kvm/rme.c >> index 16e0bfea98b1..3405b43e1421 100644 >> --- a/arch/arm64/kvm/rme.c >> +++ b/arch/arm64/kvm/rme.c >> @@ -4,6 +4,7 @@ >> */ >> >> #include <linux/kvm_host.h> >> +#include <linux/hugetlb.h> >> >> #include <asm/kvm_emulate.h> >> #include <asm/kvm_mmu.h> >> @@ -426,6 +427,359 @@ void kvm_realm_unmap_range(struct kvm *kvm, unsigned long ipa, u64 size) >> } >> } >> >> +static int realm_create_protected_data_page(struct realm *realm, >> + unsigned long ipa, >> + struct page *dst_page, >> + struct page *tmp_page) >> +{ >> + phys_addr_t dst_phys, tmp_phys; >> + int ret; >> + >> + copy_page(page_address(tmp_page), page_address(dst_page)); >> + >> + dst_phys = page_to_phys(dst_page); >> + tmp_phys = page_to_phys(tmp_page); >> + >> + if (rmi_granule_delegate(dst_phys)) >> + return -ENXIO; >> + >> + ret = rmi_data_create(dst_phys, virt_to_phys(realm->rd), ipa, tmp_phys, >> + RMI_MEASURE_CONTENT); >> + >> + if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) { >> + /* Create missing RTTs and retry */ >> + int level = RMI_RETURN_INDEX(ret); >> + >> + ret = realm_create_rtt_levels(realm, ipa, level, >> + RME_RTT_MAX_LEVEL, NULL); >> + if (ret) >> + goto err; >> + >> + ret = rmi_data_create(dst_phys, virt_to_phys(realm->rd), ipa, >> + tmp_phys, RMI_MEASURE_CONTENT); >> + } >> + >> + if (ret) >> + goto err; >> + >> + return 0; >> + >> +err: >> + if (WARN_ON(rmi_granule_undelegate(dst_phys))) { >> + /* Page can't be returned to NS world so is lost */ >> + get_page(dst_page); >> + } >> + return -ENXIO; >> +} >> + >> +static int fold_rtt(phys_addr_t rd, unsigned long addr, int level, >> + struct realm *realm) >> +{ >> + struct rtt_entry rtt; >> + phys_addr_t rtt_addr; >> + >> + if (rmi_rtt_read_entry(rd, addr, level, &rtt)) >> + return -ENXIO; >> + >> + if (rtt.state != RMI_TABLE) >> + return -EINVAL; >> + >> + rtt_addr = rmi_rtt_get_phys(&rtt); >> + if (rmi_rtt_fold(rtt_addr, rd, addr, level + 1)) >> + return -ENXIO; >> + >> + free_delegated_page(realm, rtt_addr); >> + >> + return 0; >> +} >> + >> +int realm_map_protected(struct realm *realm, >> + unsigned long hva, >> + unsigned long base_ipa, >> + struct page *dst_page, >> + unsigned long map_size, >> + struct kvm_mmu_memory_cache *memcache) >> +{ >> + phys_addr_t dst_phys = page_to_phys(dst_page); >> + phys_addr_t rd = virt_to_phys(realm->rd); >> + unsigned long phys = dst_phys; >> + unsigned long ipa = base_ipa; >> + unsigned long size; >> + int map_level; >> + int ret = 0; >> + >> + if (WARN_ON(!IS_ALIGNED(ipa, map_size))) >> + return -EINVAL; >> + >> + switch (map_size) { >> + case PAGE_SIZE: >> + map_level = 3; >> + break; >> + case RME_L2_BLOCK_SIZE: >> + map_level = 2; >> + break; >> + default: >> + return -EINVAL; >> + } >> + >> + if (map_level < RME_RTT_MAX_LEVEL) { >> + /* >> + * A temporary RTT is needed during the map, precreate it, >> + * however if there is an error (e.g. missing parent tables) >> + * this will be handled below. >> + */ >> + realm_create_rtt_levels(realm, ipa, map_level, >> + RME_RTT_MAX_LEVEL, memcache); >> + } >> + >> + for (size = 0; size < map_size; size += PAGE_SIZE) { >> + if (rmi_granule_delegate(phys)) { >> + struct rtt_entry rtt; >> + >> + /* >> + * It's possible we raced with another VCPU on the same >> + * fault. If the entry exists and matches then exit >> + * early and assume the other VCPU will handle the >> + * mapping. >> + */ >> + if (rmi_rtt_read_entry(rd, ipa, RME_RTT_MAX_LEVEL, &rtt)) >> + goto err; >> + >> + // FIXME: For a block mapping this could race at level >> + // 2 or 3... >> + if (WARN_ON((rtt.walk_level != RME_RTT_MAX_LEVEL || >> + rtt.state != RMI_ASSIGNED || >> + rtt.desc != phys))) { >> + goto err; >> + } >> + >> + return 0; >> + } >> + >> + ret = rmi_data_create_unknown(phys, rd, ipa); >> + >> + if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) { >> + /* Create missing RTTs and retry */ >> + int level = RMI_RETURN_INDEX(ret); >> + >> + ret = realm_create_rtt_levels(realm, ipa, level, >> + RME_RTT_MAX_LEVEL, >> + memcache); >> + WARN_ON(ret); >> + if (ret) >> + goto err_undelegate; >> + >> + ret = rmi_data_create_unknown(phys, rd, ipa); >> + } >> + WARN_ON(ret); >> + >> + if (ret) >> + goto err_undelegate; >> + >> + phys += PAGE_SIZE; >> + ipa += PAGE_SIZE; >> + } >> + >> + if (map_size == RME_L2_BLOCK_SIZE) >> + ret = fold_rtt(rd, base_ipa, map_level, realm); >> + if (WARN_ON(ret)) >> + goto err; >> + >> + return 0; >> + >> +err_undelegate: >> + if (WARN_ON(rmi_granule_undelegate(phys))) { >> + /* Page can't be returned to NS world so is lost */ >> + get_page(phys_to_page(phys)); >> + } >> +err: >> + while (size > 0) { >> + phys -= PAGE_SIZE; >> + size -= PAGE_SIZE; >> + ipa -= PAGE_SIZE; >> + >> + rmi_data_destroy(rd, ipa); >> + >> + if (WARN_ON(rmi_granule_undelegate(phys))) { >> + /* Page can't be returned to NS world so is lost */ >> + get_page(phys_to_page(phys)); >> + } >> + } >> + return -ENXIO; >> +} >> + > > There seems no caller to the function above. Better move it to the related > patch. Indeed this should really be in the next patch - will move as it's very confusing having it in this patch (sorry about that). >> +static int populate_par_region(struct kvm *kvm, >> + phys_addr_t ipa_base, >> + phys_addr_t ipa_end) >> +{ >> + struct realm *realm = &kvm->arch.realm; >> + struct kvm_memory_slot *memslot; >> + gfn_t base_gfn, end_gfn; >> + int idx; >> + phys_addr_t ipa; >> + int ret = 0; >> + struct page *tmp_page; >> + phys_addr_t rd = virt_to_phys(realm->rd); >> + >> + base_gfn = gpa_to_gfn(ipa_base); >> + end_gfn = gpa_to_gfn(ipa_end); >> + >> + idx = srcu_read_lock(&kvm->srcu); >> + memslot = gfn_to_memslot(kvm, base_gfn); >> + if (!memslot) { >> + ret = -EFAULT; >> + goto out; >> + } >> + >> + /* We require the region to be contained within a single memslot */ >> + if (memslot->base_gfn + memslot->npages < end_gfn) { >> + ret = -EINVAL; >> + goto out; >> + } >> + >> + tmp_page = alloc_page(GFP_KERNEL); >> + if (!tmp_page) { >> + ret = -ENOMEM; >> + goto out; >> + } >> + >> + mmap_read_lock(current->mm); >> + >> + ipa = ipa_base; >> + >> + while (ipa < ipa_end) { >> + struct vm_area_struct *vma; >> + unsigned long map_size; >> + unsigned int vma_shift; >> + unsigned long offset; >> + unsigned long hva; >> + struct page *page; >> + kvm_pfn_t pfn; >> + int level; >> + >> + hva = gfn_to_hva_memslot(memslot, gpa_to_gfn(ipa)); >> + vma = vma_lookup(current->mm, hva); >> + if (!vma) { >> + ret = -EFAULT; >> + break; >> + } >> + >> + if (is_vm_hugetlb_page(vma)) >> + vma_shift = huge_page_shift(hstate_vma(vma)); >> + else >> + vma_shift = PAGE_SHIFT; >> + >> + map_size = 1 << vma_shift; >> + >> + /* >> + * FIXME: This causes over mapping, but there's no good >> + * solution here with the ABI as it stands >> + */ >> + ipa = ALIGN_DOWN(ipa, map_size); >> + >> + switch (map_size) { >> + case RME_L2_BLOCK_SIZE: >> + level = 2; >> + break; >> + case PAGE_SIZE: >> + level = 3; >> + break; >> + default: >> + WARN_ONCE(1, "Unsupport vma_shift %d", vma_shift); >> + ret = -EFAULT; >> + break; >> + } >> + >> + pfn = gfn_to_pfn_memslot(memslot, gpa_to_gfn(ipa)); >> + >> + if (is_error_pfn(pfn)) { >> + ret = -EFAULT; >> + break; >> + } >> + >> + ret = rmi_rtt_init_ripas(rd, ipa, level); >> + if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) { >> + ret = realm_create_rtt_levels(realm, ipa, >> + RMI_RETURN_INDEX(ret), >> + level, NULL); >> + if (ret) >> + break; >> + ret = rmi_rtt_init_ripas(rd, ipa, level); >> + if (ret) { >> + ret = -ENXIO; >> + break; >> + } >> + } >> + >> + if (level < RME_RTT_MAX_LEVEL) { >> + /* >> + * A temporary RTT is needed during the map, precreate >> + * it, however if there is an error (e.g. missing >> + * parent tables) this will be handled in the >> + * realm_create_protected_data_page() call. >> + */ >> + realm_create_rtt_levels(realm, ipa, level, >> + RME_RTT_MAX_LEVEL, NULL); >> + } >> + >> + page = pfn_to_page(pfn); >> + >> + for (offset = 0; offset < map_size && !ret; >> + offset += PAGE_SIZE, page++) { >> + phys_addr_t page_ipa = ipa + offset; >> + >> + ret = realm_create_protected_data_page(realm, page_ipa, >> + page, tmp_page); >> + } >> + if (ret) >> + goto err_release_pfn; >> + >> + if (level == 2) { >> + ret = fold_rtt(rd, ipa, level, realm); >> + if (ret) >> + goto err_release_pfn; >> + } >> + >> + ipa += map_size; > >> + kvm_set_pfn_accessed(pfn); >> + kvm_set_pfn_dirty(pfn); > > kvm_release_pfn_dirty() has already called kvm_set_pfn_{accessed, dirty}(). Will remove those calls. >> + kvm_release_pfn_dirty(pfn); >> +err_release_pfn: >> + if (ret) { >> + kvm_release_pfn_clean(pfn); >> + break; >> + } >> + } >> + >> + mmap_read_unlock(current->mm); >> + __free_page(tmp_page); >> + >> +out: >> + srcu_read_unlock(&kvm->srcu, idx); >> + return ret; >> +} >> + >> +static int kvm_populate_realm(struct kvm *kvm, >> + struct kvm_cap_arm_rme_populate_realm_args *args) >> +{ >> + phys_addr_t ipa_base, ipa_end; >> + > > Check kvm_is_realm(kvm) here or in the kvm_realm_enable_cap(). I'm going to update kvm_vm_ioctl_enable_cap() to check kvm_is_realm() so we won't get here. >> + if (kvm_realm_state(kvm) != REALM_STATE_NEW) >> + return -EBUSY; > > Maybe -EINVAL? The realm hasn't been created (RMI_REALM_CREATE is not called > yet). The userspace shouldn't reach this path. Well user space can attempt to populate in the ACTIVE state - which is where the idea of 'busy' comes from. Admittedly it's a little confusing when RMI_REALM_CREATE hasn't been called. I'm not particularly bothered about the return code, but it's useful to have a different code to -EINVAL as it's not an invalid argument, but calling at the wrong time. I can't immediately see a better error code though. Steve >> + >> + if (!IS_ALIGNED(args->populate_ipa_base, PAGE_SIZE) || >> + !IS_ALIGNED(args->populate_ipa_size, PAGE_SIZE)) >> + return -EINVAL; >> + >> + ipa_base = args->populate_ipa_base; >> + ipa_end = ipa_base + args->populate_ipa_size; >> + >> + if (ipa_end < ipa_base) >> + return -EINVAL; >> + >> + return populate_par_region(kvm, ipa_base, ipa_end); >> +} >> + >> static int set_ipa_state(struct kvm_vcpu *vcpu, >> unsigned long ipa, >> unsigned long end, >> @@ -748,6 +1102,18 @@ int kvm_realm_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) >> r = kvm_init_ipa_range_realm(kvm, &args); >> break; >> } >> + case KVM_CAP_ARM_RME_POPULATE_REALM: { >> + struct kvm_cap_arm_rme_populate_realm_args args; >> + void __user *argp = u64_to_user_ptr(cap->args[1]); >> + >> + if (copy_from_user(&args, argp, sizeof(args))) { >> + r = -EFAULT; >> + break; >> + } >> + >> + r = kvm_populate_realm(kvm, &args); >> + break; >> + } >> default: >> r = -EINVAL; >> break; > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-03-10 15:47 UTC|newest] Thread overview: 386+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-01-27 11:22 [RFC] Support for Arm CCA VMs on Linux Suzuki K Poulose 2023-01-27 11:22 ` Suzuki K Poulose 2023-01-27 11:27 ` [RFC PATCH 00/14] arm64: Support for running as a guest in Arm CCA Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 01/14] arm64: remove redundant 'extern' Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 02/14] arm64: rsi: Add RSI definitions Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 03/14] arm64: Detect if in a realm and set RIPAS RAM Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 04/14] arm64: realm: Query IPA size from the RMM Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 05/14] arm64: Mark all I/O as non-secure shared Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 06/14] fixmap: Allow architecture overriding set_fixmap_io Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 07/14] arm64: Override set_fixmap_io Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 08/14] arm64: Make the PHYS_MASK_SHIFT dynamic Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-29 2:59 ` kernel test robot 2023-01-29 20:54 ` kernel test robot 2023-01-27 11:27 ` [RFC PATCH 09/14] arm64: Enforce bounce buffers for realm DMA Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 10/14] arm64: Enable memory encrypt for Realms Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 11/14] arm64: Force device mappings to be non-secure shared Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 12/14] efi: arm64: Map Device with Prot Shared Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 13/14] arm64: realm: Support nonsecure ITS emulation shared Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:27 ` [RFC PATCH 14/14] HACK: Accept prototype RSI version Steven Price 2023-01-27 11:27 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 00/28] arm64: Support for Arm CCA in KVM Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 01/28] arm64: RME: Handle Granule Protection Faults (GPFs) Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 02/28] arm64: RME: Add SMC definitions for calling the RMM Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 03/28] arm64: RME: Add wrappers for RMI calls Steven Price 2023-01-27 11:29 ` Steven Price 2023-02-13 16:43 ` Zhi Wang 2023-02-13 16:43 ` Zhi Wang 2024-03-18 7:03 ` Ganapatrao Kulkarni 2024-03-18 7:03 ` Ganapatrao Kulkarni 2024-03-18 11:22 ` Steven Price 2024-03-18 11:22 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 04/28] arm64: RME: Check for RME support at KVM init Steven Price 2023-01-27 11:29 ` Steven Price 2023-02-13 15:48 ` Zhi Wang 2023-02-13 15:48 ` Zhi Wang 2023-02-13 15:59 ` Steven Price 2023-02-13 15:59 ` Steven Price 2023-03-04 12:07 ` Zhi Wang 2023-03-04 12:07 ` Zhi Wang 2023-02-13 15:55 ` Zhi Wang 2023-02-13 15:55 ` Zhi Wang 2024-03-18 7:17 ` Ganapatrao Kulkarni 2024-03-18 7:17 ` Ganapatrao Kulkarni 2024-03-18 11:22 ` Steven Price 2024-03-18 11:22 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 05/28] arm64: RME: Define the user ABI Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-29 0:46 ` kernel test robot 2023-02-13 16:04 ` Zhi Wang 2023-02-13 16:04 ` Zhi Wang 2023-03-01 11:54 ` Steven Price 2023-03-01 11:54 ` Steven Price 2023-03-01 20:21 ` Zhi Wang 2023-03-01 20:21 ` Zhi Wang 2023-01-27 11:29 ` [RFC PATCH 06/28] arm64: RME: ioctls to create and configure realms Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-29 6:34 ` kernel test robot 2023-02-07 12:25 ` Jean-Philippe Brucker 2023-02-07 12:25 ` Jean-Philippe Brucker 2023-02-07 12:55 ` Suzuki K Poulose 2023-02-07 12:55 ` Suzuki K Poulose 2023-02-13 16:10 ` Zhi Wang 2023-02-13 16:10 ` Zhi Wang 2023-03-01 11:55 ` Steven Price 2023-03-01 11:55 ` Steven Price 2023-03-01 20:33 ` Zhi Wang 2023-03-01 20:33 ` Zhi Wang 2023-03-06 19:10 ` Zhi Wang 2023-03-06 19:10 ` Zhi Wang 2023-03-10 15:47 ` Steven Price 2023-03-10 15:47 ` Steven Price 2024-03-18 7:40 ` Ganapatrao Kulkarni 2024-03-18 7:40 ` Ganapatrao Kulkarni 2024-03-18 11:22 ` Steven Price 2024-03-18 11:22 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 07/28] arm64: kvm: Allow passing machine type in KVM creation Steven Price 2023-01-27 11:29 ` Steven Price 2023-02-13 16:35 ` Zhi Wang 2023-02-13 16:35 ` Zhi Wang 2023-03-01 11:55 ` Steven Price 2023-03-01 11:55 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 08/28] arm64: RME: Keep a spare page delegated to the RMM Steven Price 2023-01-27 11:29 ` Steven Price 2023-02-13 16:47 ` Zhi Wang 2023-02-13 16:47 ` Zhi Wang 2023-03-01 11:55 ` Steven Price 2023-03-01 11:55 ` Steven Price 2023-03-01 20:50 ` Zhi Wang 2023-03-01 20:50 ` Zhi Wang 2023-01-27 11:29 ` [RFC PATCH 09/28] arm64: RME: RTT handling Steven Price 2023-01-27 11:29 ` Steven Price 2023-02-13 17:44 ` Zhi Wang 2023-02-13 17:44 ` Zhi Wang 2023-03-03 14:04 ` Steven Price 2023-03-03 14:04 ` Steven Price 2023-03-04 12:32 ` Zhi Wang 2023-03-04 12:32 ` Zhi Wang 2024-03-18 11:01 ` Ganapatrao Kulkarni 2024-03-18 11:01 ` Ganapatrao Kulkarni 2024-03-18 11:25 ` Steven Price 2024-03-18 11:25 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 10/28] arm64: RME: Allocate/free RECs to match vCPUs Steven Price 2023-01-27 11:29 ` Steven Price 2023-02-13 18:08 ` Zhi Wang 2023-02-13 18:08 ` Zhi Wang 2023-03-03 14:05 ` Steven Price 2023-03-03 14:05 ` Steven Price 2023-03-04 12:46 ` Zhi Wang 2023-03-04 12:46 ` Zhi Wang 2023-01-27 11:29 ` [RFC PATCH 11/28] arm64: RME: Support for the VGIC in realms Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 12/28] KVM: arm64: Support timers in realm RECs Steven Price 2023-01-27 11:29 ` Steven Price 2024-03-18 11:28 ` Ganapatrao Kulkarni 2024-03-18 11:28 ` Ganapatrao Kulkarni 2024-03-18 14:14 ` Steven Price 2024-03-18 14:14 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 13/28] arm64: RME: Allow VMM to set RIPAS Steven Price 2023-01-27 11:29 ` Steven Price 2023-02-17 13:07 ` Zhi Wang 2023-02-17 13:07 ` Zhi Wang 2023-03-03 14:05 ` Steven Price 2023-03-03 14:05 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 14/28] arm64: RME: Handle realm enter/exit Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 15/28] KVM: arm64: Handle realm MMIO emulation Steven Price 2023-01-27 11:29 ` Steven Price 2023-03-06 15:37 ` Zhi Wang 2023-03-06 15:37 ` Zhi Wang 2023-03-10 15:47 ` Steven Price 2023-03-10 15:47 ` Steven Price 2023-03-14 15:44 ` Zhi Wang 2023-03-14 15:44 ` Zhi Wang 2023-03-22 11:51 ` Steven Price 2023-03-22 11:51 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 16/28] arm64: RME: Allow populating initial contents Steven Price 2023-01-27 11:29 ` Steven Price 2023-03-06 17:34 ` Zhi Wang 2023-03-06 17:34 ` Zhi Wang 2023-03-10 15:47 ` Steven Price [this message] 2023-03-10 15:47 ` Steven Price 2023-03-14 15:31 ` Zhi Wang 2023-03-14 15:31 ` Zhi Wang 2023-03-22 11:51 ` Steven Price 2023-03-22 11:51 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 17/28] arm64: RME: Runtime faulting of memory Steven Price 2023-01-27 11:29 ` Steven Price 2023-03-06 18:20 ` Zhi Wang 2023-03-06 18:20 ` Zhi Wang 2023-03-10 15:47 ` Steven Price 2023-03-10 15:47 ` Steven Price 2023-03-14 16:41 ` Zhi Wang 2023-03-14 16:41 ` Zhi Wang 2023-01-27 11:29 ` [RFC PATCH 18/28] KVM: arm64: Handle realm VCPU load Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 19/28] KVM: arm64: Validate register access for a Realm VM Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 20/28] KVM: arm64: Handle Realm PSCI requests Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 21/28] KVM: arm64: WARN on injected undef exceptions Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 22/28] arm64: Don't expose stolen time for realm guests Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 23/28] KVM: arm64: Allow activating realms Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 24/28] arm64: rme: allow userspace to inject aborts Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 25/28] arm64: rme: support RSI_HOST_CALL Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 26/28] arm64: rme: Allow checking SVE on VM instance Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 27/28] arm64: RME: Always use 4k pages for realms Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:29 ` [RFC PATCH 28/28] HACK: Accept prototype RMI versions Steven Price 2023-01-27 11:29 ` Steven Price 2023-01-27 11:39 ` [RFC kvmtool 00/31] arm64: Support for Arm Confidential Compute Architecture Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 01/31] arm64: Disable MTE when CFI flash is emulated Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 02/31] script: update_headers: Ignore missing architectures Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 03/31] hw: cfi flash: Handle errors in memory transitions Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 04/31] Add --nocompat option to disable compat warnings Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 12:19 ` Alexandru Elisei 2023-01-27 12:19 ` Alexandru Elisei 2023-01-27 11:39 ` [RFC kvmtool 05/31] arm64: Check pvtime support against the KVM instance Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 06/31] arm64: Check SVE capability on the VM instance Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 07/31] arm64: Add option to disable SVE Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 08/31] linux: Update kernel headers for RME support Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 09/31] arm64: Add --realm command line option Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 10/31] arm64: Create a realm virtual machine Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 11/31] arm64: Lock realm RAM in memory Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 12/31] arm64: Create Realm Descriptor Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 13/31] arm64: Add --measurement-algo command line option for a realm Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 14/31] arm64: Add configuration step for Realms Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 15/31] arm64: Add support for Realm Personalisation Value Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 16/31] arm64: Add support for specifying the SVE vector length for Realm Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 17/31] arm: Add kernel size to VM context Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 18/31] arm64: Populate initial realm contents Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-03-02 14:03 ` Piotr Sawicki 2023-03-02 14:03 ` Piotr Sawicki 2023-03-02 14:06 ` Suzuki K Poulose 2023-03-02 14:06 ` Suzuki K Poulose 2023-10-02 9:28 ` Piotr Sawicki 2023-10-02 9:28 ` Piotr Sawicki 2023-01-27 11:39 ` [RFC kvmtool 19/31] arm64: Don't try to set PSTATE for VCPUs belonging to a realm Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 20/31] arm64: Finalize realm VCPU after reset Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 21/31] init: Add last_{init, exit} list macros Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 22/31] arm64: Activate realm before the first VCPU is run Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 23/31] arm64: Specify SMC as the PSCI conduits for realms Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 24/31] arm64: Don't try to debug a realm Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 25/31] arm64: realm: Double the IPA space Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 26/31] virtio: Add a wrapper for get_host_features Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 27/31] virtio: Add arch specific hook for virtio host flags Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 28/31] arm64: realm: Enforce virtio F_ACCESS_PLATFORM flag Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 29/31] mmio: add arch hook for an unhandled MMIO access Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 30/31] arm64: realm: inject an abort on " Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-01-27 11:39 ` [RFC kvmtool 31/31] arm64: Allow the user to create a realm Suzuki K Poulose 2023-01-27 11:39 ` Suzuki K Poulose 2023-10-02 9:45 ` [RFC kvmtool 00/31] arm64: Support for Arm Confidential Compute Architecture Piotr Sawicki 2023-10-02 9:45 ` Piotr Sawicki 2023-01-27 11:40 ` [RFC kvm-unit-tests 00/27] " Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 01/27] lib/string: include stddef.h for size_t Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-31 14:43 ` Thomas Huth 2023-01-31 14:43 ` Thomas Huth 2023-01-27 11:40 ` [RFC kvm-unit-tests 02/27] arm: Expand SMCCC arguments and return values Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 03/27] arm: realm: Add RSI interface header Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 04/27] arm: Make physical address mask dynamic Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 05/27] arm: Introduce NS_SHARED PTE attribute Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 06/27] arm: Move io_init after vm initialization Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 07/27] arm: realm: Make uart available before MMU is enabled Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 08/27] arm: realm: Realm initialisation Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 09/27] arm: realm: Add support for changing the state of memory Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 10/27] arm: realm: Set RIPAS state for RAM Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 11/27] arm: realm: Early memory setup Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 12/27] arm: realm: Add RSI version test Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 13/27] arm: selftest: realm: skip pabt test when running in a realm Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 14/27] arm: realm: add hvc and RSI_HOST_CALL tests Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 15/27] arm: realm: Add test for FPU/SIMD context save/restore Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 16/27] arm: realm: Add tests for in realm SEA Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 17/27] lib/alloc_page: Add shared page allocation support Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:40 ` [RFC kvm-unit-tests 18/27] arm: gic-v3-its: Use shared pages wherever needed Joey Gouly 2023-01-27 11:40 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 19/27] arm: realm: Enable memory encryption Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 20/27] qcbor: Add QCBOR as a submodule Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 21/27] arm: Add build steps for QCBOR library Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 22/27] arm: Add a library to verify tokens using the " Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 23/27] arm: realm: add RSI interface for attestation measurements Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 24/27] arm: realm: Add helpers to decode RSI return codes Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 25/27] arm: realm: Add Realm attestation tests Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 26/27] arm: realm: Add a test for shared memory Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 11:41 ` [RFC kvm-unit-tests 27/27] NOT-FOR-MERGING: add run-realm-tests Joey Gouly 2023-01-27 11:41 ` Joey Gouly 2023-01-27 15:26 ` [RFC] Support for Arm CCA VMs on Linux Jean-Philippe Brucker 2023-01-27 15:26 ` Jean-Philippe Brucker 2023-02-28 23:35 ` Itaru Kitayama 2023-02-28 23:35 ` Itaru Kitayama 2023-03-01 9:20 ` Jean-Philippe Brucker 2023-03-01 9:20 ` Jean-Philippe Brucker 2023-03-01 22:12 ` Itaru Kitayama 2023-03-01 22:12 ` Itaru Kitayama 2023-03-02 9:18 ` Jean-Philippe Brucker 2023-03-02 9:18 ` Jean-Philippe Brucker 2023-03-03 9:46 ` Jean-Philippe Brucker 2023-03-03 9:46 ` Jean-Philippe Brucker 2023-03-03 9:54 ` Suzuki K Poulose 2023-03-03 9:54 ` Suzuki K Poulose 2023-03-03 11:39 ` Jean-Philippe Brucker 2023-03-03 11:39 ` Jean-Philippe Brucker 2023-03-03 12:08 ` Andrew Jones 2023-03-03 12:08 ` Andrew Jones 2023-03-03 12:19 ` Suzuki K Poulose 2023-03-03 12:19 ` Suzuki K Poulose 2023-03-03 13:06 ` Cornelia Huck 2023-03-03 13:06 ` Cornelia Huck 2023-03-03 13:57 ` Jean-Philippe Brucker 2023-03-03 13:57 ` Jean-Philippe Brucker 2023-02-10 16:51 ` Ryan Roberts 2023-02-10 16:51 ` Ryan Roberts 2023-02-10 22:53 ` Itaru Kitayama 2023-02-10 22:53 ` Itaru Kitayama 2023-02-17 8:02 ` Itaru Kitayama 2023-02-17 8:02 ` Itaru Kitayama 2023-02-20 10:51 ` Ryan Roberts 2023-02-20 10:51 ` Ryan Roberts 2023-02-14 17:13 ` Dr. David Alan Gilbert 2023-02-14 17:13 ` Dr. David Alan Gilbert 2023-03-01 9:58 ` Suzuki K Poulose 2023-03-01 9:58 ` Suzuki K Poulose 2023-03-02 16:46 ` Dr. David Alan Gilbert 2023-03-02 16:46 ` Dr. David Alan Gilbert 2023-03-02 19:02 ` Suzuki K Poulose 2023-03-02 19:02 ` Suzuki K Poulose 2023-07-14 13:46 ` Jonathan Cameron 2023-07-14 13:46 ` Jonathan Cameron 2023-07-14 13:46 ` Jonathan Cameron 2023-07-14 15:03 ` Suzuki K Poulose 2023-07-14 15:03 ` Suzuki K Poulose 2023-07-14 16:28 ` Jonathan Cameron 2023-07-14 16:28 ` Jonathan Cameron 2023-07-14 16:28 ` Jonathan Cameron 2023-07-17 9:40 ` Suzuki K Poulose 2023-07-17 9:40 ` Suzuki K Poulose 2023-10-02 12:43 ` Suzuki K Poulose 2023-10-02 12:43 ` Suzuki K Poulose 2024-01-10 5:40 ` Itaru Kitayama 2024-01-10 5:40 ` Itaru Kitayama 2024-01-10 11:41 ` Suzuki K Poulose 2024-01-10 11:41 ` Suzuki K Poulose 2024-01-10 13:44 ` Suzuki K Poulose 2024-01-10 13:44 ` Suzuki K Poulose 2024-01-19 1:26 ` Itaru Kitayama 2024-01-19 1:26 ` Itaru Kitayama 2024-01-12 5:01 ` Itaru Kitayama 2024-01-12 5:01 ` Itaru Kitayama
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=6c6ff608-2314-a49a-84ee-fac883c4e227@arm.com \ --to=steven.price@arm.com \ --cc=alexandru.elisei@arm.com \ --cc=catalin.marinas@arm.com \ --cc=christoffer.dall@arm.com \ --cc=james.morse@arm.com \ --cc=joey.gouly@arm.com \ --cc=kvm@vger.kernel.org \ --cc=kvmarm@lists.linux.dev \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-coco@lists.linux.dev \ --cc=linux-kernel@vger.kernel.org \ --cc=maz@kernel.org \ --cc=oliver.upton@linux.dev \ --cc=suzuki.poulose@arm.com \ --cc=tabba@google.com \ --cc=will@kernel.org \ --cc=yuzenghui@huawei.com \ --cc=zhi.wang.linux@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.