|
@@ -87,7 +87,8 @@ DATA_TYPE REGPARM glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
|
|
DATA_TYPE res;
|
|
DATA_TYPE res;
|
|
int index;
|
|
int index;
|
|
target_ulong tlb_addr;
|
|
target_ulong tlb_addr;
|
|
- target_phys_addr_t addend;
|
|
|
|
|
|
+ target_phys_addr_t ioaddr;
|
|
|
|
+ unsigned long addend;
|
|
void *retaddr;
|
|
void *retaddr;
|
|
|
|
|
|
/* test if there is match for unaligned or IO access */
|
|
/* test if there is match for unaligned or IO access */
|
|
@@ -101,8 +102,8 @@ DATA_TYPE REGPARM glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
|
|
if ((addr & (DATA_SIZE - 1)) != 0)
|
|
if ((addr & (DATA_SIZE - 1)) != 0)
|
|
goto do_unaligned_access;
|
|
goto do_unaligned_access;
|
|
retaddr = GETPC();
|
|
retaddr = GETPC();
|
|
- addend = env->iotlb[mmu_idx][index];
|
|
|
|
- res = glue(io_read, SUFFIX)(addend, addr, retaddr);
|
|
|
|
|
|
+ ioaddr = env->iotlb[mmu_idx][index];
|
|
|
|
+ res = glue(io_read, SUFFIX)(ioaddr, addr, retaddr);
|
|
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
|
|
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
|
|
/* slow unaligned access (it spans two pages or IO) */
|
|
/* slow unaligned access (it spans two pages or IO) */
|
|
do_unaligned_access:
|
|
do_unaligned_access:
|
|
@@ -143,7 +144,8 @@ static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
|
|
{
|
|
{
|
|
DATA_TYPE res, res1, res2;
|
|
DATA_TYPE res, res1, res2;
|
|
int index, shift;
|
|
int index, shift;
|
|
- target_phys_addr_t addend;
|
|
|
|
|
|
+ target_phys_addr_t ioaddr;
|
|
|
|
+ unsigned long addend;
|
|
target_ulong tlb_addr, addr1, addr2;
|
|
target_ulong tlb_addr, addr1, addr2;
|
|
|
|
|
|
index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
|
|
index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
|
|
@@ -154,8 +156,8 @@ static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
|
|
/* IO access */
|
|
/* IO access */
|
|
if ((addr & (DATA_SIZE - 1)) != 0)
|
|
if ((addr & (DATA_SIZE - 1)) != 0)
|
|
goto do_unaligned_access;
|
|
goto do_unaligned_access;
|
|
- addend = env->iotlb[mmu_idx][index];
|
|
|
|
- res = glue(io_read, SUFFIX)(addend, addr, retaddr);
|
|
|
|
|
|
+ ioaddr = env->iotlb[mmu_idx][index];
|
|
|
|
+ res = glue(io_read, SUFFIX)(ioaddr, addr, retaddr);
|
|
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
|
|
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
|
|
do_unaligned_access:
|
|
do_unaligned_access:
|
|
/* slow unaligned access (it spans two pages) */
|
|
/* slow unaligned access (it spans two pages) */
|
|
@@ -224,7 +226,8 @@ void REGPARM glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr,
|
|
DATA_TYPE val,
|
|
DATA_TYPE val,
|
|
int mmu_idx)
|
|
int mmu_idx)
|
|
{
|
|
{
|
|
- target_phys_addr_t addend;
|
|
|
|
|
|
+ target_phys_addr_t ioaddr;
|
|
|
|
+ unsigned long addend;
|
|
target_ulong tlb_addr;
|
|
target_ulong tlb_addr;
|
|
void *retaddr;
|
|
void *retaddr;
|
|
int index;
|
|
int index;
|
|
@@ -238,8 +241,8 @@ void REGPARM glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr,
|
|
if ((addr & (DATA_SIZE - 1)) != 0)
|
|
if ((addr & (DATA_SIZE - 1)) != 0)
|
|
goto do_unaligned_access;
|
|
goto do_unaligned_access;
|
|
retaddr = GETPC();
|
|
retaddr = GETPC();
|
|
- addend = env->iotlb[mmu_idx][index];
|
|
|
|
- glue(io_write, SUFFIX)(addend, val, addr, retaddr);
|
|
|
|
|
|
+ ioaddr = env->iotlb[mmu_idx][index];
|
|
|
|
+ glue(io_write, SUFFIX)(ioaddr, val, addr, retaddr);
|
|
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
|
|
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
|
|
do_unaligned_access:
|
|
do_unaligned_access:
|
|
retaddr = GETPC();
|
|
retaddr = GETPC();
|
|
@@ -277,7 +280,8 @@ static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(target_ulong addr,
|
|
int mmu_idx,
|
|
int mmu_idx,
|
|
void *retaddr)
|
|
void *retaddr)
|
|
{
|
|
{
|
|
- target_phys_addr_t addend;
|
|
|
|
|
|
+ target_phys_addr_t ioaddr;
|
|
|
|
+ unsigned long addend;
|
|
target_ulong tlb_addr;
|
|
target_ulong tlb_addr;
|
|
int index, i;
|
|
int index, i;
|
|
|
|
|
|
@@ -289,8 +293,8 @@ static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(target_ulong addr,
|
|
/* IO access */
|
|
/* IO access */
|
|
if ((addr & (DATA_SIZE - 1)) != 0)
|
|
if ((addr & (DATA_SIZE - 1)) != 0)
|
|
goto do_unaligned_access;
|
|
goto do_unaligned_access;
|
|
- addend = env->iotlb[mmu_idx][index];
|
|
|
|
- glue(io_write, SUFFIX)(addend, val, addr, retaddr);
|
|
|
|
|
|
+ ioaddr = env->iotlb[mmu_idx][index];
|
|
|
|
+ glue(io_write, SUFFIX)(ioaddr, val, addr, retaddr);
|
|
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
|
|
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
|
|
do_unaligned_access:
|
|
do_unaligned_access:
|
|
/* XXX: not efficient, but simple */
|
|
/* XXX: not efficient, but simple */
|