Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 373146
b: refs/heads/master
c: 2fb4105
h: refs/heads/master
v: v3
  • Loading branch information
Marc Zyngier authored and Christoffer Dall committed Apr 29, 2013
1 parent 09fbef6 commit c94e4ba
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 35 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3562c76dcb9ce84853c835eec12a911bf3a8e2da
refs/heads/master: 2fb410596ca917fe6419be61ee5bc1782b17d947
1 change: 0 additions & 1 deletion trunk/arch/arm/include/asm/idmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#define __idmap __section(.idmap.text) noinline notrace

extern pgd_t *idmap_pgd;
extern pgd_t *hyp_pgd;

void setup_mm_for_reboot(void);

Expand Down
1 change: 0 additions & 1 deletion trunk/arch/arm/include/asm/kvm_mmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

#include <asm/cacheflush.h>
#include <asm/pgalloc.h>
#include <asm/idmap.h>

/*
* We directly use the kernel VA for the HYP, as we can directly share
Expand Down
24 changes: 23 additions & 1 deletion trunk/arch/arm/kvm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

extern char __hyp_idmap_text_start[], __hyp_idmap_text_end[];

static pgd_t *hyp_pgd;
static DEFINE_MUTEX(kvm_hyp_pgd_mutex);

static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
Expand Down Expand Up @@ -715,12 +716,33 @@ phys_addr_t kvm_mmu_get_httbr(void)

int kvm_mmu_init(void)
{
unsigned long hyp_idmap_start = virt_to_phys(__hyp_idmap_text_start);
unsigned long hyp_idmap_end = virt_to_phys(__hyp_idmap_text_end);
int err;

hyp_pgd = kzalloc(PTRS_PER_PGD * sizeof(pgd_t), GFP_KERNEL);
if (!hyp_pgd) {
kvm_err("Hyp mode PGD not allocated\n");
return -ENOMEM;
err = -ENOMEM;
goto out;
}

/* Create the idmap in the boot page tables */
err = __create_hyp_mappings(boot_hyp_pgd,
hyp_idmap_start, hyp_idmap_end,
__phys_to_pfn(hyp_idmap_start),
PAGE_HYP);

if (err) {
kvm_err("Failed to idmap %lx-%lx\n",
hyp_idmap_start, hyp_idmap_end);
goto out;
}

return 0;
out:
kfree(hyp_pgd);
return err;
}

/**
Expand Down
32 changes: 1 addition & 31 deletions trunk/arch/arm/mm/idmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#include <asm/pgtable.h>
#include <asm/sections.h>
#include <asm/system_info.h>
#include <asm/virt.h>

pgd_t *idmap_pgd;

Expand Down Expand Up @@ -83,37 +82,10 @@ static void identity_mapping_add(pgd_t *pgd, const char *text_start,
} while (pgd++, addr = next, addr != end);
}

#if defined(CONFIG_ARM_VIRT_EXT) && defined(CONFIG_ARM_LPAE)
pgd_t *hyp_pgd;

extern char __hyp_idmap_text_start[], __hyp_idmap_text_end[];

static int __init init_static_idmap_hyp(void)
{
hyp_pgd = kzalloc(PTRS_PER_PGD * sizeof(pgd_t), GFP_KERNEL);
if (!hyp_pgd)
return -ENOMEM;

pr_info("Setting up static HYP identity map for 0x%p - 0x%p\n",
__hyp_idmap_text_start, __hyp_idmap_text_end);
identity_mapping_add(hyp_pgd, __hyp_idmap_text_start,
__hyp_idmap_text_end, PMD_SECT_AP1);

return 0;
}
#else
static int __init init_static_idmap_hyp(void)
{
return 0;
}
#endif

extern char __idmap_text_start[], __idmap_text_end[];

static int __init init_static_idmap(void)
{
int ret;

idmap_pgd = pgd_alloc(&init_mm);
if (!idmap_pgd)
return -ENOMEM;
Expand All @@ -123,12 +95,10 @@ static int __init init_static_idmap(void)
identity_mapping_add(idmap_pgd, __idmap_text_start,
__idmap_text_end, 0);

ret = init_static_idmap_hyp();

/* Flush L1 for the hardware to see this page table content */
flush_cache_louis();

return ret;
return 0;
}
early_initcall(init_static_idmap);

Expand Down

0 comments on commit c94e4ba

Please sign in to comment.