Commit d0ecd2aaf9ecc2c434eed4c5de7917787476223e
1 parent
b3783731
added cpu_physical_memory_write_rom()
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1833 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
41 additions
and
0 deletions
cpu-all.h
... | ... | @@ -857,6 +857,8 @@ void stw_phys(target_phys_addr_t addr, uint32_t val); |
857 | 857 | void stl_phys(target_phys_addr_t addr, uint32_t val); |
858 | 858 | void stq_phys(target_phys_addr_t addr, uint64_t val); |
859 | 859 | |
860 | +void cpu_physical_memory_write_rom(target_phys_addr_t addr, | |
861 | + const uint8_t *buf, int len); | |
860 | 862 | int cpu_memory_rw_debug(CPUState *env, target_ulong addr, |
861 | 863 | uint8_t *buf, int len, int is_write); |
862 | 864 | ... | ... |
exec.c
... | ... | @@ -2080,6 +2080,45 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, |
2080 | 2080 | } |
2081 | 2081 | } |
2082 | 2082 | |
2083 | +/* used for ROM loading : can write in RAM and ROM */ | |
2084 | +void cpu_physical_memory_write_rom(target_phys_addr_t addr, | |
2085 | + const uint8_t *buf, int len) | |
2086 | +{ | |
2087 | + int l; | |
2088 | + uint8_t *ptr; | |
2089 | + target_phys_addr_t page; | |
2090 | + unsigned long pd; | |
2091 | + PhysPageDesc *p; | |
2092 | + | |
2093 | + while (len > 0) { | |
2094 | + page = addr & TARGET_PAGE_MASK; | |
2095 | + l = (page + TARGET_PAGE_SIZE) - addr; | |
2096 | + if (l > len) | |
2097 | + l = len; | |
2098 | + p = phys_page_find(page >> TARGET_PAGE_BITS); | |
2099 | + if (!p) { | |
2100 | + pd = IO_MEM_UNASSIGNED; | |
2101 | + } else { | |
2102 | + pd = p->phys_offset; | |
2103 | + } | |
2104 | + | |
2105 | + if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM && | |
2106 | + (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM) { | |
2107 | + /* do nothing */ | |
2108 | + } else { | |
2109 | + unsigned long addr1; | |
2110 | + addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK); | |
2111 | + /* ROM/RAM case */ | |
2112 | + ptr = phys_ram_base + addr1; | |
2113 | + memcpy(ptr, buf, l); | |
2114 | + } | |
2115 | + len -= l; | |
2116 | + buf += l; | |
2117 | + addr += l; | |
2118 | + } | |
2119 | +} | |
2120 | + | |
2121 | + | |
2083 | 2122 | /* warning: addr must be aligned */ |
2084 | 2123 | uint32_t ldl_phys(target_phys_addr_t addr) |
2085 | 2124 | { | ... | ... |