nkeynes@976 | 1 |
|
nkeynes@976 | 2 |
|
nkeynes@976 | 3 | .global _install_utlb_test_handler
|
nkeynes@976 | 4 | _install_utlb_test_handler:
|
nkeynes@976 | 5 | mov.l utlb_old_vbr_k, r0
|
nkeynes@976 | 6 | stc vbr, r1
|
nkeynes@976 | 7 | mov.l r1, @r0
|
nkeynes@976 | 8 |
|
nkeynes@976 | 9 | mov.l utlb_vbr_k, r0
|
nkeynes@976 | 10 | ldc r0, vbr
|
nkeynes@976 | 11 | rts
|
nkeynes@976 | 12 | nop
|
nkeynes@976 | 13 |
|
nkeynes@976 | 14 | .global _uninstall_utlb_test_handler
|
nkeynes@976 | 15 | _uninstall_utlb_test_handler:
|
nkeynes@976 | 16 | mov.l utlb_old_vbr_k, r0
|
nkeynes@976 | 17 | mov.l @r0, r0
|
nkeynes@976 | 18 | ldc r0, vbr
|
nkeynes@976 | 19 | rts
|
nkeynes@976 | 20 | nop
|
nkeynes@976 | 21 |
|
nkeynes@976 | 22 | utlb_exc_handler:
|
nkeynes@976 | 23 | mov.l utlb_exc_stack_k, r15
|
nkeynes@976 | 24 | mov.l r0, @-r15
|
nkeynes@976 | 25 | mov.l r1, @-r15
|
nkeynes@976 | 26 | mov.l r2, @-r15
|
nkeynes@976 | 27 | sts pr, r0
|
nkeynes@976 | 28 | mov.l r0, @-r15
|
nkeynes@976 | 29 |
|
nkeynes@976 | 30 | mov.l mmu_expevt_k, r2
|
nkeynes@976 | 31 | mov.l @r2, r2
|
nkeynes@976 | 32 | mov r2, r0
|
nkeynes@976 | 33 | shlr2 r0
|
nkeynes@976 | 34 | cmp/eq #0x58, r0
|
nkeynes@976 | 35 | bt utlb_trap
|
nkeynes@976 | 36 |
|
nkeynes@976 | 37 | mov.l utlb_exc_k_1, r0
|
nkeynes@976 | 38 | mov.l @(16,r0), r1
|
nkeynes@976 | 39 | tst r1, r1
|
nkeynes@976 | 40 | bt utlb_exc_unexpected
|
nkeynes@976 | 41 |
|
nkeynes@976 | 42 | mov.l @r0, r1
|
nkeynes@976 | 43 | tst r1, r1
|
nkeynes@976 | 44 | bf utlb_exc_set
|
nkeynes@976 | 45 | mov.l r2, @r0
|
nkeynes@976 | 46 | stc spc, r2
|
nkeynes@976 | 47 | mov.l r2, @(8,r0)
|
nkeynes@976 | 48 |
|
nkeynes@976 | 49 | utlb_exc_set:
|
nkeynes@976 | 50 | mov.l @(4,r0), r2
|
nkeynes@976 | 51 | add #1, r2
|
nkeynes@976 | 52 | mov.l r2, @(4,r0)
|
nkeynes@976 | 53 |
|
nkeynes@976 | 54 | mov.l @(12,r0), r2
|
nkeynes@976 | 55 | stc spc, r1
|
nkeynes@976 | 56 | add r2, r1
|
nkeynes@976 | 57 | ldc r1, spc
|
nkeynes@976 | 58 |
|
nkeynes@976 | 59 | utlb_exc_done:
|
nkeynes@976 | 60 | mov.l @r15+, r0
|
nkeynes@976 | 61 | lds r0, pr
|
nkeynes@976 | 62 | mov.l @r15+, r2
|
nkeynes@976 | 63 | mov.l @r15+, r1
|
nkeynes@976 | 64 | mov.l @r15+, r0
|
nkeynes@976 | 65 | rte
|
nkeynes@976 | 66 | stc sgr, r15
|
nkeynes@976 | 67 |
|
nkeynes@976 | 68 | utlb_trap:
|
nkeynes@976 | 69 | mov.l mmu_tra_k, r2
|
nkeynes@976 | 70 | mov.l @r2, r0
|
nkeynes@976 | 71 | shlr2 r0
|
nkeynes@976 | 72 | cmp/eq #42, r0
|
nkeynes@976 | 73 | bt utlb_trap_priv
|
nkeynes@976 | 74 | cmp/eq #41, r0
|
nkeynes@976 | 75 | bt utlb_trap_printf
|
nkeynes@976 | 76 | bra utlb_exc_done
|
nkeynes@976 | 77 | nop
|
nkeynes@976 | 78 | utlb_trap_priv:
|
nkeynes@976 | 79 | stc ssr, r0
|
nkeynes@976 | 80 | mov.l mmu_sr_md, r1
|
nkeynes@976 | 81 | or r1, r0
|
nkeynes@976 | 82 | ldc r0, ssr
|
nkeynes@976 | 83 | bra utlb_exc_done
|
nkeynes@976 | 84 | nop
|
nkeynes@976 | 85 | utlb_trap_printf:
|
nkeynes@976 | 86 | stc sr, r0
|
nkeynes@976 | 87 | mov.l mmu_sr_rb_mask, r1
|
nkeynes@976 | 88 | and r1, r0
|
nkeynes@976 | 89 | ldc r0, sr
|
nkeynes@976 | 90 | mov.l utlb_printf_k, r0
|
nkeynes@976 | 91 | jsr @r0
|
nkeynes@976 | 92 | nop
|
nkeynes@976 | 93 | bra utlb_exc_done
|
nkeynes@976 | 94 | nop
|
nkeynes@976 | 95 | utlb_exc_unexpected: /* Report an unexpected exception. Save everything in case printf clobbers it */
|
nkeynes@976 | 96 | mov.l r3, @-r15
|
nkeynes@976 | 97 | mov.l r4, @-r15
|
nkeynes@976 | 98 | mov.l r5, @-r15
|
nkeynes@976 | 99 | mov.l r6, @-r15
|
nkeynes@976 | 100 | mov.l r7, @-r15
|
nkeynes@976 | 101 | mov.l r8, @-r15
|
nkeynes@976 | 102 | mov.l r9, @-r15
|
nkeynes@976 | 103 | mov.l r10, @-r15
|
nkeynes@976 | 104 | mov.l r11, @-r15
|
nkeynes@976 | 105 | mov.l r12, @-r15
|
nkeynes@976 | 106 | mov.l r13, @-r15
|
nkeynes@976 | 107 | mov.l r14, @-r15
|
nkeynes@976 | 108 | sts fpscr, r0
|
nkeynes@976 | 109 | mov.l r0, @-r15
|
nkeynes@976 | 110 |
|
nkeynes@976 | 111 | stc spc, r6
|
nkeynes@976 | 112 | mov r2, r5
|
nkeynes@976 | 113 | mov.l utlb_unexpected_msg_k, r4
|
nkeynes@976 | 114 | mov.l utlb_printf_k, r3
|
nkeynes@976 | 115 | jsr @r3
|
nkeynes@976 | 116 | nop
|
nkeynes@976 | 117 |
|
nkeynes@976 | 118 | mov.l @r15+, r0
|
nkeynes@976 | 119 | lds r0, fpscr
|
nkeynes@976 | 120 | mov.l @r15+, r14
|
nkeynes@976 | 121 | mov.l @r15+, r13
|
nkeynes@976 | 122 | mov.l @r15+, r12
|
nkeynes@976 | 123 | mov.l @r15+, r11
|
nkeynes@976 | 124 | mov.l @r15+, r10
|
nkeynes@976 | 125 | mov.l @r15+, r9
|
nkeynes@976 | 126 | mov.l @r15+, r8
|
nkeynes@976 | 127 | mov.l @r15+, r7
|
nkeynes@976 | 128 | mov.l @r15+, r6
|
nkeynes@976 | 129 | mov.l @r15+, r5
|
nkeynes@976 | 130 | mov.l @r15+, r4
|
nkeynes@976 | 131 | mov.l @r15+, r3
|
nkeynes@976 | 132 | mov.l utlb_exc_k_1, r0
|
nkeynes@976 | 133 | bra utlb_exc_set
|
nkeynes@976 | 134 | nop
|
nkeynes@976 | 135 |
|
nkeynes@976 | 136 |
|
nkeynes@976 | 137 | .align 4
|
nkeynes@976 | 138 | utlb_vbr_k:
|
nkeynes@976 | 139 | .long utlb_vbr
|
nkeynes@976 | 140 | utlb_old_vbr_k:
|
nkeynes@976 | 141 | .long utlb_old_vbr
|
nkeynes@976 | 142 | utlb_exc_k_1:
|
nkeynes@976 | 143 | .long utlb_exc
|
nkeynes@976 | 144 | mmu_expevt_k:
|
nkeynes@976 | 145 | .long 0xFF000024
|
nkeynes@976 | 146 | mmu_tra_k:
|
nkeynes@976 | 147 | .long 0xFF000020
|
nkeynes@976 | 148 | mmu_sr_md:
|
nkeynes@976 | 149 | .long 0x40000000
|
nkeynes@976 | 150 | mmu_sr_rb_mask:
|
nkeynes@976 | 151 | .long 0x50000000
|
nkeynes@976 | 152 | utlb_exc_stack_k:
|
nkeynes@976 | 153 | .long utlb_exc_stack
|
nkeynes@976 | 154 | utlb_printf_k:
|
nkeynes@976 | 155 | .long _printf
|
nkeynes@976 | 156 | utlb_unexpected_msg_k:
|
nkeynes@976 | 157 | .long utlb_unexpected_msg
|
nkeynes@976 | 158 |
|
nkeynes@976 | 159 | .skip 0x1F00 /* 8K stack */
|
nkeynes@976 | 160 | utlb_vbr:
|
nkeynes@976 | 161 | .skip 0x100
|
nkeynes@976 | 162 | utlb_exc_stack:
|
nkeynes@976 | 163 | mov.l utlb_exc_handler_k1, r15
|
nkeynes@976 | 164 | jmp @r15
|
nkeynes@976 | 165 | nop
|
nkeynes@976 | 166 | nop
|
nkeynes@976 | 167 | utlb_exc_handler_k1:
|
nkeynes@976 | 168 | .long utlb_exc_handler
|
nkeynes@976 | 169 |
|
nkeynes@976 | 170 | .skip 0x2F4
|
nkeynes@976 | 171 | mov.l utlb_exc_handler_k2, r15
|
nkeynes@976 | 172 | jmp @r15
|
nkeynes@976 | 173 | nop
|
nkeynes@976 | 174 | nop
|
nkeynes@976 | 175 | utlb_exc_handler_k2:
|
nkeynes@976 | 176 | .long utlb_exc_handler
|
nkeynes@976 | 177 | .skip 0x1F4
|
nkeynes@976 | 178 | rte
|
nkeynes@976 | 179 | stc sgr, r15
|
nkeynes@976 | 180 |
|
nkeynes@976 | 181 |
|
nkeynes@976 | 182 | utlb_expect_exc:
|
nkeynes@976 | 183 | mova utlb_exc, r0
|
nkeynes@976 | 184 | xor r1, r1
|
nkeynes@976 | 185 | mov.l r1, @r0
|
nkeynes@976 | 186 | mov.l r1, @(4,r0)
|
nkeynes@976 | 187 | mov.l r1, @(8,r0)
|
nkeynes@976 | 188 | mov #1, r1
|
nkeynes@976 | 189 | mov.l r1, @(16,r0)
|
nkeynes@976 | 190 | mov #2, r1
|
nkeynes@976 | 191 | mov.l r1, @(12,r0)
|
nkeynes@976 | 192 | rts
|
nkeynes@976 | 193 | nop
|
nkeynes@976 | 194 |
|
nkeynes@976 | 195 | utlb_noexpect_exc:
|
nkeynes@976 | 196 | mova utlb_exc, r0
|
nkeynes@976 | 197 | xor r1, r1
|
nkeynes@976 | 198 | mov.l r1, @r0
|
nkeynes@976 | 199 | mov.l r1, @(4,r0)
|
nkeynes@976 | 200 | mov.l r1, @(8,r0)
|
nkeynes@976 | 201 | mov.l r1, @(16,r0)
|
nkeynes@976 | 202 | mov #2, r1
|
nkeynes@976 | 203 | mov.l r1, @(12,r0)
|
nkeynes@976 | 204 | rts
|
nkeynes@976 | 205 | nop
|
nkeynes@976 | 206 |
|
nkeynes@976 | 207 | /* Check the result of a read test. Call with:
|
nkeynes@976 | 208 | * r0 = expected spc
|
nkeynes@976 | 209 | * r1 = value read (if any)
|
nkeynes@976 | 210 | * r9 = (char *) testname
|
nkeynes@976 | 211 | * r10 = test VMA
|
nkeynes@976 | 212 | * r11 = test PMA
|
nkeynes@976 | 213 | * r12 = expected exc
|
nkeynes@976 | 214 | *
|
nkeynes@976 | 215 | * Trashes r0..r7
|
nkeynes@976 | 216 | */
|
nkeynes@976 | 217 | utlb_check_read_exc:
|
nkeynes@976 | 218 | mov.l utlb_exc_k, r3
|
nkeynes@976 | 219 | mov.l addr_mask, r2
|
nkeynes@976 | 220 | and r2, r3
|
nkeynes@976 | 221 |
|
nkeynes@976 | 222 | mov.l @r3, r2
|
nkeynes@976 | 223 | cmp/eq r2, r12
|
nkeynes@976 | 224 | bf test_read_exc_bad
|
nkeynes@976 | 225 | tst r12, r12
|
nkeynes@976 | 226 | bt test_read_ok /* Expected no exception, and got none */
|
nkeynes@976 | 227 | mov.l @(4,r3), r2
|
nkeynes@976 | 228 | dt r2
|
nkeynes@976 | 229 | bf test_read_count_bad
|
nkeynes@976 | 230 | mov.l @(8,r3), r2
|
nkeynes@976 | 231 | cmp/eq r0, r2
|
nkeynes@976 | 232 | bt test_read_ok
|
nkeynes@976 | 233 | test_read_pc_bad:
|
nkeynes@976 | 234 | add #1, r14
|
nkeynes@976 | 235 | mov r0, r6
|
nkeynes@976 | 236 | mov.l err_read_pc_msg_k, r4
|
nkeynes@976 | 237 | mov r2, r7
|
nkeynes@976 | 238 | mov r9, r5
|
nkeynes@976 | 239 | trapa #41
|
nkeynes@976 | 240 | bra test_read_ok
|
nkeynes@976 | 241 | nop
|
nkeynes@976 | 242 | test_read_count_bad:
|
nkeynes@976 | 243 | add #1, r14
|
nkeynes@976 | 244 | add #2, r2
|
nkeynes@976 | 245 | mov.l err_read_count_msg_k, r4
|
nkeynes@976 | 246 | mov r2, r6
|
nkeynes@976 | 247 | mov r9, r5
|
nkeynes@976 | 248 | trapa #41
|
nkeynes@976 | 249 | bra test_read_ok
|
nkeynes@976 | 250 | nop
|
nkeynes@976 | 251 | test_read_exc_bad:
|
nkeynes@976 | 252 | add #1, r14
|
nkeynes@976 | 253 | mov.l err_read_exc_msg_k, r4
|
nkeynes@976 | 254 | mov r12, r6
|
nkeynes@976 | 255 | mov r2, r7
|
nkeynes@976 | 256 | mov r9, r5
|
nkeynes@976 | 257 | trapa #41
|
nkeynes@976 | 258 | bra test_read_ok
|
nkeynes@976 | 259 | nop
|
nkeynes@976 | 260 | test_read_ok:
|
nkeynes@976 | 261 | bra utlb_expect_exc
|
nkeynes@976 | 262 | nop
|
nkeynes@976 | 263 |
|
nkeynes@976 | 264 | /* Check the result of a write test (and clears the exception). Call with:
|
nkeynes@976 | 265 | * r0 = expected spc
|
nkeynes@976 | 266 | * r1 = written value
|
nkeynes@976 | 267 | * r9 = (char *) testname
|
nkeynes@976 | 268 | * r10 = test VMA
|
nkeynes@976 | 269 | * r11 = test PMA
|
nkeynes@976 | 270 | * r13 = expected exc
|
nkeynes@976 | 271 | * r14 = fail count (updated)
|
nkeynes@976 | 272 | *
|
nkeynes@976 | 273 | * Trashes r0..r7
|
nkeynes@976 | 274 | */
|
nkeynes@976 | 275 | utlb_check_write_exc:
|
nkeynes@976 | 276 | mov.l utlb_exc_k, r3
|
nkeynes@976 | 277 | mov.l addr_mask, r2
|
nkeynes@976 | 278 | and r2, r3
|
nkeynes@976 | 279 |
|
nkeynes@976 | 280 | mov.l @r3, r2
|
nkeynes@976 | 281 | cmp/eq r2, r13
|
nkeynes@976 | 282 | bf test_write_exc_bad
|
nkeynes@976 | 283 | tst r13, r13
|
nkeynes@976 | 284 | bt test_write_ok /* Expected no exception, and got none */
|
nkeynes@976 | 285 | mov.l @(4,r3), r2
|
nkeynes@976 | 286 | dt r2
|
nkeynes@976 | 287 | bf test_write_count_bad
|
nkeynes@976 | 288 | mov.l @(8,r3), r2
|
nkeynes@976 | 289 | cmp/eq r0, r2
|
nkeynes@976 | 290 | bt test_write_ok
|
nkeynes@976 | 291 | test_write_pc_bad:
|
nkeynes@976 | 292 | add #1, r14
|
nkeynes@976 | 293 | mov r0, r6
|
nkeynes@976 | 294 | mov.l err_write_pc_msg_k, r4
|
nkeynes@976 | 295 | mov r2, r7
|
nkeynes@976 | 296 | mov r9, r5
|
nkeynes@976 | 297 | trapa #41
|
nkeynes@976 | 298 | bra test_write_ok
|
nkeynes@976 | 299 | nop
|
nkeynes@976 | 300 | test_write_count_bad:
|
nkeynes@976 | 301 | add #1, r14
|
nkeynes@976 | 302 | add #1, r2
|
nkeynes@976 | 303 | mov.l err_write_count_msg_k, r4
|
nkeynes@976 | 304 | mov r2, r6
|
nkeynes@976 | 305 | mov r9, r5
|
nkeynes@976 | 306 | trapa #41
|
nkeynes@976 | 307 | bra test_write_ok
|
nkeynes@976 | 308 | nop
|
nkeynes@976 | 309 | test_write_exc_bad:
|
nkeynes@976 | 310 | add #1, r14
|
nkeynes@976 | 311 | mov.l err_write_exc_msg_k, r4
|
nkeynes@976 | 312 | mov r13, r6
|
nkeynes@976 | 313 | mov r2, r7
|
nkeynes@976 | 314 | mov r9, r5
|
nkeynes@976 | 315 | trapa #41
|
nkeynes@976 | 316 | bra test_write_ok
|
nkeynes@976 | 317 | nop
|
nkeynes@976 | 318 | test_write_ok:
|
nkeynes@976 | 319 | bra utlb_expect_exc
|
nkeynes@976 | 320 | nop
|
nkeynes@976 | 321 | .align 4
|
nkeynes@976 | 322 | utlb_exc_k:
|
nkeynes@976 | 323 | .long utlb_exc
|
nkeynes@976 | 324 | err_read_exc_msg_k:
|
nkeynes@976 | 325 | .long err_read_exc_msg
|
nkeynes@976 | 326 | err_read_count_msg_k:
|
nkeynes@976 | 327 | .long err_read_count_msg
|
nkeynes@976 | 328 | err_read_pc_msg_k:
|
nkeynes@976 | 329 | .long err_read_pc_msg
|
nkeynes@976 | 330 | err_write_exc_msg_k:
|
nkeynes@976 | 331 | .long err_write_exc_msg
|
nkeynes@976 | 332 | err_write_count_msg_k:
|
nkeynes@976 | 333 | .long err_write_count_msg
|
nkeynes@976 | 334 | err_write_pc_msg_k:
|
nkeynes@976 | 335 | .long err_write_pc_msg
|
nkeynes@976 | 336 |
|
nkeynes@976 | 337 | .align 4
|
nkeynes@976 | 338 | utlb_old_vbr:
|
nkeynes@976 | 339 | .long 0
|
nkeynes@976 | 340 | utlb_exc:
|
nkeynes@976 | 341 | .long 0
|
nkeynes@976 | 342 | utlb_exc_count:
|
nkeynes@976 | 343 | .long 0
|
nkeynes@976 | 344 | utlb_exc_spc:
|
nkeynes@976 | 345 | .long 0
|
nkeynes@976 | 346 | utlb_rte_offset:
|
nkeynes@976 | 347 | .long 2
|
nkeynes@976 | 348 | utlb_expected:
|
nkeynes@976 | 349 | .long 0
|
nkeynes@976 | 350 |
|
nkeynes@976 | 351 | .global _run_utlb_priv_test
|
nkeynes@976 | 352 | _run_utlb_priv_test:
|
nkeynes@976 | 353 | mov.l r14, @-r15
|
nkeynes@976 | 354 | sts pr, r0
|
nkeynes@976 | 355 | mov.l r0, @-r15
|
nkeynes@976 | 356 | mov.l r13, @-r15
|
nkeynes@976 | 357 | mov.l r12, @-r15
|
nkeynes@976 | 358 | mov.l r11, @-r15
|
nkeynes@976 | 359 | mov.l r10, @-r15
|
nkeynes@976 | 360 | mov.l r9, @-r15
|
nkeynes@976 | 361 | mov.l r8, @-r15
|
nkeynes@976 | 362 |
|
nkeynes@976 | 363 | mov.l @(0,r4), r9 /* Test name */
|
nkeynes@976 | 364 | mov.l @(4,r4), r10 /* Test VMA */
|
nkeynes@976 | 365 | mov.l @(8,r4), r11 /* Test PMA */
|
nkeynes@976 | 366 | mov.l @(12,r4), r12 /* Read exception */
|
nkeynes@976 | 367 | mov.l @(16,r4), r13 /* Write exception */
|
nkeynes@976 | 368 | xor r14, r14 /* Fail count */
|
nkeynes@976 | 369 |
|
nkeynes@976 | 370 | mov.l @r11, r0 /* Save original memory value */
|
nkeynes@976 | 371 | ocbp @r11
|
nkeynes@976 | 372 | mov.l r0, @-r15
|
nkeynes@976 | 373 |
|
nkeynes@976 | 374 | tst r12, r12
|
nkeynes@976 | 375 | bt utlb_read_test_noexc
|
nkeynes@976 | 376 |
|
nkeynes@976 | 377 | /* Exception test cases - all should fail with the same exception */
|
nkeynes@976 | 378 | utlb_read_test_exc:
|
nkeynes@976 | 379 | mov r10, r8
|
nkeynes@976 | 380 | bsr utlb_expect_exc
|
nkeynes@976 | 381 | nop
|
nkeynes@976 | 382 |
|
nkeynes@976 | 383 | /* Test mov.l Rm, Rn */
|
nkeynes@976 | 384 | mova test_readl_1, r0
|
nkeynes@976 | 385 | .align 4
|
nkeynes@976 | 386 | test_readl_1:
|
nkeynes@976 | 387 | mov.l @r10, r1
|
nkeynes@976 | 388 | bsr utlb_check_read_exc
|
nkeynes@976 | 389 | nop
|
nkeynes@976 | 390 |
|
nkeynes@976 | 391 | /* Test mov.l @Rm+, Rn */
|
nkeynes@976 | 392 | mova test_readl_2, r0
|
nkeynes@976 | 393 | .align 4
|
nkeynes@976 | 394 | test_readl_2:
|
nkeynes@976 | 395 | mov.l @r8+, r1
|
nkeynes@976 | 396 | bsr utlb_check_read_exc
|
nkeynes@976 | 397 | nop
|
nkeynes@976 | 398 | cmp/eq r8,r10
|
nkeynes@976 | 399 | bt test_readl_2_ok
|
nkeynes@976 | 400 |
|
nkeynes@976 | 401 | add #1, r14
|
nkeynes@976 | 402 | mov.l err_readlp_bad_msg_k, r4
|
nkeynes@976 | 403 | mov r9, r5
|
nkeynes@976 | 404 | trapa #41
|
nkeynes@976 | 405 |
|
nkeynes@976 | 406 | test_readl_2_ok:
|
nkeynes@976 | 407 | /* Test mov.w @Rm, Rn */
|
nkeynes@976 | 408 | mova test_readw_1, r0
|
nkeynes@976 | 409 | .align 4
|
nkeynes@976 | 410 | test_readw_1:
|
nkeynes@976 | 411 | mov.w @r10, r1
|
nkeynes@976 | 412 | bsr utlb_check_read_exc
|
nkeynes@976 | 413 | nop
|
nkeynes@976 | 414 |
|
nkeynes@976 | 415 | /* Test mov.w @Rm+, Rn */
|
nkeynes@976 | 416 | mova test_readw_2, r0
|
nkeynes@976 | 417 | .align 4
|
nkeynes@976 | 418 | test_readw_2:
|
nkeynes@976 | 419 | mov.w @r8+, r1
|
nkeynes@976 | 420 | bsr utlb_check_read_exc
|
nkeynes@976 | 421 | nop
|
nkeynes@976 | 422 | cmp/eq r8, r10
|
nkeynes@976 | 423 | bt test_readw_2_ok
|
nkeynes@976 | 424 |
|
nkeynes@976 | 425 | add #1, r14
|
nkeynes@976 | 426 | mov.l err_readwp_bad_msg_k, r4
|
nkeynes@976 | 427 | mov r9, r5
|
nkeynes@976 | 428 | trapa #41
|
nkeynes@976 | 429 |
|
nkeynes@976 | 430 | test_readw_2_ok:
|
nkeynes@976 | 431 |
|
nkeynes@976 | 432 | /* Test mov.b @Rm, Rn */
|
nkeynes@976 | 433 | mova test_readb_1, r0
|
nkeynes@976 | 434 | .align 4
|
nkeynes@976 | 435 | test_readb_1:
|
nkeynes@976 | 436 | mov.b @r10, r1
|
nkeynes@976 | 437 | bsr utlb_check_read_exc
|
nkeynes@976 | 438 | nop
|
nkeynes@976 | 439 |
|
nkeynes@976 | 440 | /* Test mov.b @Rm+, Rn */
|
nkeynes@976 | 441 | mova test_readb_2, r0
|
nkeynes@976 | 442 | .align 4
|
nkeynes@976 | 443 | test_readb_2:
|
nkeynes@976 | 444 | mov.b @r8+, r1
|
nkeynes@976 | 445 | bsr utlb_check_read_exc
|
nkeynes@976 | 446 | nop
|
nkeynes@976 | 447 | cmp/eq r8, r10
|
nkeynes@976 | 448 | bt test_readb_2_ok
|
nkeynes@976 | 449 |
|
nkeynes@976 | 450 | add #1, r14
|
nkeynes@976 | 451 | mov.l err_readbp_bad_msg_k, r4
|
nkeynes@976 | 452 | mov r9, r5
|
nkeynes@976 | 453 | trapa #41
|
nkeynes@976 | 454 |
|
nkeynes@976 | 455 | test_readb_2_ok:
|
nkeynes@976 | 456 |
|
nkeynes@976 | 457 | bra utlb_read_test_done
|
nkeynes@976 | 458 | nop
|
nkeynes@976 | 459 |
|
nkeynes@976 | 460 | /* Non-exception read tests */
|
nkeynes@976 | 461 | utlb_read_test_noexc:
|
nkeynes@976 | 462 | mov.l utlb_exc_k_2, r8
|
nkeynes@976 | 463 | mov.l addr_mask, r0
|
nkeynes@976 | 464 | and r0, r8
|
nkeynes@976 | 465 | bsr utlb_noexpect_exc
|
nkeynes@976 | 466 | nop
|
nkeynes@976 | 467 |
|
nkeynes@976 | 468 | mov.l @r10, r1
|
nkeynes@976 | 469 | not r1, r2
|
nkeynes@976 | 470 | mov.l r2, @r11
|
nkeynes@976 | 471 | ocbp @r11
|
nkeynes@976 | 472 | ocbi @r10
|
nkeynes@976 | 473 | mov.l @r10, r1
|
nkeynes@976 | 474 | ocbi @r10
|
nkeynes@976 | 475 | cmp/eq r1, r2
|
nkeynes@976 | 476 | bt noexc_readl_ok
|
nkeynes@976 | 477 |
|
nkeynes@976 | 478 |
|
nkeynes@976 | 479 | add #1, r14
|
nkeynes@976 | 480 | mov.l err_read_mismatch_msg_k, r4
|
nkeynes@976 | 481 | mov r9, r5
|
nkeynes@976 | 482 | trapa #41
|
nkeynes@976 | 483 |
|
nkeynes@976 | 484 | noexc_readl_ok:
|
nkeynes@976 | 485 |
|
nkeynes@976 | 486 | mov.l @(4,r8), r0
|
nkeynes@976 | 487 | add r0, r14
|
nkeynes@976 | 488 | utlb_read_test_done:
|
nkeynes@976 | 489 |
|
nkeynes@976 | 490 | /*********************** Begin write tests *****************************/
|
nkeynes@976 | 491 | tst r13, r13
|
nkeynes@976 | 492 | bt utlb_write_test_noexc
|
nkeynes@976 | 493 |
|
nkeynes@976 | 494 | /* Exception write tests */
|
nkeynes@976 | 495 | utlb_write_test_exc:
|
nkeynes@976 | 496 | bsr utlb_expect_exc
|
nkeynes@976 | 497 | nop
|
nkeynes@976 | 498 |
|
nkeynes@976 | 499 | mova test_writel_pc, r0
|
nkeynes@976 | 500 | .align 4
|
nkeynes@976 | 501 | test_writel_pc:
|
nkeynes@976 | 502 | mov.l r1, @r10
|
nkeynes@976 | 503 | bsr utlb_check_write_exc
|
nkeynes@976 | 504 | nop
|
nkeynes@976 | 505 |
|
nkeynes@976 | 506 | mova test_writelp_pc, r0
|
nkeynes@976 | 507 | mov r10, r8
|
nkeynes@976 | 508 | .align 4
|
nkeynes@976 | 509 | test_writelp_pc:
|
nkeynes@976 | 510 | mov.l r1, @-r8
|
nkeynes@976 | 511 | bsr utlb_check_write_exc
|
nkeynes@976 | 512 | nop
|
nkeynes@976 | 513 | cmp/eq r8, r10
|
nkeynes@976 | 514 | bt test_writelp_ok
|
nkeynes@976 | 515 | add #1, r14
|
nkeynes@976 | 516 | mov.l err_writelp_bad_msg_k, r4
|
nkeynes@976 | 517 | mov r9, r5
|
nkeynes@976 | 518 | trapa #41
|
nkeynes@976 | 519 | test_writelp_ok:
|
nkeynes@976 | 520 |
|
nkeynes@976 | 521 | mova test_writew_pc, r0
|
nkeynes@976 | 522 | .align 4
|
nkeynes@976 | 523 | test_writew_pc:
|
nkeynes@976 | 524 | mov.w r1, @r10
|
nkeynes@976 | 525 | bsr utlb_check_write_exc
|
nkeynes@976 | 526 | nop
|
nkeynes@976 | 527 |
|
nkeynes@976 | 528 | mova test_writewp_pc, r0
|
nkeynes@976 | 529 | mov r10, r8
|
nkeynes@976 | 530 | .align 4
|
nkeynes@976 | 531 | test_writewp_pc:
|
nkeynes@976 | 532 | mov.w r1, @-r8
|
nkeynes@976 | 533 | bsr utlb_check_write_exc
|
nkeynes@976 | 534 | nop
|
nkeynes@976 | 535 | cmp/eq r8, r10
|
nkeynes@976 | 536 | bt test_writewp_ok
|
nkeynes@976 | 537 | add #1, r14
|
nkeynes@976 | 538 | mov.l err_writewp_bad_msg_k, r4
|
nkeynes@976 | 539 | mov r9, r5
|
nkeynes@976 | 540 | trapa #41
|
nkeynes@976 | 541 | test_writewp_ok:
|
nkeynes@976 | 542 |
|
nkeynes@976 | 543 | mova test_writeb_pc, r0
|
nkeynes@976 | 544 | .align 4
|
nkeynes@976 | 545 | test_writeb_pc:
|
nkeynes@976 | 546 | mov.b r1, @r10
|
nkeynes@976 | 547 | bsr utlb_check_write_exc
|
nkeynes@976 | 548 | nop
|
nkeynes@976 | 549 |
|
nkeynes@976 | 550 | mova test_writebp_pc, r0
|
nkeynes@976 | 551 | mov r10, r8
|
nkeynes@976 | 552 | .align 4
|
nkeynes@976 | 553 | test_writebp_pc:
|
nkeynes@976 | 554 | mov.b r1, @-r8
|
nkeynes@976 | 555 | bsr utlb_check_write_exc
|
nkeynes@976 | 556 | nop
|
nkeynes@976 | 557 | cmp/eq r8, r10
|
nkeynes@976 | 558 | bt test_writebp_ok
|
nkeynes@976 | 559 | add #1, r14
|
nkeynes@976 | 560 | mov.l err_writelp_bad_msg_k, r4
|
nkeynes@976 | 561 | mov r9, r5
|
nkeynes@976 | 562 | trapa #41
|
nkeynes@976 | 563 | test_writebp_ok:
|
nkeynes@976 | 564 |
|
nkeynes@976 | 565 | bra utlb_write_test_done
|
nkeynes@976 | 566 | nop
|
nkeynes@976 | 567 |
|
nkeynes@976 | 568 | /* Non-exception write tests */
|
nkeynes@976 | 569 | utlb_write_test_noexc:
|
nkeynes@976 | 570 | mov.l utlb_exc_k_2, r8
|
nkeynes@976 | 571 | mov.l addr_mask, r0
|
nkeynes@976 | 572 | and r0, r8
|
nkeynes@976 | 573 | bsr utlb_noexpect_exc
|
nkeynes@976 | 574 | nop
|
nkeynes@976 | 575 |
|
nkeynes@976 | 576 | mov.l @r11, r7
|
nkeynes@976 | 577 | ocbp @r11
|
nkeynes@976 | 578 | not r7, r1
|
nkeynes@976 | 579 |
|
nkeynes@976 | 580 | mov.l r1, @r10
|
nkeynes@976 | 581 | ocbp @r10
|
nkeynes@976 | 582 | mov.l @r11, r6
|
nkeynes@976 | 583 | cmp/eq r6, r1
|
nkeynes@976 | 584 | bt test_writel_1_ok
|
nkeynes@976 | 585 |
|
nkeynes@976 | 586 | add #1, r14
|
nkeynes@976 | 587 | mov.l err_write_ignored_msg_k, r4
|
nkeynes@976 | 588 | mov r9, r5
|
nkeynes@976 | 589 | trapa #41
|
nkeynes@976 | 590 |
|
nkeynes@976 | 591 | test_writel_1_ok:
|
nkeynes@976 | 592 |
|
nkeynes@976 | 593 | mov.l @(4,r8), r0
|
nkeynes@976 | 594 | add r0, r14
|
nkeynes@976 | 595 | utlb_write_test_done:
|
nkeynes@976 | 596 |
|
nkeynes@976 | 597 | xor r0, r0
|
nkeynes@976 | 598 | mov.l r0, @(16,r8)
|
nkeynes@976 | 599 |
|
nkeynes@976 | 600 | mov.l @r15+, r0
|
nkeynes@976 | 601 | mov.l r0, @r11
|
nkeynes@976 | 602 | mov.l @r15+, r8
|
nkeynes@976 | 603 | mov.l @r15+, r9
|
nkeynes@976 | 604 | mov.l @r15+, r10
|
nkeynes@976 | 605 | mov.l @r15+, r11
|
nkeynes@976 | 606 | mov.l @r15+, r12
|
nkeynes@976 | 607 | mov.l @r15+, r13
|
nkeynes@976 | 608 | mov.l @r15+, r1
|
nkeynes@976 | 609 | lds r1, pr
|
nkeynes@976 | 610 | mov r14, r0
|
nkeynes@976 | 611 | mov.l @r15+, r14
|
nkeynes@976 | 612 | rts
|
nkeynes@976 | 613 | nop
|
nkeynes@976 | 614 |
|
nkeynes@976 | 615 | .align 4
|
nkeynes@976 | 616 | err_read_mismatch_msg_k:
|
nkeynes@976 | 617 | .long err_read_mismatch_msg
|
nkeynes@976 | 618 | err_write_ignored_msg_k:
|
nkeynes@976 | 619 | .long err_write_ignored_msg
|
nkeynes@976 | 620 | err_readlp_bad_msg_k:
|
nkeynes@976 | 621 | .long err_readlp_bad_msg
|
nkeynes@976 | 622 | err_readwp_bad_msg_k:
|
nkeynes@976 | 623 | .long err_readwp_bad_msg
|
nkeynes@976 | 624 | err_readbp_bad_msg_k:
|
nkeynes@976 | 625 | .long err_readbp_bad_msg
|
nkeynes@976 | 626 | err_writelp_bad_msg_k:
|
nkeynes@976 | 627 | .long err_readlp_bad_msg
|
nkeynes@976 | 628 | err_writewp_bad_msg_k:
|
nkeynes@976 | 629 | .long err_readwp_bad_msg
|
nkeynes@976 | 630 | err_writebp_bad_msg_k:
|
nkeynes@976 | 631 | .long err_readbp_bad_msg
|
nkeynes@976 | 632 |
|
nkeynes@976 | 633 |
|
nkeynes@976 | 634 |
|
nkeynes@976 | 635 | .global _run_utlb_user_test
|
nkeynes@976 | 636 | _run_utlb_user_test:
|
nkeynes@976 | 637 | sts pr, r0
|
nkeynes@976 | 638 | mov.l r0, @-r15
|
nkeynes@976 | 639 | stc sr, r2
|
nkeynes@976 | 640 | mov.l sr_mask, r1
|
nkeynes@976 | 641 | and r1, r2
|
nkeynes@976 | 642 |
|
nkeynes@976 | 643 | mova user_entry_point, r0
|
nkeynes@976 | 644 | mov.l addr_mask, r1
|
nkeynes@976 | 645 | and r1, r0
|
nkeynes@976 | 646 |
|
nkeynes@976 | 647 | mov.l r15, @-r15
|
nkeynes@976 | 648 |
|
nkeynes@976 | 649 | jmp @r0
|
nkeynes@976 | 650 | nop
|
nkeynes@976 | 651 |
|
nkeynes@976 | 652 | user_entry_point:
|
nkeynes@976 | 653 | nop
|
nkeynes@976 | 654 | ldc r2, sr
|
nkeynes@976 | 655 |
|
nkeynes@976 | 656 | /* In user mode */
|
nkeynes@976 | 657 |
|
nkeynes@976 | 658 | mov.l main_test_k, r0
|
nkeynes@976 | 659 | and r1, r0
|
nkeynes@976 | 660 | and r1, r4
|
nkeynes@976 | 661 | and r1, r15
|
nkeynes@976 | 662 | jsr @r0
|
nkeynes@976 | 663 | nop
|
nkeynes@976 | 664 |
|
nkeynes@976 | 665 | /* Done, return to priv mode */
|
nkeynes@976 | 666 | trapa #42
|
nkeynes@976 | 667 | mov.l user_retaddr, r1
|
nkeynes@976 | 668 | jmp @r1
|
nkeynes@976 | 669 | nop
|
nkeynes@976 | 670 |
|
nkeynes@976 | 671 | user_exit_point:
|
nkeynes@976 | 672 | /* Back to priv mode */
|
nkeynes@976 | 673 | mov.l @r15+, r15
|
nkeynes@976 | 674 | mov.l @r15+, r1
|
nkeynes@976 | 675 | lds r1, pr
|
nkeynes@976 | 676 | rts
|
nkeynes@976 | 677 | nop
|
nkeynes@976 | 678 | .align 4
|
nkeynes@976 | 679 |
|
nkeynes@976 | 680 | utlb_exc_k_2:
|
nkeynes@976 | 681 | .long utlb_exc
|
nkeynes@976 | 682 | main_test_k:
|
nkeynes@976 | 683 | .long _run_utlb_priv_test
|
nkeynes@976 | 684 | addr_mask:
|
nkeynes@976 | 685 | .long 0x1FFFFFFF
|
nkeynes@976 | 686 | sr_mask:
|
nkeynes@976 | 687 | .long 0x3FFFFFFF
|
nkeynes@976 | 688 | user_retaddr:
|
nkeynes@976 | 689 | .long user_exit_point
|
nkeynes@976 | 690 |
|
nkeynes@976 | 691 | err_read_exc_msg:
|
nkeynes@976 | 692 | .string "%s: Read failed: Expected Exc %04X but got %04X\n"
|
nkeynes@976 | 693 | err_read_count_msg:
|
nkeynes@976 | 694 | .string "%s: Read bad exception: Exception 1 exception, but got %d\n"
|
nkeynes@976 | 695 | err_read_pc_msg:
|
nkeynes@976 | 696 | .string "%s: Read bad exception: Expected PC=%08X but was %08X\n"
|
nkeynes@976 | 697 | err_read_mismatch_msg:
|
nkeynes@976 | 698 | .string "%s: Read failed: Data mismatch!\n"
|
nkeynes@976 | 699 | err_readlp_bad_msg:
|
nkeynes@976 | 700 | .string "%s: Mov.l @Rm+, Rn failed: Rm changed!\n"
|
nkeynes@976 | 701 | err_readwp_bad_msg:
|
nkeynes@976 | 702 | .string "%s: Mov.w @Rm+, Rn failed: Rm changed!\n"
|
nkeynes@976 | 703 | err_readbp_bad_msg:
|
nkeynes@976 | 704 | .string "%s: Mov.b @Rm+, Rn failed: Rm changed!\n"
|
nkeynes@976 | 705 | err_writelp_bad_msg:
|
nkeynes@976 | 706 | .string "%s: Mov.l Rm, @-Rn failed: Rm changed!\n"
|
nkeynes@976 | 707 | err_writewp_bad_msg:
|
nkeynes@976 | 708 | .string "%s: Mov.w Rm, @-Rn failed: Rm changed!\n"
|
nkeynes@976 | 709 | err_writebp_bad_msg:
|
nkeynes@976 | 710 | .string "%s: Mov.b Rm, @-Rn failed: Rm changed!\n"
|
nkeynes@976 | 711 | err_write_exc_msg:
|
nkeynes@976 | 712 | .string "%s: Write failed: Expected Exc %04X but got %04X\n"
|
nkeynes@976 | 713 | err_write_count_msg:
|
nkeynes@976 | 714 | .string "%s: Write bad exception: Expected 1 exception, but got %d\n"
|
nkeynes@976 | 715 | err_write_pc_msg:
|
nkeynes@976 | 716 | .string "%s: Write bad exception: Expected PC=%08X but was %08X\n"
|
nkeynes@976 | 717 | err_write_ignored_msg:
|
nkeynes@976 | 718 | .string "%s: Write failed: write didn't happen!\n"
|
nkeynes@976 | 719 | utlb_unexpected_msg:
|
nkeynes@976 | 720 | .string "*** Unexpected exception %04X at %08X!\n"
|