x86 mmiotrace: split set_page_presence()
From 36772dcb6ffbbb68254cbfc379a103acd2fbfefc Mon Sep 17 00:00:00 2001 From: Pekka Paalanen <pq@iki.fi> Date: Sat, 28 Feb 2009 21:34:59 +0200 Split set_page_presence() in kmmio.c into two more functions set_pmd_presence() and set_pte_presence(). Purely code reorganization, no functional changes. Signed-off-by: Pekka Paalanen <pq@iki.fi> Cc: Stuart Bennett <stuart@freedesktop.org> Cc: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
5359b585fb
commit
0b700a6a25
1 changed files with 22 additions and 19 deletions
|
@ -107,12 +107,29 @@ static struct kmmio_fault_page *get_kmmio_fault_page(unsigned long page)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_pmd_presence(pmd_t *pmd, bool present, bool *old)
|
||||||
|
{
|
||||||
|
pmdval_t v = pmd_val(*pmd);
|
||||||
|
*old = !!(v & _PAGE_PRESENT);
|
||||||
|
v &= ~_PAGE_PRESENT;
|
||||||
|
if (present)
|
||||||
|
v |= _PAGE_PRESENT;
|
||||||
|
set_pmd(pmd, __pmd(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_pte_presence(pte_t *pte, bool present, bool *old)
|
||||||
|
{
|
||||||
|
pteval_t v = pte_val(*pte);
|
||||||
|
*old = !!(v & _PAGE_PRESENT);
|
||||||
|
v &= ~_PAGE_PRESENT;
|
||||||
|
if (present)
|
||||||
|
v |= _PAGE_PRESENT;
|
||||||
|
set_pte_atomic(pte, __pte(v));
|
||||||
|
}
|
||||||
|
|
||||||
static int set_page_presence(unsigned long addr, bool present, bool *old)
|
static int set_page_presence(unsigned long addr, bool present, bool *old)
|
||||||
{
|
{
|
||||||
pteval_t pteval;
|
|
||||||
pmdval_t pmdval;
|
|
||||||
unsigned int level;
|
unsigned int level;
|
||||||
pmd_t *pmd;
|
|
||||||
pte_t *pte = lookup_address(addr, &level);
|
pte_t *pte = lookup_address(addr, &level);
|
||||||
|
|
||||||
if (!pte) {
|
if (!pte) {
|
||||||
|
@ -122,31 +139,17 @@ static int set_page_presence(unsigned long addr, bool present, bool *old)
|
||||||
|
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case PG_LEVEL_2M:
|
case PG_LEVEL_2M:
|
||||||
pmd = (pmd_t *)pte;
|
set_pmd_presence((pmd_t *)pte, present, old);
|
||||||
pmdval = pmd_val(*pmd);
|
|
||||||
*old = !!(pmdval & _PAGE_PRESENT);
|
|
||||||
pmdval &= ~_PAGE_PRESENT;
|
|
||||||
if (present)
|
|
||||||
pmdval |= _PAGE_PRESENT;
|
|
||||||
set_pmd(pmd, __pmd(pmdval));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PG_LEVEL_4K:
|
case PG_LEVEL_4K:
|
||||||
pteval = pte_val(*pte);
|
set_pte_presence(pte, present, old);
|
||||||
*old = !!(pteval & _PAGE_PRESENT);
|
|
||||||
pteval &= ~_PAGE_PRESENT;
|
|
||||||
if (present)
|
|
||||||
pteval |= _PAGE_PRESENT;
|
|
||||||
set_pte_atomic(pte, __pte(pteval));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pr_err("kmmio: unexpected page level 0x%x.\n", level);
|
pr_err("kmmio: unexpected page level 0x%x.\n", level);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__flush_tlb_one(addr);
|
__flush_tlb_one(addr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue