25 |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
26 |
* |
* |
27 |
* |
* |
28 |
* $Id: memory_fast_v2h.c,v 1.13 2005/04/09 21:13:58 debug Exp $ |
* $Id: memory_fast_v2h.c,v 1.15 2005/07/19 10:48:05 debug Exp $ |
29 |
* |
* |
30 |
* Fast virtual memory to host address, used by binary translated code. |
* Fast virtual memory to host address, used by binary translated code. |
31 |
*/ |
*/ |
143 |
if (paddr >= (cpu->mem->dev_baseaddr[i] & ~0xfff) && |
if (paddr >= (cpu->mem->dev_baseaddr[i] & ~0xfff) && |
144 |
paddr <= ((cpu->mem->dev_baseaddr[i] + |
paddr <= ((cpu->mem->dev_baseaddr[i] + |
145 |
cpu->mem->dev_length[i] - 1) | 0xfff)) { |
cpu->mem->dev_length[i] - 1) | 0xfff)) { |
146 |
if (cpu->mem->dev_flags[i] & MEM_BINTRANS_OK) { |
if (cpu->mem->dev_flags[i] & MEM_DYNTRANS_OK) { |
147 |
paddr -= cpu->mem->dev_baseaddr[i]; |
paddr -= cpu->mem->dev_baseaddr[i]; |
148 |
|
|
149 |
/* Within a device _page_ but not within the |
/* Within a device _page_ but not within the |
156 |
uint64_t low_paddr = paddr & ~0xfff; |
uint64_t low_paddr = paddr & ~0xfff; |
157 |
uint64_t high_paddr = paddr | 0xfff; |
uint64_t high_paddr = paddr | 0xfff; |
158 |
if (!(cpu->mem->dev_flags[i] & |
if (!(cpu->mem->dev_flags[i] & |
159 |
MEM_BINTRANS_WRITE_OK)) |
MEM_DYNTRANS_WRITE_OK)) |
160 |
return NULL; |
return NULL; |
161 |
|
|
162 |
if (low_paddr < cpu->mem-> |
if (low_paddr < cpu->mem-> |
163 |
dev_bintrans_write_low[i]) |
dev_dyntrans_write_low[i]) |
164 |
cpu->mem-> |
cpu->mem-> |
165 |
dev_bintrans_write_low[i] = |
dev_dyntrans_write_low[i] = |
166 |
low_paddr; |
low_paddr; |
167 |
if (high_paddr > cpu->mem-> |
if (high_paddr > cpu->mem-> |
168 |
dev_bintrans_write_high[i]) |
dev_dyntrans_write_high[i]) |
169 |
cpu->mem-> |
cpu->mem-> |
170 |
dev_bintrans_write_high[i] |
dev_dyntrans_write_high[i] |
171 |
= high_paddr; |
= high_paddr; |
172 |
} |
} |
173 |
|
|
177 |
MAX - 1; |
MAX - 1; |
178 |
cpu->cd.mips.bintrans_data_hostpage[cpu-> |
cpu->cd.mips.bintrans_data_hostpage[cpu-> |
179 |
cd.mips.bintrans_next_index] = cpu->mem-> |
cd.mips.bintrans_next_index] = cpu->mem-> |
180 |
dev_bintrans_data[i] + (paddr & ~0xfff); |
dev_dyntrans_data[i] + (paddr & ~0xfff); |
181 |
cpu->cd.mips.bintrans_data_vaddr[cpu-> |
cpu->cd.mips.bintrans_data_vaddr[cpu-> |
182 |
cd.mips.bintrans_next_index] = vaddr_page; |
cd.mips.bintrans_next_index] = vaddr_page; |
183 |
cpu->cd.mips.bintrans_data_writable[cpu-> |
cpu->cd.mips.bintrans_data_writable[cpu-> |
184 |
cd.mips.bintrans_next_index] = writeflag; |
cd.mips.bintrans_next_index] = writeflag; |
185 |
return cpu->mem->dev_bintrans_data[i] + paddr; |
return cpu->mem->dev_dyntrans_data[i] + paddr; |
186 |
} else |
} else |
187 |
return NULL; |
return NULL; |
188 |
} |
} |