]> xenbits.xensource.com Git - people/aperard/xen-arm.git/commitdiff
debug: Set guest traps.
authorAnthony PERARD <anthony.perard@citrix.com>
Wed, 16 Jan 2013 16:09:39 +0000 (16:09 +0000)
committerAnthony PERARD <anthony.perard@citrix.com>
Mon, 28 Jan 2013 15:55:20 +0000 (15:55 +0000)
xen/arch/arm/domain_build.c
xen/arch/arm/kernel.c
xen/arch/arm/traps.c

index 781d2aaef6e9b5ba4d453d68c919b722bb1207fc..b33e668ce901bd5895b27ca719ae99a60140922f 100644 (file)
@@ -332,6 +332,8 @@ int construct_dom0(struct domain *d)
     if ( rc < 0 )
         return rc;
 
+    // for the debug trap vector
+    p2m_populate_ram(d, 0x0, 0x1000-1);
     rc = kernel_prepare(&kinfo);
     if ( rc < 0 )
         return rc;
index 2f7a9ff2a5fbc95eaa276c9d2e09541ff3329535..7cc69c5ff45c7f6cb07929e4941c966040375504 100644 (file)
@@ -72,6 +72,23 @@ static void kernel_zimage_load(struct kernel_info *info)
     paddr_t len = info->zimage.len;
     unsigned long offs;
 
+    {
+        // Set temporary guest traps
+        // with 0xe14fff7e which is hvc(0xfffc)
+        // a hyp panic!
+        /* p2m_populate_ram(d, 0x0, 0x1000-1); // done is construct_dom0() */
+        paddr_t ma = gvirt_to_maddr(0);
+        uint32_t *dst = map_domain_page(ma>>PAGE_SHIFT);
+
+        for (offs = 0; offs < 14; offs++)
+            dst[offs] = 0xe14fff7c;
+        dst[15] = 0xff7ce14f;
+        dst[16] = 0x7cff4fe1;
+        dst[17] = 0;
+        unmap_domain_page(dst);
+    }
+
+
     printk("Loading zImage from %"PRIpaddr" to %"PRIpaddr"-%"PRIpaddr"\n",
            paddr, load_addr, load_addr + len);
     for ( offs = 0; offs < len; )
index 8afcf0c4ab93e771a7af6d9016a6b2c20877cc5b..532f9908212cbf5286d74f8bd01f76bb969e025a 100644 (file)
@@ -499,6 +499,22 @@ static arm_hypercall_t arm_hypercall_table[] = {
     HYPERCALL(grant_table_op, 3),
 };
 
+static void debug_print_guest_mem_content(uint32_t addr)
+{
+    paddr_t ma = gvirt_to_maddr(addr);
+    uint32_t *src = map_domain_page(ma>>PAGE_SHIFT);
+    uint32_t *src_offset = src + ((addr & ~PAGE_MASK) / 4);
+    printk("guest mem at addr: %#08x (PA: %#08llx)\n", addr, ma);
+    printk("%08x %08x %08x %08x %08x %08x\n", 
+           *src_offset,
+           *(src_offset + 1),
+           *(src_offset + 2),
+           *(src_offset + 3),
+           *(src_offset + 4),
+           *(src_offset + 5)
+          );
+    unmap_domain_page(src);
+}
 static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code)
 {
     uint32_t reg, *r;
@@ -510,6 +526,26 @@ static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code)
         printk("DOM%d: R%d = %#010"PRIx32" at %#010"PRIx32"\n",
                domid, reg, *r, regs->pc);
         break;
+    case 0xfc:
+        printk("DOM%d: Unhandled guest trap on %#010"PRIx32" (PC-4)\n", domid, regs->pc - 4);
+        if (regs->pc - 4 == 4) // undefine intruction
+        {
+            uint32_t faulty_instr_addr = regs->lr_und;
+            uint32_t i = 0;
+
+            debug_print_guest_mem_content(faulty_instr_addr - 4*4);
+            printk("for reference, the beginning: ");
+            debug_print_guest_mem_content(0x40008000);
+            printk("more\n");
+            for (i = 0x40008000 + 8 * PAGE_SIZE;
+                 i < faulty_instr_addr;
+                 i += PAGE_SIZE * 32) {
+                debug_print_guest_mem_content(i);
+            }
+        }
+        show_execution_state(regs);
+        panic("DOM%d: Unhandled guest trap on %#010"PRIx32" (PC-4)\n", domid, regs->pc - 4);
+        break;
     case 0xfd:
         printk("DOM%d: Reached %#010"PRIx32"\n", domid, regs->pc);
         break;