|
@@ -674,7 +674,7 @@ static int stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache,
|
|
* @size: The size of the mapping
|
|
* @size: The size of the mapping
|
|
*/
|
|
*/
|
|
int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
|
|
int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
|
|
- phys_addr_t pa, unsigned long size)
|
|
|
|
|
|
+ phys_addr_t pa, unsigned long size, bool writable)
|
|
{
|
|
{
|
|
phys_addr_t addr, end;
|
|
phys_addr_t addr, end;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
@@ -687,6 +687,9 @@ int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
|
|
for (addr = guest_ipa; addr < end; addr += PAGE_SIZE) {
|
|
for (addr = guest_ipa; addr < end; addr += PAGE_SIZE) {
|
|
pte_t pte = pfn_pte(pfn, PAGE_S2_DEVICE);
|
|
pte_t pte = pfn_pte(pfn, PAGE_S2_DEVICE);
|
|
|
|
|
|
|
|
+ if (writable)
|
|
|
|
+ kvm_set_s2pte_writable(&pte);
|
|
|
|
+
|
|
ret = mmu_topup_memory_cache(&cache, 2, 2);
|
|
ret = mmu_topup_memory_cache(&cache, 2, 2);
|
|
if (ret)
|
|
if (ret)
|
|
goto out;
|
|
goto out;
|