diff options
Diffstat (limited to 'xen/arch/x86/audit.c')
-rw-r--r-- | xen/arch/x86/audit.c | 984 |
1 files changed, 0 insertions, 984 deletions
diff --git a/xen/arch/x86/audit.c b/xen/arch/x86/audit.c deleted file mode 100644 index bacdb9cc50..0000000000 --- a/xen/arch/x86/audit.c +++ /dev/null @@ -1,984 +0,0 @@ -/****************************************************************************** - * arch/x86/audit.c - * - * Copyright (c) 2002-2005 K A Fraser - * Copyright (c) 2004 Christian Limpach - * Copyright (c) 2005 Michael A Fetterman - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <xen/config.h> -#include <xen/init.h> -#include <xen/kernel.h> -#include <xen/lib.h> -#include <xen/mm.h> -#include <xen/perfc.h> -#include <asm/shadow.h> -#include <asm/page.h> -#include <asm/flushtlb.h> - -/* XXX SMP bug -- these should not be statics... */ -static int ttot=0, ctot=0, io_mappings=0, lowmem_mappings=0; -static int l1, l2, oos_count, page_count; - -#define FILE_AND_LINE 0 - -#if FILE_AND_LINE -#define adjust(_p, _a) _adjust((_p), (_a), __FILE__, __LINE__) -#define ADJUST_EXTRA_ARGS ,const char *file, int line -#define APRINTK(_f, _a...) printk(_f " %s:%d\n", ## _a, file, line) -#else -#define adjust _adjust -#define ADJUST_EXTRA_ARGS -#define APRINTK(_f, _a...) printk(_f "\n", ##_a) -#endif - -int audit_adjust_pgtables(struct domain *d, int dir, int noisy) -{ - int errors = 0; - int shadow_refcounts = !!shadow_mode_refcounts(d); - int shadow_enabled = !!shadow_mode_enabled(d); - - int l2limit( unsigned long mfn ) - { - - if ( shadow_mode_external(d) ) - return L2_PAGETABLE_ENTRIES; - -#ifdef __i386__ -#ifdef CONFIG_X86_PAE - /* 32b PAE */ - if ( (( mfn_to_page(mfn)->u.inuse.type_info & PGT_va_mask ) - >> PGT_va_shift) == 3 ) - return l2_table_offset(HYPERVISOR_VIRT_START); - else - return L2_PAGETABLE_ENTRIES; -#else - /* 32b non-PAE */ - return DOMAIN_ENTRIES_PER_L2_PAGETABLE; -#endif -#else - /* 64b */ - return 0; /* XXX x86/64 XXX */ -#endif - } - - void _adjust(struct page_info *page, int adjtype ADJUST_EXTRA_ARGS) - { - int count; - - if ( adjtype ) - { - /* adjust the type count */ - int tcount = page->u.inuse.type_info & PGT_count_mask; - tcount += dir; - ttot++; - - if ( page_get_owner(page) == NULL ) - { - APRINTK("adjust(mfn=%lx, dir=%d, adjtype=%d) owner=NULL", - page_to_mfn(page), dir, adjtype); - errors++; - } - - if ( tcount < 0 ) - { - APRINTK("Audit %d: type count went below zero " - "mfn=%lx t=%" PRtype_info " ot=%x", - d->domain_id, page_to_mfn(page), - page->u.inuse.type_info, - page->tlbflush_timestamp); - errors++; - } - else if ( (tcount & ~PGT_count_mask) != 0 ) - { - APRINTK("Audit %d: type count overflowed " - "mfn=%lx t=%" PRtype_info " ot=%x", - d->domain_id, page_to_mfn(page), - page->u.inuse.type_info, - page->tlbflush_timestamp); - errors++; - } - else - page->u.inuse.type_info += dir; - } - - /* adjust the general count */ - count = (page->count_info & PGC_count_mask) + dir; - ctot++; - - if ( count < 0 ) - { - APRINTK("Audit %d: general count went below zero " - "mfn=%lx t=%" PRtype_info " ot=%x", - d->domain_id, page_to_mfn(page), - page->u.inuse.type_info, - page->tlbflush_timestamp); - errors++; - } - else if ( (count & ~PGT_count_mask) != 0 ) - { - APRINTK("Audit %d: general count overflowed " - "mfn=%lx t=%" PRtype_info " ot=%x", - d->domain_id, page_to_mfn(page), - page->u.inuse.type_info, - page->tlbflush_timestamp); - errors++; - } - else - page->count_info += dir; - } - - void adjust_l2_page(unsigned long mfn, int shadow) - { - l2_pgentry_t *pt = map_domain_page(mfn); - int i; - u32 page_type; - - for ( i = 0; i < l2limit(mfn); i++ ) - { - if ( l2e_get_flags(pt[i]) & _PAGE_PRESENT ) - { - unsigned long l1mfn = l2e_get_pfn(pt[i]); - struct page_info *l1page = mfn_to_page(l1mfn); - - if ( noisy ) - { - if ( shadow ) - { - if ( page_get_owner(l1page) != NULL ) - { - printk("L2: Bizarre shadow L1 page mfn=%lx " - "belonging to a domain %p (id=%d)\n", - l1mfn, - page_get_owner(l1page), - page_get_owner(l1page)->domain_id); - errors++; - continue; - } - - page_type = l1page->u.inuse.type_info & PGT_type_mask; - if ( page_type != PGT_l1_shadow ) - { - printk("Audit %d: [Shadow L2 mfn=%lx i=%x] " - "Expected Shadow L1 t=%" PRtype_info - " mfn=%lx\n", - d->domain_id, mfn, i, - l1page->u.inuse.type_info, l1mfn); - errors++; - } - } - else - { - if ( page_get_owner(l1page) != d ) - { - printk("L2: Skip bizarre L1 page mfn=%lx " - "belonging to other dom %p (id=%d)\n", - l1mfn, - page_get_owner(l1page), - (page_get_owner(l1page) - ? page_get_owner(l1page)->domain_id - : -1)); - errors++; - continue; - } - - page_type = l1page->u.inuse.type_info & PGT_type_mask; - if ( page_type == PGT_l2_page_table ) - { - printk("Audit %d: [%x] Found %s Linear PT " - "t=%" PRtype_info " mfn=%lx\n", - d->domain_id, i, (l1mfn==mfn) ? "Self" : "Other", - l1page->u.inuse.type_info, l1mfn); - } - else if ( page_type != PGT_l1_page_table ) - { - printk("Audit %d: [L2 mfn=%lx i=%x] " - "Expected L1 t=%" PRtype_info " mfn=%lx\n", - d->domain_id, mfn, i, - l1page->u.inuse.type_info, l1mfn); - errors++; - } - } - } - - adjust(l1page, !shadow); - } - } - - if ( shadow_mode_translate(d) && !shadow_mode_external(d) ) - { - unsigned long hl2mfn = - l2e_get_pfn(pt[l2_table_offset(LINEAR_PT_VIRT_START)]); - struct page_info *hl2page = mfn_to_page(hl2mfn); - adjust(hl2page, 0); - } - - unmap_domain_page(pt); - } - - void adjust_hl2_page(unsigned long hl2mfn) - { - l2_pgentry_t *pt = map_domain_page(hl2mfn); - int i; - - for ( i = 0; i < l2limit(hl2mfn); i++ ) - { - if ( l2e_get_flags(pt[i]) & _PAGE_PRESENT ) - { - unsigned long mfn = l2e_get_pfn(pt[i]); - struct page_info *gpage = mfn_to_page(mfn); - - if ( mfn < 0x100 ) - { - lowmem_mappings++; - continue; - } - - if ( !mfn_valid(mfn) ) - { - io_mappings++; - continue; - } - - if ( noisy ) - { - if ( page_get_owner(gpage) != d ) - { - printk("Audit %d: [hl2mfn=%lx,i=%x] Skip foreign page " - "dom=%p (id=%d) mfn=%lx c=%08x t=%" - PRtype_info "\n", - d->domain_id, hl2mfn, i, - page_get_owner(gpage), - page_get_owner(gpage)->domain_id, - mfn, - gpage->count_info, - gpage->u.inuse.type_info); - continue; - } - } - adjust(gpage, 0); - } - } - - unmap_domain_page(pt); - } - - void adjust_l1_page(unsigned long l1mfn) - { - l1_pgentry_t *pt = map_domain_page(l1mfn); - int i; - - for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ ) - { - if ( l1e_get_flags(pt[i]) & _PAGE_PRESENT ) - { - unsigned long mfn = l1e_get_pfn(pt[i]); - struct page_info *gpage = mfn_to_page(mfn); - - if ( mfn < 0x100 ) - { - lowmem_mappings++; - continue; - } - - if ( !mfn_valid(mfn) ) - { - io_mappings++; - continue; - } - - if ( noisy ) - { - if ( l1e_get_flags(pt[i]) & _PAGE_RW ) - { - // If it's not a writable page, complain. - // - if ( !((gpage->u.inuse.type_info & PGT_type_mask) == - PGT_writable_page) ) - { - printk("Audit %d: [l1mfn=%lx, i=%x] Illegal RW " - "t=%" PRtype_info " mfn=%lx\n", - d->domain_id, l1mfn, i, - gpage->u.inuse.type_info, mfn); - errors++; - } - - if ( shadow_refcounts && - page_is_page_table(gpage) && - ! page_out_of_sync(gpage) ) - { - printk("Audit %d: [l1mfn=%lx, i=%x] Illegal RW of " - "page table mfn=%lx\n", - d->domain_id, l1mfn, i, mfn); - errors++; - } - } - - if ( page_get_owner(gpage) != d ) - { - printk("Audit %d: [l1mfn=%lx,i=%x] Skip foreign page " - "dom=%p (id=%d) mfn=%lx c=%08x t=%" - PRtype_info "\n", - d->domain_id, l1mfn, i, - page_get_owner(gpage), - page_get_owner(gpage)->domain_id, - mfn, - gpage->count_info, - gpage->u.inuse.type_info); - continue; - } - } - - adjust(gpage, (l1e_get_flags(pt[i]) & _PAGE_RW) ? 1 : 0); - } - } - - unmap_domain_page(pt); - } - - void adjust_shadow_tables(void) - { - struct shadow_status *a; - unsigned long smfn, gmfn; - struct page_info *page; - int i; - - for ( i = 0; i < shadow_ht_buckets; i++ ) - { - a = &d->arch.shadow_ht[i]; - while ( a && a->gpfn_and_flags ) - { - gmfn = gmfn_to_mfn(d, a->gpfn_and_flags & PGT_mfn_mask); - smfn = a->smfn; - page = mfn_to_page(smfn); - - switch ( a->gpfn_and_flags & PGT_type_mask ) { - case PGT_writable_pred: - break; - case PGT_snapshot: - adjust(mfn_to_page(gmfn), 0); - break; - case PGT_l1_shadow: - adjust(mfn_to_page(gmfn), 0); - if ( shadow_refcounts ) - adjust_l1_page(smfn); - if ( page->u.inuse.type_info & PGT_pinned ) - adjust(page, 0); - break; - case PGT_hl2_shadow: - adjust(mfn_to_page(gmfn), 0); - if ( shadow_refcounts ) - adjust_hl2_page(smfn); - if ( page->u.inuse.type_info & PGT_pinned ) - adjust(page, 0); - break; - case PGT_l2_shadow: - adjust(mfn_to_page(gmfn), 0); - adjust_l2_page(smfn, 1); - if ( page->u.inuse.type_info & PGT_pinned ) - adjust(page, 0); - break; - default: - BUG(); - break; - } - - a = a->next; - } - } - } - - void adjust_oos_list(void) - { - struct out_of_sync_entry *oos; - - if ( (oos = d->arch.out_of_sync) ) - ASSERT(shadow_enabled); - - while ( oos ) - { - adjust(mfn_to_page(oos->gmfn), 0); - - // Only use entries that have low bits clear... - // - if ( !(oos->writable_pl1e & (sizeof(l1_pgentry_t)-1)) ) - adjust(mfn_to_page(oos->writable_pl1e >> PAGE_SHIFT), 0); - - if ( oos->snapshot_mfn != SHADOW_SNAPSHOT_ELSEWHERE ) - adjust(mfn_to_page(oos->snapshot_mfn), 0); - - oos = oos->next; - oos_count++; - } - } - - void adjust_for_pgtbase(void) - { - struct vcpu *v; - - for_each_vcpu(d, v) - { - if ( !pagetable_is_null(v->arch.guest_table) ) - adjust(mfn_to_page(pagetable_get_pfn(v->arch.guest_table)), - !shadow_mode_refcounts(d)); - if ( !pagetable_is_null(v->arch.shadow_table) ) - adjust(mfn_to_page(pagetable_get_pfn(v->arch.shadow_table)), - 0); - if ( v->arch.monitor_shadow_ref ) - adjust(mfn_to_page(v->arch.monitor_shadow_ref), 0); - } - } - - void adjust_guest_pages(void) - { - struct list_head *list_ent = d->page_list.next; - struct page_info *page; - unsigned long mfn, snapshot_mfn; - - while ( list_ent != &d->page_list ) - { - u32 page_type; - - page = list_entry(list_ent, struct page_info, list); - snapshot_mfn = mfn = page_to_mfn(page); - page_type = page->u.inuse.type_info & PGT_type_mask; - - BUG_ON(page_get_owner(page) != d); - - page_count++; - - if ( shadow_enabled && !shadow_refcounts && - page_out_of_sync(page) ) - { - unsigned long gpfn = mfn_to_gmfn(d, mfn); - ASSERT( VALID_M2P(gpfn) ); - snapshot_mfn = __shadow_status(d, gpfn, PGT_snapshot); - ASSERT( snapshot_mfn ); - } - - switch ( page_type ) - { - case PGT_l2_page_table: - l2++; - - if ( noisy ) - { - if ( shadow_refcounts ) - { - printk("Audit %d: found an L2 guest page " - "mfn=%lx t=%" PRtype_info " c=%08x while in shadow mode\n", - d->domain_id, mfn, page->u.inuse.type_info, - page->count_info); - errors++; - } - - if ( (page->u.inuse.type_info & PGT_count_mask) != 0 ) - { - if ( (page->u.inuse.type_info & PGT_validated) != - PGT_validated ) - { - printk("Audit %d: L2 mfn=%lx not validated %" - PRtype_info "\n", - d->domain_id, mfn, page->u.inuse.type_info); - errors++; - } - - } - } - - if ( page->u.inuse.type_info & PGT_pinned ) - adjust(page, 1); - - if ( page->u.inuse.type_info & PGT_validated ) - adjust_l2_page(snapshot_mfn, 0); - - break; - - case PGT_l1_page_table: - l1++; - - if ( noisy ) - { - if ( shadow_refcounts ) - { - printk("found an L1 guest page mfn=%lx t=%" - PRtype_info " c=%08x " - "while in shadow mode\n", - mfn, page->u.inuse.type_info, page->count_info); - errors++; - } - - if ( (page->u.inuse.type_info & PGT_count_mask) != 0 ) - { - if ( (page->u.inuse.type_info & PGT_validated) != - PGT_validated ) - { - printk("Audit %d: L1 not validated mfn=%lx t=%" - PRtype_info "\n", - d->domain_id, mfn, page->u.inuse.type_info); - errors++; - } - } - } - - if ( page->u.inuse.type_info & PGT_pinned ) - adjust(page, 1); - - if ( page->u.inuse.type_info & PGT_validated ) - adjust_l1_page(snapshot_mfn); - - break; - - case PGT_gdt_page: - ASSERT( !page_out_of_sync(page) ); - adjust(page, 1); - break; - - case PGT_ldt_page: - ASSERT( !page_out_of_sync(page) ); - adjust(page, 1); - break; - - case PGT_writable_page: - if ( shadow_refcounts ) - { - // In shadow mode, writable pages can get pinned by - // paravirtualized guests that think they are pinning - // their L1s and/or L2s. - // - if ( page->u.inuse.type_info & PGT_pinned ) - adjust(page, 1); - } - } - - list_ent = page->list.next; - } - } - - adjust_for_pgtbase(); - - adjust_guest_pages(); - - if ( shadow_enabled ) - { - adjust_oos_list(); - adjust_shadow_tables(); - } - - adjust(virt_to_page(d->shared_info), 1); - - return errors; -} - - -#ifndef NDEBUG - -void audit_pagelist(struct domain *d) -{ - struct list_head *list_ent; - int xenpages, totpages; - - list_ent = d->xenpage_list.next; - for ( xenpages = 0; (list_ent != &d->xenpage_list); xenpages++ ) - { - list_ent = list_ent->next; - } - list_ent = d->page_list.next; - for ( totpages = 0; (list_ent != &d->page_list); totpages++ ) - { - list_ent = list_ent->next; - } - - if ( xenpages != d->xenheap_pages || - totpages != d->tot_pages ) - { - printk("ARGH! dom %d: xen=%d %d, pages=%d %d\n", d->domain_id, - xenpages, d->xenheap_pages, - totpages, d->tot_pages ); - } -} - -void _audit_domain(struct domain *d, int flags) -{ - int shadow_refcounts = !!shadow_mode_refcounts(d); - - void scan_for_pfn_in_mfn(struct domain *d, unsigned long xmfn, - unsigned long mfn) - { - struct page_info *page = mfn_to_page(mfn); - l1_pgentry_t *pt = map_domain_page(mfn); - int i; - - for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ ) - { - if ( (l1e_get_flags(pt[i]) & _PAGE_PRESENT) && - (l1e_get_pfn(pt[i]) == xmfn) ) - printk(" found dom=%d mfn=%lx t=%" PRtype_info " c=%08x " - "pt[i=%x]=%" PRIpte "\n", - d->domain_id, mfn, page->u.inuse.type_info, - page->count_info, i, l1e_get_intpte(pt[i])); - } - - unmap_domain_page(pt); - } - - void scan_for_pfn_in_grant_table(struct domain *d, unsigned xmfn) - { - int i; - struct active_grant_entry *act = d->grant_table->active; - - spin_lock(&d->grant_table->lock); - - for ( i = 0; i < NR_GRANT_ENTRIES; i++ ) - { - if ( act[i].pin && (act[i].frame == xmfn) ) - { - printk(" found active grant table entry i=%d dom=%d pin=%d\n", - i, act[i].domid, act[i].pin); - } - } - - spin_unlock(&d->grant_table->lock); - } - - void scan_for_pfn(struct domain *d, unsigned long xmfn) - { - scan_for_pfn_in_grant_table(d, xmfn); - - if ( !shadow_mode_enabled(d) ) - { - struct list_head *list_ent = d->page_list.next; - struct page_info *page; - - while ( list_ent != &d->page_list ) - { - page = list_entry(list_ent, struct page_info, list); - - switch ( page->u.inuse.type_info & PGT_type_mask ) - { - case PGT_l1_page_table: - case PGT_l2_page_table: - scan_for_pfn_in_mfn(d, xmfn, page_to_mfn(page)); - break; - default: - break; - } - - list_ent = page->list.next; - } - } - else - { - struct shadow_status *a; - int i; - - for ( i = 0; i < shadow_ht_buckets; i++ ) - { - a = &d->arch.shadow_ht[i]; - while ( a && a->gpfn_and_flags ) - { - switch ( a->gpfn_and_flags & PGT_type_mask ) - { - case PGT_l1_shadow: - case PGT_l2_shadow: - case PGT_hl2_shadow: - scan_for_pfn_in_mfn(d, xmfn, a->smfn); - break; - case PGT_snapshot: - case PGT_writable_pred: - break; - default: - BUG(); - break; - } - a = a->next; - } - } - } - } - - void scan_for_pfn_remote(unsigned long xmfn) - { - struct domain *e; - for_each_domain ( e ) - scan_for_pfn( e, xmfn ); - } - - unsigned long mfn; - struct list_head *list_ent; - struct page_info *page; - int errors = 0; - - if ( (d != current->domain) && shadow_mode_translate(d) ) - { - printk("skipping audit domain of translated domain %d " - "from other context\n", - d->domain_id); - return; - } - - if ( d != current->domain ) - domain_pause(d); - - // Maybe we should just be using BIGLOCK? - // - if ( !(flags & AUDIT_SHADOW_ALREADY_LOCKED) ) - shadow_lock(d); - - spin_lock(&d->page_alloc_lock); - - audit_pagelist(d); - - /* PHASE 0 */ - - list_ent = d->page_list.next; - while ( list_ent != &d->page_list ) - { - u32 page_type; - unsigned long pfn; - - page = list_entry(list_ent, struct page_info, list); - mfn = page_to_mfn(page); - page_type = page->u.inuse.type_info & PGT_type_mask; - - BUG_ON(page_get_owner(page) != d); - - if ( (page->u.inuse.type_info & PGT_count_mask) > - (page->count_info & PGC_count_mask) ) - { - printk("taf(%" PRtype_info ") > caf(%08x) mfn=%lx\n", - page->u.inuse.type_info, page->count_info, mfn); - errors++; - } - - if ( shadow_mode_refcounts(d) && - (page_type == PGT_writable_page) && - !(page->u.inuse.type_info & PGT_validated) ) - { - printk("shadow mode writable page not validated mfn=%lx " - "t=%" PRtype_info " c=%08x\n", - mfn, page->u.inuse.type_info, page->count_info); - errors++; - } - -#if 0 /* SYSV shared memory pages plus writeable files. */ - if ( page_type == PGT_writable_page && - (page->u.inuse.type_info & PGT_count_mask) > 1 ) - { - printk("writeable page with type count >1: " - "mfn=%lx t=%" PRtype_info " c=%08x\n", - mfn, - page->u.inuse.type_info, - page->count_info ); - errors++; - scan_for_pfn_remote(mfn); - } -#endif - - if ( page_type == PGT_none && - (page->u.inuse.type_info & PGT_count_mask) > 0 ) - { - printk("normal page with type count >0: mfn=%lx t=%" PRtype_info " c=%08x\n", - mfn, - page->u.inuse.type_info, - page->count_info ); - errors++; - } - - if ( page_out_of_sync(page) ) - { - if ( !page_is_page_table(page) ) - { - printk("out of sync page mfn=%lx is not a page table\n", mfn); - errors++; - } - pfn = mfn_to_gmfn(d, mfn); - if ( !__shadow_status(d, pfn, PGT_snapshot) ) - { - printk("out of sync page mfn=%lx doesn't have a snapshot\n", - mfn); - errors++; - } - if ( shadow_refcounts - ? (page_type != PGT_writable_page) - : !(page_type && (page_type <= PGT_l4_page_table)) ) - { - printk("out of sync page mfn=%lx has strange type " - "t=%" PRtype_info " c=%08x\n", - mfn, page->u.inuse.type_info, page->count_info); - errors++; - } - } - - /* Use tlbflush_timestamp to store original type_info. */ - page->tlbflush_timestamp = page->u.inuse.type_info; - - list_ent = page->list.next; - } - - /* PHASE 1 */ - io_mappings = lowmem_mappings = 0; - - errors += audit_adjust_pgtables(d, -1, 1); - - if ( !(flags & AUDIT_QUIET) && - ((io_mappings > 0) || (lowmem_mappings > 0)) ) - printk("Audit %d: Found %d lowmem mappings and %d io mappings\n", - d->domain_id, lowmem_mappings, io_mappings); - - /* PHASE 2 */ - - list_ent = d->page_list.next; - while ( list_ent != &d->page_list ) - { - page = list_entry(list_ent, struct page_info, list); - mfn = page_to_mfn(page); - - switch ( page->u.inuse.type_info & PGT_type_mask) - { - case PGT_l1_page_table: - case PGT_l2_page_table: - case PGT_l3_page_table: - case PGT_l4_page_table: - if ( (page->u.inuse.type_info & PGT_count_mask) != 0 ) - { - printk("Audit %d: type count!=0 t=%" PRtype_info " ot=%x c=%x mfn=%lx\n", - d->domain_id, page->u.inuse.type_info, - page->tlbflush_timestamp, - page->count_info, mfn); - errors++; - scan_for_pfn_remote(mfn); - } - break; - case PGT_none: - case PGT_writable_page: - case PGT_gdt_page: - case PGT_ldt_page: - if ( (page->u.inuse.type_info & PGT_count_mask) != 0 ) - { - printk("Audit %d: type count!=0 t=%" PRtype_info " ot=%x c=%x mfn=%lx\n", - d->domain_id, page->u.inuse.type_info, - page->tlbflush_timestamp, - page->count_info, mfn); - //errors++; - } - break; - default: - BUG(); // XXX fix me... - } - - if ( (page->count_info & PGC_count_mask) != 1 ) - { - printk("Audit %d: gen count!=1 (c=%x) t=%" PRtype_info " ot=%x mfn=%lx\n", - d->domain_id, - page->count_info, - page->u.inuse.type_info, - page->tlbflush_timestamp, mfn ); - //errors++; - scan_for_pfn_remote(mfn); - } - - list_ent = page->list.next; - } - - if ( shadow_mode_enabled(d) ) - { - struct shadow_status *a; - struct page_info *page; - u32 page_type; - int i; - - for ( i = 0; i < shadow_ht_buckets; i++ ) - { - a = &d->arch.shadow_ht[i]; - while ( a && a->gpfn_and_flags ) - { - page = mfn_to_page(a->smfn); - page_type = a->gpfn_and_flags & PGT_type_mask; - - switch ( page_type ) { - case PGT_l1_shadow: - case PGT_l2_shadow: - case PGT_hl2_shadow: - case PGT_snapshot: - if ( ((page->u.inuse.type_info & PGT_type_mask) != page_type ) || - (page->count_info != 0) ) - { - printk("Audit %d: shadow page counts wrong " - "mfn=%lx t=%" PRtype_info " c=%08x\n", - d->domain_id, page_to_mfn(page), - page->u.inuse.type_info, - page->count_info); - printk("a->gpfn_and_flags=%"PRIx64"\n", - (u64)a->gpfn_and_flags); - errors++; - } - break; - case PGT_writable_pred: - // XXX - nothing to check? - break; - - default: - BUG(); - break; - } - - a = a->next; - } - } - } - - /* PHASE 3 */ - ctot = ttot = page_count = l1 = l2 = oos_count = 0; - - audit_adjust_pgtables(d, 1, 0); - -#if 0 - // This covers our sins of trashing the tlbflush_timestamps... - // - local_flush_tlb(); -#endif - - spin_unlock(&d->page_alloc_lock); - - if ( !(flags & AUDIT_QUIET) ) - printk("Audit dom%d Done. " - "pages=%d oos=%d l1=%d l2=%d ctot=%d ttot=%d\n", - d->domain_id, page_count, oos_count, l1, l2, ctot, ttot); - - if ( !(flags & AUDIT_SHADOW_ALREADY_LOCKED) ) - shadow_unlock(d); - - if ( d != current->domain ) - domain_unpause(d); - - if ( errors && !(flags & AUDIT_ERRORS_OK) ) - BUG(); -} - -void audit_domains(void) -{ - struct domain *d; - for_each_domain ( d ) - audit_domain(d); -} - -void audit_domains_key(unsigned char key) -{ - audit_domains(); -} -#endif |