Commit b86bda5bb193aa47ee95c43ec31d899b52b45645
1 parent
e2731add
adde TLB dump
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1069 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
117 additions
and
0 deletions
monitor.c
| @@ -695,6 +695,117 @@ static void do_system_reset(void) | @@ -695,6 +695,117 @@ static void do_system_reset(void) | ||
| 695 | qemu_system_reset_request(); | 695 | qemu_system_reset_request(); |
| 696 | } | 696 | } |
| 697 | 697 | ||
| 698 | +#if defined(TARGET_I386) | ||
| 699 | +static void print_pte(uint32_t addr, uint32_t pte, uint32_t mask) | ||
| 700 | +{ | ||
| 701 | + term_printf("%08x: %08x %c%c%c%c%c%c%c%c\n", | ||
| 702 | + addr, | ||
| 703 | + pte & mask, | ||
| 704 | + pte & PG_GLOBAL_MASK ? 'G' : '-', | ||
| 705 | + pte & PG_PSE_MASK ? 'P' : '-', | ||
| 706 | + pte & PG_DIRTY_MASK ? 'D' : '-', | ||
| 707 | + pte & PG_ACCESSED_MASK ? 'A' : '-', | ||
| 708 | + pte & PG_PCD_MASK ? 'C' : '-', | ||
| 709 | + pte & PG_PWT_MASK ? 'T' : '-', | ||
| 710 | + pte & PG_USER_MASK ? 'U' : '-', | ||
| 711 | + pte & PG_RW_MASK ? 'W' : '-'); | ||
| 712 | +} | ||
| 713 | + | ||
| 714 | +static void tlb_info(void) | ||
| 715 | +{ | ||
| 716 | + CPUState *env = cpu_single_env; | ||
| 717 | + int l1, l2; | ||
| 718 | + uint32_t pgd, pde, pte; | ||
| 719 | + | ||
| 720 | + if (!(env->cr[0] & CR0_PG_MASK)) { | ||
| 721 | + term_printf("PG disabled\n"); | ||
| 722 | + return; | ||
| 723 | + } | ||
| 724 | + pgd = env->cr[3] & ~0xfff; | ||
| 725 | + for(l1 = 0; l1 < 1024; l1++) { | ||
| 726 | + cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4); | ||
| 727 | + pde = le32_to_cpu(pde); | ||
| 728 | + if (pde & PG_PRESENT_MASK) { | ||
| 729 | + if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) { | ||
| 730 | + print_pte((l1 << 22), pde, ~((1 << 20) - 1)); | ||
| 731 | + } else { | ||
| 732 | + for(l2 = 0; l2 < 1024; l2++) { | ||
| 733 | + cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, | ||
| 734 | + (uint8_t *)&pte, 4); | ||
| 735 | + pte = le32_to_cpu(pte); | ||
| 736 | + if (pte & PG_PRESENT_MASK) { | ||
| 737 | + print_pte((l1 << 22) + (l2 << 12), | ||
| 738 | + pte & ~PG_PSE_MASK, | ||
| 739 | + ~0xfff); | ||
| 740 | + } | ||
| 741 | + } | ||
| 742 | + } | ||
| 743 | + } | ||
| 744 | + } | ||
| 745 | +} | ||
| 746 | + | ||
| 747 | +static void mem_print(uint32_t *pstart, int *plast_prot, | ||
| 748 | + uint32_t end, int prot) | ||
| 749 | +{ | ||
| 750 | + if (prot != *plast_prot) { | ||
| 751 | + if (*pstart != -1) { | ||
| 752 | + term_printf("%08x-%08x %08x %c%c%c\n", | ||
| 753 | + *pstart, end, end - *pstart, | ||
| 754 | + prot & PG_USER_MASK ? 'u' : '-', | ||
| 755 | + 'r', | ||
| 756 | + prot & PG_RW_MASK ? 'w' : '-'); | ||
| 757 | + } | ||
| 758 | + if (prot != 0) | ||
| 759 | + *pstart = end; | ||
| 760 | + else | ||
| 761 | + *pstart = -1; | ||
| 762 | + *plast_prot = prot; | ||
| 763 | + } | ||
| 764 | +} | ||
| 765 | + | ||
| 766 | +static void mem_info(void) | ||
| 767 | +{ | ||
| 768 | + CPUState *env = cpu_single_env; | ||
| 769 | + int l1, l2, prot, last_prot; | ||
| 770 | + uint32_t pgd, pde, pte, start, end; | ||
| 771 | + | ||
| 772 | + if (!(env->cr[0] & CR0_PG_MASK)) { | ||
| 773 | + term_printf("PG disabled\n"); | ||
| 774 | + return; | ||
| 775 | + } | ||
| 776 | + pgd = env->cr[3] & ~0xfff; | ||
| 777 | + last_prot = 0; | ||
| 778 | + start = -1; | ||
| 779 | + for(l1 = 0; l1 < 1024; l1++) { | ||
| 780 | + cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4); | ||
| 781 | + pde = le32_to_cpu(pde); | ||
| 782 | + end = l1 << 22; | ||
| 783 | + if (pde & PG_PRESENT_MASK) { | ||
| 784 | + if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) { | ||
| 785 | + prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK); | ||
| 786 | + mem_print(&start, &last_prot, end, prot); | ||
| 787 | + } else { | ||
| 788 | + for(l2 = 0; l2 < 1024; l2++) { | ||
| 789 | + cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, | ||
| 790 | + (uint8_t *)&pte, 4); | ||
| 791 | + pte = le32_to_cpu(pte); | ||
| 792 | + end = (l1 << 22) + (l2 << 12); | ||
| 793 | + if (pte & PG_PRESENT_MASK) { | ||
| 794 | + prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK); | ||
| 795 | + } else { | ||
| 796 | + prot = 0; | ||
| 797 | + } | ||
| 798 | + mem_print(&start, &last_prot, end, prot); | ||
| 799 | + } | ||
| 800 | + } | ||
| 801 | + } else { | ||
| 802 | + prot = 0; | ||
| 803 | + mem_print(&start, &last_prot, end, prot); | ||
| 804 | + } | ||
| 805 | + } | ||
| 806 | +} | ||
| 807 | +#endif | ||
| 808 | + | ||
| 698 | static term_cmd_t term_cmds[] = { | 809 | static term_cmd_t term_cmds[] = { |
| 699 | { "help|?", "s?", do_help, | 810 | { "help|?", "s?", do_help, |
| 700 | "[cmd]", "show the help" }, | 811 | "[cmd]", "show the help" }, |
| @@ -755,6 +866,12 @@ static term_cmd_t info_cmds[] = { | @@ -755,6 +866,12 @@ static term_cmd_t info_cmds[] = { | ||
| 755 | "", "show i8259 (PIC) state", }, | 866 | "", "show i8259 (PIC) state", }, |
| 756 | { "pci", "", pci_info, | 867 | { "pci", "", pci_info, |
| 757 | "", "show PCI info", }, | 868 | "", "show PCI info", }, |
| 869 | +#if defined(TARGET_I386) | ||
| 870 | + { "tlb", "", tlb_info, | ||
| 871 | + "", "show virtual to physical memory mappings", }, | ||
| 872 | + { "mem", "", mem_info, | ||
| 873 | + "", "show the active virtual memory mappings", }, | ||
| 874 | +#endif | ||
| 758 | { NULL, NULL, }, | 875 | { NULL, NULL, }, |
| 759 | }; | 876 | }; |
| 760 | 877 |