55 uint64_t *return_paddr,
int flags)
57 *return_paddr = vaddr64 & 0xffffffff;
69 static int arm_check_access(
struct cpu *
cpu,
int ap,
int dav,
int user)
78 case 2:
fatal(
"arm_check_access(): 1 shouldn't be used\n");
89 case 1:
return user? 0 : 1;
92 fatal(
"arm_check_access: UNPREDICTABLE s+r value!\n");
94 case 1:
return user? 0 : 2;
95 case 2:
return user? 1 : 2;
115 uint64_t *return_paddr,
int flags)
118 uint32_t
addr, d=0, d2 = (uint32_t)(int32_t)-1, ptba, vaddr = vaddr64;
124 int domain, dav, ap0,ap1,ap2,ap3, ap = 0, access = 0;
131 addr = ((vaddr & 0xfff00000ULL) >> 18);
142 #ifdef HOST_LITTLE_ENDIAN
147 d = ((d & 0xff) << 24) | ((d & 0xff00) << 8) |
148 ((d & 0xff0000) >> 8) | ((d & 0xff000000) >> 24);
152 domain = (d >> 5) & 15;
159 goto exception_return;
164 goto exception_return;
166 ptba = d & 0xfffffc00;
167 addr = ptba + ((vaddr & 0x000ff000) >> 10);
171 printf(
"arm memory blah blah adfh asfg asdgasdg\n");
174 d2 = *(uint32_t *)(q);
175 #ifdef HOST_LITTLE_ENDIAN
180 d2 = ((d2 & 0xff) << 24) | ((d2 & 0xff00) << 8) |
181 ((d2 & 0xff0000) >> 8) | ((d2 & 0xff000000) >> 24);
185 goto exception_return;
187 ap = (d2 >> 4) & 255;
188 switch (vaddr & 0x0000c000) {
189 case 0x4000: ap >>= 2;
break;
190 case 0x8000: ap >>= 4;
break;
191 case 0xc000: ap >>= 6;
break;
194 *return_paddr = (d2 & 0xffff0000)|(vaddr & 0x0000ffff);
203 *return_paddr = (d2 & 0xfffffc00) |
204 (vaddr & 0x000003ff);
209 ap3 = (d2 >> 10) & 3;
213 switch (vaddr & 0x00000c00) {
214 case 0x000: ap = ap0;
break;
215 case 0x400: ap = ap1;
break;
216 case 0x800: ap = ap2;
break;
224 if (ap0 != ap1 || ap0 != ap2 || ap0 != ap3)
227 *return_paddr = (d2 & 0xfffff000)|(vaddr & 0x00000fff);
230 access = arm_check_access(
cpu, ap, dav, user);
231 if (access > writeflag)
234 goto exception_return;
239 goto exception_return;
241 *return_paddr = (d & 0xfff00000) | (vaddr & 0x000fffff);
243 access = arm_check_access(
cpu, ap, dav, user);
244 if (access > writeflag)
247 goto exception_return;
249 default:
fatal(
"TODO: descriptor for vaddr 0x%08x: 0x%08x ("
250 "unimplemented type %i)\n", vaddr, d, d&3);
259 fatal(
"{ arm memory fault: vaddr=0x%08x domain=%i dav=%i ap=%i "
260 "access=%i user=%i", (
int)vaddr, domain, dav, ap,
262 fatal(
" d=0x%08x d2=0x%08x pc=0x%08x }\n", d, d2, (
int)
cpu->
pc);