53 uint64_t *return_paddr,
int flags)
55 *return_paddr = vaddr64 & 0xffffffff;
67 static int arm_check_access(
struct cpu *
cpu,
int ap,
int dav,
int user)
76 case 2:
fatal(
"arm_check_access(): 1 shouldn't be used\n");
87 case 1:
return user? 0 : 1;
90 fatal(
"arm_check_access: UNPREDICTABLE s+r value!\n");
92 case 1:
return user? 0 : 2;
93 case 2:
return user? 1 : 2;
113 uint64_t *return_paddr,
int flags)
116 uint32_t
addr, d=0, d2 = (uint32_t)(int32_t)-1, ptba, vaddr = vaddr64;
122 int domain, dav, ap0,ap1,ap2,ap3, ap = 0, access = 0;
129 addr = ((vaddr & 0xfff00000ULL) >> 18);
140 #ifdef HOST_LITTLE_ENDIAN 145 d = ((d & 0xff) << 24) | ((d & 0xff00) << 8) |
146 ((d & 0xff0000) >> 8) | ((d & 0xff000000) >> 24);
150 domain = (d >> 5) & 15;
151 dav = (cpu->
cd.
arm.
dacr >> (domain * 2)) & 3;
157 goto exception_return;
162 goto exception_return;
164 ptba = d & 0xfffffc00;
165 addr = ptba + ((vaddr & 0x000ff000) >> 10);
169 printf(
"arm memory blah blah adfh asfg asdgasdg\n");
172 d2 = *(uint32_t *)(q);
173 #ifdef HOST_LITTLE_ENDIAN 178 d2 = ((d2 & 0xff) << 24) | ((d2 & 0xff00) << 8) |
179 ((d2 & 0xff0000) >> 8) | ((d2 & 0xff000000) >> 24);
183 goto exception_return;
185 ap = (d2 >> 4) & 255;
186 switch (vaddr & 0x0000c000) {
187 case 0x4000: ap >>= 2;
break;
188 case 0x8000: ap >>= 4;
break;
189 case 0xc000: ap >>= 6;
break;
192 *return_paddr = (d2 & 0xffff0000)|(vaddr & 0x0000ffff);
201 *return_paddr = (d2 & 0xfffffc00) |
202 (vaddr & 0x000003ff);
207 ap3 = (d2 >> 10) & 3;
211 switch (vaddr & 0x00000c00) {
212 case 0x000: ap = ap0;
break;
213 case 0x400: ap = ap1;
break;
214 case 0x800: ap = ap2;
break;
222 if (ap0 != ap1 || ap0 != ap2 || ap0 != ap3)
225 *return_paddr = (d2 & 0xfffff000)|(vaddr & 0x00000fff);
228 access = arm_check_access(cpu, ap, dav, user);
229 if (access > writeflag)
232 goto exception_return;
237 goto exception_return;
239 *return_paddr = (d & 0xfff00000) | (vaddr & 0x000fffff);
241 access = arm_check_access(cpu, ap, dav, user);
242 if (access > writeflag)
245 goto exception_return;
247 default:
fatal(
"TODO: descriptor for vaddr 0x%08x: 0x%08x (" 248 "unimplemented type %i)\n", vaddr, d, d&3);
257 fatal(
"{ arm memory fault: vaddr=0x%08x domain=%i dav=%i ap=%i " 258 "access=%i user=%i", (
int)vaddr, domain, dav, ap,
260 fatal(
" d=0x%08x d2=0x%08x pc=0x%08x }\n", d, d2, (
int)cpu->
pc);
267 cpu->
cd.
arm.
fsr = (domain << 4) | fs;
void fatal(const char *fmt,...)
int arm_translate_v2p_mmu(struct cpu *cpu, uint64_t vaddr64, uint64_t *return_paddr, int flags)
#define FLAG_NOEXCEPTIONS
struct arm_cpu_type_def cpu_type
#define MEMORY_NOT_FULL_PAGE
#define ARM_EXCEPTION_DATA_ABT
#define EMUL_LITTLE_ENDIAN
void arm_exception(struct cpu *cpu, int exception_nr)
int arm_translate_v2p(struct cpu *cpu, uint64_t vaddr64, uint64_t *return_paddr, int flags)
#define ARM_EXCEPTION_PREF_ABT
#define MEMORY_USER_ACCESS
unsigned char * translation_table
unsigned char * memory_paddr_to_hostaddr(struct memory *mem, uint64_t paddr, int writeflag)