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; )
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;
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;