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