From patchwork Thu Mar 17 12:43:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 8610651 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id A114B9F44D for ; Thu, 17 Mar 2016 12:46:19 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9772420364 for ; Thu, 17 Mar 2016 12:46:18 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 902112035D for ; Thu, 17 Mar 2016 12:46:17 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1agXHT-00061s-1h; Thu, 17 Mar 2016 12:43:59 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1agXHS-00061K-8h for xen-devel@lists.xen.org; Thu, 17 Mar 2016 12:43:58 +0000 Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id 18/F0-16378-D86AAE65; Thu, 17 Mar 2016 12:43:57 +0000 X-Env-Sender: prvs=87753aaea=Andrew.Cooper3@citrix.com X-Msg-Ref: server-11.tower-206.messagelabs.com!1458218634!17451657!2 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 8.11; banners=-,-,- X-VirusChecked: Checked Received: (qmail 49786 invoked from network); 17 Mar 2016 12:43:57 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 17 Mar 2016 12:43:57 -0000 X-IronPort-AV: E=Sophos;i="5.24,350,1454976000"; d="scan'208";a="346548679" From: Andrew Cooper To: Xen-devel Date: Thu, 17 Mar 2016 12:43:16 +0000 Message-ID: <1458218596-23847-2-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458218596-23847-1-git-send-email-andrew.cooper3@citrix.com> References: <1458218596-23847-1-git-send-email-andrew.cooper3@citrix.com> MIME-Version: 1.0 X-DLP: MIA1 Cc: Andrew Cooper Subject: [Xen-devel] [PATCH] DO NOT APPLY - debug keys for inspecting Xen mappings X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP --- xen/arch/x86/mm.c | 15 ++++++ xen/arch/x86/traps.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index c997b53..77752fe 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -123,6 +123,7 @@ #include #include #include +#include /* Mapping of the fixmap space needed early. */ l1_pgentry_t __section(".bss.page_aligned") l1_fixmap[L1_PAGETABLE_ENTRIES]; @@ -5635,6 +5636,20 @@ int map_pages_to_xen( l1_pgentry_t *pl1e, ol1e; unsigned int i; + if ( XEN_VIRT_START >= virt && + XEN_VIRT_START <= (virt + (nr_mfns * PAGE_SIZE)) ) + { + console_start_sync(); + + printk("*** %s(%p, %p, %p, %#x)\n", + __func__, _p(virt), _p(mfn), _p(nr_mfns), flags); + printk("*** Called from %p %pS\n", + __builtin_return_address(0), + __builtin_return_address(0)); + + console_end_sync(); + } + #define flush_flags(oldf) do { \ unsigned int o_ = (oldf); \ if ( (o_) & _PAGE_GLOBAL ) \ diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 564a107..8381138 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -4124,6 +4124,154 @@ void asm_domain_crash_synchronous(unsigned long addr) __domain_crash_synchronous(); } +static const char *pte_flags_decode(unsigned int flags) +{ + static char buf[24]; + + snprintf(buf, sizeof buf, "%s%s%s%s%s%s", + flags & _PAGE_NX_BIT ? "NX" : "X", + flags & _PAGE_GLOBAL ? " Gl" : "", + flags & _PAGE_PSE ? " +" : "", + flags & _PAGE_USER ? " U" : " S", + flags & _PAGE_RW ? " RW" : " RO", + flags & _PAGE_PRESENT ? " P" : "" + ); + return buf; +} + +void dump_xen_mappings(bool_t dump_l1) +{ + unsigned long cr3 = read_cr3(); + + unsigned int i4 = l4_table_offset(XEN_VIRT_START); + l4_pgentry_t *l4 = &idle_pg_table[i4]; + unsigned int l4ef = l4e_get_flags(*l4); + + unsigned int i3 = l3_table_offset(XEN_VIRT_START); + l3_pgentry_t *l3 = l4e_to_l3e(*l4); + unsigned int l3ef = l3e_get_flags(l3[i3]); + + unsigned int i2; + l2_pgentry_t *l2 = l3e_to_l2e(l3[i3]); + + printk("*** Dumping Xen text/data/bss mappings from %p\n", + _p(XEN_VIRT_START)); + + printk("cr3 %p, idle_pg_table %p, pa %p\n", + _p(cr3), idle_pg_table, _p(__pa(idle_pg_table))); + + printk("l2_xenmap: %p, pa %p\n", l2_xenmap, _p(__pa(l2_xenmap))); + + printk(" L4[%03u] = %"PRIpte" %s\n", + i4, l4e_get_intpte(*l4), pte_flags_decode(l4ef)); + + printk(" L3[%03u] = %"PRIpte" %s\n", + i3, l3e_get_intpte(l3[i3]), pte_flags_decode(l3ef)); + + if ( l3e_get_paddr(l3[i3]) != __pa(l2_xenmap) ) + printk("** Unexpected - l3e not pointing at l2_xenmap\n"); + + for ( i2 = 0; i2 < L2_PAGETABLE_ENTRIES; ++i2 ) + { + unsigned int l2ef = l2e_get_flags(l2[i2]), i1; + l1_pgentry_t *l1; + + if ( !(l2ef & _PAGE_PRESENT) ) + continue; + + printk(" L2[%03u] = %"PRIpte" %s\n", + i2, l2e_get_intpte(l2[i2]), pte_flags_decode(l2ef)); + + if ( l2ef & _PAGE_PSE ) + continue; + + if ( !dump_l1 ) + { + printk(" L1 abbr\n"); + continue; + } + + l1 = l2e_to_l1e(l2[i2]); + + for ( i1 = 0; i1 < L1_PAGETABLE_ENTRIES; ++i1 ) + { + unsigned int l1ef = l1e_get_flags(l1[i1]); + + if ( !(l1ef & _PAGE_PRESENT) ) + continue; + + printk(" L1[%03u] = %"PRIpte" %s\n", + i1, l1e_get_intpte(l1[i1]), pte_flags_decode(l1ef)); + } + } +} + +static void read_idle(void) +{ + l4_pgentry_t *l4 = idle_pg_table; + unsigned int i4; + + for ( i4 = 0; i4 < L4_PAGETABLE_ENTRIES; ++i4 ) + { + unsigned int l4ef = l4e_get_flags(l4[i4]); + + if ( !(l4ef & _PAGE_PRESENT) ) + continue; + + printk(" L4[%03u] = %"PRIpte" %s\n", + i4, l4e_get_intpte(l4[i4]), pte_flags_decode(l4ef)); + } +} + +#include +#include + +static void dump_offsets(const char *name, unsigned long addr) +{ + printk(" %-15s: %lu %lu %lu %lu\n", name, l4_table_offset(addr), + l3_table_offset(addr), l2_table_offset(addr), l1_table_offset(addr)); +} +#define DUMP(x) dump_offsets(#x, (unsigned long)&(x)) + +static void do_extreme_debug(unsigned char key, struct cpu_user_regs *regs) +{ + printk("'%c' pressed -> Extreme debugging in progress...\n", key); + + switch ( key ) + { + case '1': + dump_xen_mappings(0); + break; + + case '2': + dump_xen_mappings(1); + break; + + case '3': + read_idle(); + break; + + case '4': + DUMP(_stext); + DUMP(_etext); + DUMP(__2M_rodata_start); + DUMP(__2M_rodata_end); + DUMP(__2M_rwdata_start); + DUMP(__2M_rwdata_end); + break; + } +} + +static int __init extreme_debug_keyhandler_init(void) +{ + register_irq_keyhandler('1', &do_extreme_debug, "Extreme debugging 1", 0); + register_irq_keyhandler('2', &do_extreme_debug, "Extreme debugging 2", 0); + register_irq_keyhandler('3', &do_extreme_debug, "Extreme debugging 3", 0); + register_irq_keyhandler('4', &do_extreme_debug, "Extreme debugging 3", 0); + return 0; +} +__initcall(extreme_debug_keyhandler_init); + /* * Local variables: * mode: C