Commit 4017190e2d75882a0e9dbc40f403e584e0ab46c4
1 parent
0bb3602c
Add SuperSPARC MMU breakpoint registers (Robert Reif)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6125 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
45 additions
and
1 deletions
target-sparc/cpu.h
target-sparc/op_helper.c
| ... | ... | @@ -953,6 +953,28 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign) |
| 953 | 953 | case 0x39: /* data cache diagnostic register */ |
| 954 | 954 | ret = 0; |
| 955 | 955 | break; |
| 956 | + case 0x38: /* SuperSPARC MMU Breakpoint Control Registers */ | |
| 957 | + { | |
| 958 | + int reg = (addr >> 8) & 3; | |
| 959 | + | |
| 960 | + switch(reg) { | |
| 961 | + case 0: /* Breakpoint Value (Addr) */ | |
| 962 | + ret = env->mmubpregs[reg]; | |
| 963 | + break; | |
| 964 | + case 1: /* Breakpoint Mask */ | |
| 965 | + ret = env->mmubpregs[reg]; | |
| 966 | + break; | |
| 967 | + case 2: /* Breakpoint Control */ | |
| 968 | + ret = env->mmubpregs[reg]; | |
| 969 | + break; | |
| 970 | + case 3: /* Breakpoint Status */ | |
| 971 | + ret = env->mmubpregs[reg]; | |
| 972 | + env->mmubpregs[reg] = 0ULL; | |
| 973 | + break; | |
| 974 | + } | |
| 975 | + DPRINTF_MMU("read breakpoint reg[%d] 0x%016llx\n", reg, ret); | |
| 976 | + } | |
| 977 | + break; | |
| 956 | 978 | case 8: /* User code access, XXX */ |
| 957 | 979 | default: |
| 958 | 980 | do_unassigned_access(addr, 0, 0, asi, size); |
| ... | ... | @@ -1283,9 +1305,30 @@ void helper_st_asi(target_ulong addr, uint64_t val, int asi, int size) |
| 1283 | 1305 | // descriptor diagnostic |
| 1284 | 1306 | case 0x36: /* I-cache flash clear */ |
| 1285 | 1307 | case 0x37: /* D-cache flash clear */ |
| 1286 | - case 0x38: /* breakpoint diagnostics */ | |
| 1287 | 1308 | case 0x4c: /* breakpoint action */ |
| 1288 | 1309 | break; |
| 1310 | + case 0x38: /* SuperSPARC MMU Breakpoint Control Registers*/ | |
| 1311 | + { | |
| 1312 | + int reg = (addr >> 8) & 3; | |
| 1313 | + | |
| 1314 | + switch(reg) { | |
| 1315 | + case 0: /* Breakpoint Value (Addr) */ | |
| 1316 | + env->mmubpregs[reg] = (val & 0xfffffffffULL); | |
| 1317 | + break; | |
| 1318 | + case 1: /* Breakpoint Mask */ | |
| 1319 | + env->mmubpregs[reg] = (val & 0xfffffffffULL); | |
| 1320 | + break; | |
| 1321 | + case 2: /* Breakpoint Control */ | |
| 1322 | + env->mmubpregs[reg] = (val & 0x7fULL); | |
| 1323 | + break; | |
| 1324 | + case 3: /* Breakpoint Status */ | |
| 1325 | + env->mmubpregs[reg] = (val & 0xfULL); | |
| 1326 | + break; | |
| 1327 | + } | |
| 1328 | + DPRINTF_MMU("write breakpoint reg[%d] 0x%016llx\n", reg, | |
| 1329 | + env->mmuregs[reg]); | |
| 1330 | + } | |
| 1331 | + break; | |
| 1289 | 1332 | case 8: /* User code access, XXX */ |
| 1290 | 1333 | case 9: /* Supervisor code access, XXX */ |
| 1291 | 1334 | default: | ... | ... |