38 int ppc_bat(
struct cpu *
cpu, uint64_t vaddr, uint64_t *return_paddr,
int flags,
41 int i, istart = 0, iend = 8, pp;
49 fatal(
"TODO: ppc_bat() for non-32-bit\n");
53 fatal(
"TODO: ppc_bat() for PPC 601\n");
58 for (i=istart; i<iend; i++) {
63 uint32_t mask = ((upper &
BAT_BL) << 15) | 0x1ffff;
66 if (user && !(upper &
BAT_Vu))
68 if (!user && !(upper &
BAT_Vs))
72 if ((vaddr & ~mask) != (ebs & ~mask))
75 *return_paddr = (vaddr & mask) | (phys & ~mask);
101 static int get_pte_low(
struct cpu *
cpu, uint64_t pteg_select,
102 uint32_t *lowp, uint32_t cmp)
107 for (i=0; i<8; i++) {
108 uint32_t *ep = (uint32_t *) (d + (i << 3)), upper;
135 static int ppc_vtp32(
struct cpu *
cpu, uint32_t vaddr, uint64_t *return_paddr,
136 int *resp, uint64_t msr,
int writeflag,
int instr)
138 int srn = (vaddr >> 28) & 15, api = (vaddr >> 22) &
PTE_API;
139 int access, key, match;
140 uint32_t vsid =
cpu->
cd.
ppc.
sr[srn] & 0x00ffffff;
142 uint32_t hash1, hash2, pteg_select, tmp;
143 uint32_t lower_pte = 0, cmp;
145 htaborg = sdr1 & 0xffff0000UL;
148 hash1 = (vsid & 0x7ffff) ^ ((vaddr >> 12) & 0xffff);
149 tmp = (hash1 >> 10) & (sdr1 & 0x1ff);
150 pteg_select = htaborg & 0xfe000000;
151 pteg_select |= ((hash1 & 0x3ff) << 6);
152 pteg_select |= (htaborg & 0x01ff0000) | (tmp << 16);
156 match = get_pte_low(
cpu, pteg_select, &lower_pte, cmp);
159 hash2 = hash1 ^ 0x7ffff;
160 tmp = (hash2 >> 10) & (sdr1 & 0x1ff);
161 pteg_select = htaborg & 0xfe000000;
162 pteg_select |= ((hash2 & 0x3ff) << 6);
163 pteg_select |= (htaborg & 0x01ff0000) | (tmp << 16);
167 match = get_pte_low(
cpu, pteg_select, &lower_pte, cmp);
181 access = lower_pte &
PTE_PP;
190 case 3: *resp = writeflag? 0 : 1;
197 case 3: *resp = writeflag? 0 : 1;
216 uint64_t *return_paddr,
int flags)
229 *return_paddr = vaddr;
234 fatal(
"ppc_translate_v2p(): TODO: 601\n");
240 res =
ppc_bat(
cpu, vaddr, return_paddr, flags, user);
244 fatal(
"[ TODO: BAT exception ]\n");
251 match = ppc_vtp32(
cpu, vaddr, return_paddr, &res, msr,
253 if (match && res > 0)
257 fatal(
"TODO: ppc 64-bit translation\n");
273 fatal(
"[ memory_ppc: exception! vaddr=0x%" PRIx64
" pc=0x%" PRIx64
274 " instr=%i user=%i wf=%i ]\n", (uint64_t) vaddr,