Commit b448f2f36c473f9ac8de4200a897268e0cf419c1
1 parent
97eb5b14
new physical memory access API (used by DMA accesses) - code copy FP fixes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@644 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
19 additions
and
9 deletions
exec.c
@@ -734,6 +734,7 @@ TranslationBlock *tb_alloc(unsigned long pc) | @@ -734,6 +734,7 @@ TranslationBlock *tb_alloc(unsigned long pc) | ||
734 | return NULL; | 734 | return NULL; |
735 | tb = &tbs[nb_tbs++]; | 735 | tb = &tbs[nb_tbs++]; |
736 | tb->pc = pc; | 736 | tb->pc = pc; |
737 | + tb->cflags = 0; | ||
737 | return tb; | 738 | return tb; |
738 | } | 739 | } |
739 | 740 | ||
@@ -812,6 +813,11 @@ void tb_link(TranslationBlock *tb) | @@ -812,6 +813,11 @@ void tb_link(TranslationBlock *tb) | ||
812 | tb->jmp_first = (TranslationBlock *)((long)tb | 2); | 813 | tb->jmp_first = (TranslationBlock *)((long)tb | 2); |
813 | tb->jmp_next[0] = NULL; | 814 | tb->jmp_next[0] = NULL; |
814 | tb->jmp_next[1] = NULL; | 815 | tb->jmp_next[1] = NULL; |
816 | +#ifdef USE_CODE_COPY | ||
817 | + tb->cflags &= ~CF_FP_USED; | ||
818 | + if (tb->cflags & CF_TB_FP_USED) | ||
819 | + tb->cflags |= CF_FP_USED; | ||
820 | +#endif | ||
815 | 821 | ||
816 | /* init original jump addresses */ | 822 | /* init original jump addresses */ |
817 | if (tb->tb_next_offset[0] != 0xffff) | 823 | if (tb->tb_next_offset[0] != 0xffff) |
@@ -1738,7 +1744,7 @@ int cpu_register_io_memory(int io_index, | @@ -1738,7 +1744,7 @@ int cpu_register_io_memory(int io_index, | ||
1738 | 1744 | ||
1739 | /* physical memory access (slow version, mainly for debug) */ | 1745 | /* physical memory access (slow version, mainly for debug) */ |
1740 | #if defined(CONFIG_USER_ONLY) | 1746 | #if defined(CONFIG_USER_ONLY) |
1741 | -void cpu_physical_memory_rw(CPUState *env, uint8_t *buf, target_ulong addr, | 1747 | +void cpu_physical_memory_rw(target_ulong addr, uint8_t *buf, |
1742 | int len, int is_write) | 1748 | int len, int is_write) |
1743 | { | 1749 | { |
1744 | int l, flags; | 1750 | int l, flags; |
@@ -1767,7 +1773,7 @@ void cpu_physical_memory_rw(CPUState *env, uint8_t *buf, target_ulong addr, | @@ -1767,7 +1773,7 @@ void cpu_physical_memory_rw(CPUState *env, uint8_t *buf, target_ulong addr, | ||
1767 | } | 1773 | } |
1768 | } | 1774 | } |
1769 | #else | 1775 | #else |
1770 | -void cpu_physical_memory_rw(CPUState *env, uint8_t *buf, target_ulong addr, | 1776 | +void cpu_physical_memory_rw(target_ulong addr, uint8_t *buf, |
1771 | int len, int is_write) | 1777 | int len, int is_write) |
1772 | { | 1778 | { |
1773 | int l, io_index; | 1779 | int l, io_index; |
@@ -1808,10 +1814,15 @@ void cpu_physical_memory_rw(CPUState *env, uint8_t *buf, target_ulong addr, | @@ -1808,10 +1814,15 @@ void cpu_physical_memory_rw(CPUState *env, uint8_t *buf, target_ulong addr, | ||
1808 | l = 1; | 1814 | l = 1; |
1809 | } | 1815 | } |
1810 | } else { | 1816 | } else { |
1817 | + unsigned long addr1; | ||
1818 | + addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK); | ||
1811 | /* RAM case */ | 1819 | /* RAM case */ |
1812 | - ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) + | ||
1813 | - (addr & ~TARGET_PAGE_MASK); | 1820 | + ptr = phys_ram_base + addr1; |
1814 | memcpy(ptr, buf, l); | 1821 | memcpy(ptr, buf, l); |
1822 | + /* invalidate code */ | ||
1823 | + tb_invalidate_phys_page_range(addr1, addr1 + l, 0); | ||
1824 | + /* set dirty bit */ | ||
1825 | + phys_ram_dirty[page >> TARGET_PAGE_BITS] = 1; | ||
1815 | } | 1826 | } |
1816 | } else { | 1827 | } else { |
1817 | if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && | 1828 | if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && |
@@ -1849,8 +1860,8 @@ void cpu_physical_memory_rw(CPUState *env, uint8_t *buf, target_ulong addr, | @@ -1849,8 +1860,8 @@ void cpu_physical_memory_rw(CPUState *env, uint8_t *buf, target_ulong addr, | ||
1849 | #endif | 1860 | #endif |
1850 | 1861 | ||
1851 | /* virtual memory access for debug */ | 1862 | /* virtual memory access for debug */ |
1852 | -int cpu_memory_rw_debug(CPUState *env, | ||
1853 | - uint8_t *buf, target_ulong addr, int len, int is_write) | 1863 | +int cpu_memory_rw_debug(CPUState *env, target_ulong addr, |
1864 | + uint8_t *buf, int len, int is_write) | ||
1854 | { | 1865 | { |
1855 | int l; | 1866 | int l; |
1856 | target_ulong page, phys_addr; | 1867 | target_ulong page, phys_addr; |
@@ -1864,9 +1875,8 @@ int cpu_memory_rw_debug(CPUState *env, | @@ -1864,9 +1875,8 @@ int cpu_memory_rw_debug(CPUState *env, | ||
1864 | l = (page + TARGET_PAGE_SIZE) - addr; | 1875 | l = (page + TARGET_PAGE_SIZE) - addr; |
1865 | if (l > len) | 1876 | if (l > len) |
1866 | l = len; | 1877 | l = len; |
1867 | - cpu_physical_memory_rw(env, buf, | ||
1868 | - phys_addr + (addr & ~TARGET_PAGE_MASK), l, | ||
1869 | - is_write); | 1878 | + cpu_physical_memory_rw(phys_addr + (addr & ~TARGET_PAGE_MASK), |
1879 | + buf, l, is_write); | ||
1870 | len -= l; | 1880 | len -= l; |
1871 | buf += l; | 1881 | buf += l; |
1872 | addr += l; | 1882 | addr += l; |