revision 972:fb948057cf08
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 972:fb948057cf08 |
parent | 971:886e1ec8447d |
child | 973:7434ac745eff |
author | nkeynes |
date | Mon Jan 26 03:05:54 2009 +0000 (15 years ago) |
Fix TLB access to SH4 peripheral control regions
src/sh4/mmux86.c | view | annotate | diff | log |
1.1 --- a/src/sh4/mmux86.c Thu Jan 22 02:58:13 2009 +00001.2 +++ b/src/sh4/mmux86.c Mon Jan 26 03:05:54 2009 +00001.3 @@ -28,13 +28,13 @@1.4 #define ARG1 R_EDI1.5 #define ARG2 R_ESI1.6 #define DECODE() \1.7 - MOV_imm64_r32((uintptr_t)ext_address_space, R_EAX); /* movq ptr, %rax */ \1.8 + MOV_imm64_r32((uintptr_t)addr_space, R_EAX); /* movq ptr, %rax */ \1.9 REXW(); OP(0x8B); OP(0x0C); OP(0xC8) /* movq [%rax + %rcx*8], %rcx */1.10 #else1.11 #define ARG1 R_EAX1.12 #define ARG2 R_EDX1.13 #define DECODE() \1.14 - MOV_r32disp32x4_r32( R_ECX, (uintptr_t)ext_address_space, R_ECX );1.15 + MOV_r32disp32x4_r32( R_ECX, (uintptr_t)addr_space, R_ECX );1.16 #endif1.18 void mmu_utlb_init_vtable( struct utlb_entry *ent, struct utlb_page_entry *page, gboolean writable )1.19 @@ -42,12 +42,21 @@1.20 uint32_t mask = ent->mask;1.21 uint32_t vpn = ent->vpn & mask;1.22 uint32_t ppn = ent->ppn & mask;1.23 + struct mem_region_fn **addr_space;1.24 + uint8_t **out = (uint8_t **)&page->fn;1.25 + uint8_t **fn;1.26 int inc = writable ? 1 : 2;1.27 int i;1.29 xlat_output = page->code;1.30 - uint8_t **fn = (uint8_t **)ext_address_space[ppn>>12];1.31 - uint8_t **out = (uint8_t **)&page->fn;1.32 + if( (ppn & 0x1FFFFFFF) >= 0x1C000000 ) {1.33 + /* SH4 control region */1.34 + ppn |= 0xE0000000;1.35 + addr_space = sh4_address_space;1.36 + } else {1.37 + addr_space = ext_address_space;1.38 + }1.39 + fn = (uint8_t **)addr_space[ppn>>12];1.41 for( i=0; i<9; i+= inc, fn += inc, out += inc ) {1.42 *out = xlat_output;
.