nkeynes@976: nkeynes@976: nkeynes@976: .global _install_utlb_test_handler nkeynes@976: _install_utlb_test_handler: nkeynes@976: mov.l utlb_old_vbr_k, r0 nkeynes@976: stc vbr, r1 nkeynes@976: mov.l r1, @r0 nkeynes@976: nkeynes@976: mov.l utlb_vbr_k, r0 nkeynes@976: ldc r0, vbr nkeynes@976: rts nkeynes@976: nop nkeynes@976: nkeynes@976: .global _uninstall_utlb_test_handler nkeynes@976: _uninstall_utlb_test_handler: nkeynes@976: mov.l utlb_old_vbr_k, r0 nkeynes@976: mov.l @r0, r0 nkeynes@976: ldc r0, vbr nkeynes@976: rts nkeynes@976: nop nkeynes@976: nkeynes@976: utlb_exc_handler: nkeynes@976: mov.l utlb_exc_stack_k, r15 nkeynes@976: mov.l r0, @-r15 nkeynes@976: mov.l r1, @-r15 nkeynes@976: mov.l r2, @-r15 nkeynes@976: sts pr, r0 nkeynes@976: mov.l r0, @-r15 nkeynes@976: nkeynes@976: mov.l mmu_expevt_k, r2 nkeynes@976: mov.l @r2, r2 nkeynes@976: mov r2, r0 nkeynes@976: shlr2 r0 nkeynes@976: cmp/eq #0x58, r0 nkeynes@976: bt utlb_trap nkeynes@976: nkeynes@976: mov.l utlb_exc_k_1, r0 nkeynes@976: mov.l @(16,r0), r1 nkeynes@976: tst r1, r1 nkeynes@976: bt utlb_exc_unexpected nkeynes@976: nkeynes@976: mov.l @r0, r1 nkeynes@976: tst r1, r1 nkeynes@976: bf utlb_exc_set nkeynes@976: mov.l r2, @r0 nkeynes@976: stc spc, r2 nkeynes@976: mov.l r2, @(8,r0) nkeynes@976: nkeynes@976: utlb_exc_set: nkeynes@976: mov.l @(4,r0), r2 nkeynes@976: add #1, r2 nkeynes@976: mov.l r2, @(4,r0) nkeynes@976: nkeynes@976: mov.l @(12,r0), r2 nkeynes@976: stc spc, r1 nkeynes@976: add r2, r1 nkeynes@976: ldc r1, spc nkeynes@976: nkeynes@976: utlb_exc_done: nkeynes@976: mov.l @r15+, r0 nkeynes@976: lds r0, pr nkeynes@976: mov.l @r15+, r2 nkeynes@976: mov.l @r15+, r1 nkeynes@976: mov.l @r15+, r0 nkeynes@976: rte nkeynes@976: stc sgr, r15 nkeynes@976: nkeynes@976: utlb_trap: nkeynes@976: mov.l mmu_tra_k, r2 nkeynes@976: mov.l @r2, r0 nkeynes@976: shlr2 r0 nkeynes@976: cmp/eq #42, r0 nkeynes@976: bt utlb_trap_priv nkeynes@976: cmp/eq #41, r0 nkeynes@976: bt utlb_trap_printf nkeynes@976: bra utlb_exc_done nkeynes@976: nop nkeynes@976: utlb_trap_priv: nkeynes@976: stc ssr, r0 nkeynes@976: mov.l mmu_sr_md, r1 nkeynes@976: or r1, r0 nkeynes@976: ldc r0, ssr nkeynes@976: bra utlb_exc_done nkeynes@976: nop nkeynes@976: utlb_trap_printf: nkeynes@976: stc sr, r0 nkeynes@976: mov.l mmu_sr_rb_mask, r1 nkeynes@976: and r1, r0 nkeynes@976: ldc r0, sr nkeynes@976: mov.l utlb_printf_k, r0 nkeynes@976: jsr @r0 nkeynes@976: nop nkeynes@976: bra utlb_exc_done nkeynes@976: nop nkeynes@976: utlb_exc_unexpected: /* Report an unexpected exception. Save everything in case printf clobbers it */ nkeynes@976: mov.l r3, @-r15 nkeynes@976: mov.l r4, @-r15 nkeynes@976: mov.l r5, @-r15 nkeynes@976: mov.l r6, @-r15 nkeynes@976: mov.l r7, @-r15 nkeynes@976: mov.l r8, @-r15 nkeynes@976: mov.l r9, @-r15 nkeynes@976: mov.l r10, @-r15 nkeynes@976: mov.l r11, @-r15 nkeynes@976: mov.l r12, @-r15 nkeynes@976: mov.l r13, @-r15 nkeynes@976: mov.l r14, @-r15 nkeynes@976: sts fpscr, r0 nkeynes@976: mov.l r0, @-r15 nkeynes@976: nkeynes@976: stc spc, r6 nkeynes@976: mov r2, r5 nkeynes@976: mov.l utlb_unexpected_msg_k, r4 nkeynes@976: mov.l utlb_printf_k, r3 nkeynes@976: jsr @r3 nkeynes@976: nop nkeynes@976: nkeynes@976: mov.l @r15+, r0 nkeynes@976: lds r0, fpscr nkeynes@976: mov.l @r15+, r14 nkeynes@976: mov.l @r15+, r13 nkeynes@976: mov.l @r15+, r12 nkeynes@976: mov.l @r15+, r11 nkeynes@976: mov.l @r15+, r10 nkeynes@976: mov.l @r15+, r9 nkeynes@976: mov.l @r15+, r8 nkeynes@976: mov.l @r15+, r7 nkeynes@976: mov.l @r15+, r6 nkeynes@976: mov.l @r15+, r5 nkeynes@976: mov.l @r15+, r4 nkeynes@976: mov.l @r15+, r3 nkeynes@976: mov.l utlb_exc_k_1, r0 nkeynes@976: bra utlb_exc_set nkeynes@976: nop nkeynes@976: nkeynes@976: nkeynes@976: .align 4 nkeynes@976: utlb_vbr_k: nkeynes@976: .long utlb_vbr nkeynes@976: utlb_old_vbr_k: nkeynes@976: .long utlb_old_vbr nkeynes@976: utlb_exc_k_1: nkeynes@976: .long utlb_exc nkeynes@976: mmu_expevt_k: nkeynes@976: .long 0xFF000024 nkeynes@976: mmu_tra_k: nkeynes@976: .long 0xFF000020 nkeynes@976: mmu_sr_md: nkeynes@976: .long 0x40000000 nkeynes@976: mmu_sr_rb_mask: nkeynes@976: .long 0x50000000 nkeynes@976: utlb_exc_stack_k: nkeynes@976: .long utlb_exc_stack nkeynes@976: utlb_printf_k: nkeynes@976: .long _printf nkeynes@976: utlb_unexpected_msg_k: nkeynes@976: .long utlb_unexpected_msg nkeynes@976: nkeynes@976: .skip 0x1F00 /* 8K stack */ nkeynes@976: utlb_vbr: nkeynes@976: .skip 0x100 nkeynes@976: utlb_exc_stack: nkeynes@976: mov.l utlb_exc_handler_k1, r15 nkeynes@976: jmp @r15 nkeynes@976: nop nkeynes@976: nop nkeynes@976: utlb_exc_handler_k1: nkeynes@976: .long utlb_exc_handler nkeynes@976: nkeynes@976: .skip 0x2F4 nkeynes@976: mov.l utlb_exc_handler_k2, r15 nkeynes@976: jmp @r15 nkeynes@976: nop nkeynes@976: nop nkeynes@976: utlb_exc_handler_k2: nkeynes@976: .long utlb_exc_handler nkeynes@976: .skip 0x1F4 nkeynes@976: rte nkeynes@976: stc sgr, r15 nkeynes@976: nkeynes@976: nkeynes@976: utlb_expect_exc: nkeynes@976: mova utlb_exc, r0 nkeynes@976: xor r1, r1 nkeynes@976: mov.l r1, @r0 nkeynes@976: mov.l r1, @(4,r0) nkeynes@976: mov.l r1, @(8,r0) nkeynes@976: mov #1, r1 nkeynes@976: mov.l r1, @(16,r0) nkeynes@976: mov #2, r1 nkeynes@976: mov.l r1, @(12,r0) nkeynes@976: rts nkeynes@976: nop nkeynes@976: nkeynes@976: utlb_noexpect_exc: nkeynes@976: mova utlb_exc, r0 nkeynes@976: xor r1, r1 nkeynes@976: mov.l r1, @r0 nkeynes@976: mov.l r1, @(4,r0) nkeynes@976: mov.l r1, @(8,r0) nkeynes@976: mov.l r1, @(16,r0) nkeynes@976: mov #2, r1 nkeynes@976: mov.l r1, @(12,r0) nkeynes@976: rts nkeynes@976: nop nkeynes@976: nkeynes@976: /* Check the result of a read test. Call with: nkeynes@976: * r0 = expected spc nkeynes@976: * r1 = value read (if any) nkeynes@976: * r9 = (char *) testname nkeynes@976: * r10 = test VMA nkeynes@976: * r11 = test PMA nkeynes@976: * r12 = expected exc nkeynes@976: * nkeynes@976: * Trashes r0..r7 nkeynes@976: */ nkeynes@976: utlb_check_read_exc: nkeynes@976: mov.l utlb_exc_k, r3 nkeynes@976: mov.l addr_mask, r2 nkeynes@976: and r2, r3 nkeynes@976: nkeynes@976: mov.l @r3, r2 nkeynes@976: cmp/eq r2, r12 nkeynes@976: bf test_read_exc_bad nkeynes@976: tst r12, r12 nkeynes@976: bt test_read_ok /* Expected no exception, and got none */ nkeynes@976: mov.l @(4,r3), r2 nkeynes@976: dt r2 nkeynes@976: bf test_read_count_bad nkeynes@976: mov.l @(8,r3), r2 nkeynes@976: cmp/eq r0, r2 nkeynes@976: bt test_read_ok nkeynes@976: test_read_pc_bad: nkeynes@976: add #1, r14 nkeynes@976: mov r0, r6 nkeynes@976: mov.l err_read_pc_msg_k, r4 nkeynes@976: mov r2, r7 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: bra test_read_ok nkeynes@976: nop nkeynes@976: test_read_count_bad: nkeynes@976: add #1, r14 nkeynes@976: add #2, r2 nkeynes@976: mov.l err_read_count_msg_k, r4 nkeynes@976: mov r2, r6 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: bra test_read_ok nkeynes@976: nop nkeynes@976: test_read_exc_bad: nkeynes@976: add #1, r14 nkeynes@976: mov.l err_read_exc_msg_k, r4 nkeynes@976: mov r12, r6 nkeynes@976: mov r2, r7 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: bra test_read_ok nkeynes@976: nop nkeynes@976: test_read_ok: nkeynes@976: bra utlb_expect_exc nkeynes@976: nop nkeynes@976: nkeynes@976: /* Check the result of a write test (and clears the exception). Call with: nkeynes@976: * r0 = expected spc nkeynes@976: * r1 = written value nkeynes@976: * r9 = (char *) testname nkeynes@976: * r10 = test VMA nkeynes@976: * r11 = test PMA nkeynes@976: * r13 = expected exc nkeynes@976: * r14 = fail count (updated) nkeynes@976: * nkeynes@976: * Trashes r0..r7 nkeynes@976: */ nkeynes@976: utlb_check_write_exc: nkeynes@976: mov.l utlb_exc_k, r3 nkeynes@976: mov.l addr_mask, r2 nkeynes@976: and r2, r3 nkeynes@976: nkeynes@976: mov.l @r3, r2 nkeynes@976: cmp/eq r2, r13 nkeynes@976: bf test_write_exc_bad nkeynes@976: tst r13, r13 nkeynes@976: bt test_write_ok /* Expected no exception, and got none */ nkeynes@976: mov.l @(4,r3), r2 nkeynes@976: dt r2 nkeynes@976: bf test_write_count_bad nkeynes@976: mov.l @(8,r3), r2 nkeynes@976: cmp/eq r0, r2 nkeynes@976: bt test_write_ok nkeynes@976: test_write_pc_bad: nkeynes@976: add #1, r14 nkeynes@976: mov r0, r6 nkeynes@976: mov.l err_write_pc_msg_k, r4 nkeynes@976: mov r2, r7 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: bra test_write_ok nkeynes@976: nop nkeynes@976: test_write_count_bad: nkeynes@976: add #1, r14 nkeynes@976: add #1, r2 nkeynes@976: mov.l err_write_count_msg_k, r4 nkeynes@976: mov r2, r6 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: bra test_write_ok nkeynes@976: nop nkeynes@976: test_write_exc_bad: nkeynes@976: add #1, r14 nkeynes@976: mov.l err_write_exc_msg_k, r4 nkeynes@976: mov r13, r6 nkeynes@976: mov r2, r7 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: bra test_write_ok nkeynes@976: nop nkeynes@976: test_write_ok: nkeynes@976: bra utlb_expect_exc nkeynes@976: nop nkeynes@976: .align 4 nkeynes@976: utlb_exc_k: nkeynes@976: .long utlb_exc nkeynes@976: err_read_exc_msg_k: nkeynes@976: .long err_read_exc_msg nkeynes@976: err_read_count_msg_k: nkeynes@976: .long err_read_count_msg nkeynes@976: err_read_pc_msg_k: nkeynes@976: .long err_read_pc_msg nkeynes@976: err_write_exc_msg_k: nkeynes@976: .long err_write_exc_msg nkeynes@976: err_write_count_msg_k: nkeynes@976: .long err_write_count_msg nkeynes@976: err_write_pc_msg_k: nkeynes@976: .long err_write_pc_msg nkeynes@976: nkeynes@976: .align 4 nkeynes@976: utlb_old_vbr: nkeynes@976: .long 0 nkeynes@976: utlb_exc: nkeynes@976: .long 0 nkeynes@976: utlb_exc_count: nkeynes@976: .long 0 nkeynes@976: utlb_exc_spc: nkeynes@976: .long 0 nkeynes@976: utlb_rte_offset: nkeynes@976: .long 2 nkeynes@976: utlb_expected: nkeynes@976: .long 0 nkeynes@976: nkeynes@976: .global _run_utlb_priv_test nkeynes@976: _run_utlb_priv_test: nkeynes@976: mov.l r14, @-r15 nkeynes@976: sts pr, r0 nkeynes@976: mov.l r0, @-r15 nkeynes@976: mov.l r13, @-r15 nkeynes@976: mov.l r12, @-r15 nkeynes@976: mov.l r11, @-r15 nkeynes@976: mov.l r10, @-r15 nkeynes@976: mov.l r9, @-r15 nkeynes@976: mov.l r8, @-r15 nkeynes@976: nkeynes@976: mov.l @(0,r4), r9 /* Test name */ nkeynes@976: mov.l @(4,r4), r10 /* Test VMA */ nkeynes@976: mov.l @(8,r4), r11 /* Test PMA */ nkeynes@976: mov.l @(12,r4), r12 /* Read exception */ nkeynes@976: mov.l @(16,r4), r13 /* Write exception */ nkeynes@976: xor r14, r14 /* Fail count */ nkeynes@976: nkeynes@976: mov.l @r11, r0 /* Save original memory value */ nkeynes@976: ocbp @r11 nkeynes@976: mov.l r0, @-r15 nkeynes@976: nkeynes@976: tst r12, r12 nkeynes@976: bt utlb_read_test_noexc nkeynes@976: nkeynes@976: /* Exception test cases - all should fail with the same exception */ nkeynes@976: utlb_read_test_exc: nkeynes@976: mov r10, r8 nkeynes@976: bsr utlb_expect_exc nkeynes@976: nop nkeynes@976: nkeynes@976: /* Test mov.l Rm, Rn */ nkeynes@976: mova test_readl_1, r0 nkeynes@976: .align 4 nkeynes@976: test_readl_1: nkeynes@976: mov.l @r10, r1 nkeynes@976: bsr utlb_check_read_exc nkeynes@976: nop nkeynes@976: nkeynes@976: /* Test mov.l @Rm+, Rn */ nkeynes@976: mova test_readl_2, r0 nkeynes@976: .align 4 nkeynes@976: test_readl_2: nkeynes@976: mov.l @r8+, r1 nkeynes@976: bsr utlb_check_read_exc nkeynes@976: nop nkeynes@976: cmp/eq r8,r10 nkeynes@976: bt test_readl_2_ok nkeynes@976: nkeynes@976: add #1, r14 nkeynes@976: mov.l err_readlp_bad_msg_k, r4 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: nkeynes@976: test_readl_2_ok: nkeynes@976: /* Test mov.w @Rm, Rn */ nkeynes@976: mova test_readw_1, r0 nkeynes@976: .align 4 nkeynes@976: test_readw_1: nkeynes@976: mov.w @r10, r1 nkeynes@976: bsr utlb_check_read_exc nkeynes@976: nop nkeynes@976: nkeynes@976: /* Test mov.w @Rm+, Rn */ nkeynes@976: mova test_readw_2, r0 nkeynes@976: .align 4 nkeynes@976: test_readw_2: nkeynes@976: mov.w @r8+, r1 nkeynes@976: bsr utlb_check_read_exc nkeynes@976: nop nkeynes@976: cmp/eq r8, r10 nkeynes@976: bt test_readw_2_ok nkeynes@976: nkeynes@976: add #1, r14 nkeynes@976: mov.l err_readwp_bad_msg_k, r4 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: nkeynes@976: test_readw_2_ok: nkeynes@976: nkeynes@976: /* Test mov.b @Rm, Rn */ nkeynes@976: mova test_readb_1, r0 nkeynes@976: .align 4 nkeynes@976: test_readb_1: nkeynes@976: mov.b @r10, r1 nkeynes@976: bsr utlb_check_read_exc nkeynes@976: nop nkeynes@976: nkeynes@976: /* Test mov.b @Rm+, Rn */ nkeynes@976: mova test_readb_2, r0 nkeynes@976: .align 4 nkeynes@976: test_readb_2: nkeynes@976: mov.b @r8+, r1 nkeynes@976: bsr utlb_check_read_exc nkeynes@976: nop nkeynes@976: cmp/eq r8, r10 nkeynes@976: bt test_readb_2_ok nkeynes@976: nkeynes@976: add #1, r14 nkeynes@976: mov.l err_readbp_bad_msg_k, r4 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: nkeynes@976: test_readb_2_ok: nkeynes@976: nkeynes@976: bra utlb_read_test_done nkeynes@976: nop nkeynes@976: nkeynes@976: /* Non-exception read tests */ nkeynes@976: utlb_read_test_noexc: nkeynes@976: mov.l utlb_exc_k_2, r8 nkeynes@976: mov.l addr_mask, r0 nkeynes@976: and r0, r8 nkeynes@976: bsr utlb_noexpect_exc nkeynes@976: nop nkeynes@976: nkeynes@976: mov.l @r10, r1 nkeynes@976: not r1, r2 nkeynes@976: mov.l r2, @r11 nkeynes@976: ocbp @r11 nkeynes@976: ocbi @r10 nkeynes@976: mov.l @r10, r1 nkeynes@976: ocbi @r10 nkeynes@976: cmp/eq r1, r2 nkeynes@976: bt noexc_readl_ok nkeynes@976: nkeynes@976: nkeynes@976: add #1, r14 nkeynes@976: mov.l err_read_mismatch_msg_k, r4 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: nkeynes@976: noexc_readl_ok: nkeynes@976: nkeynes@976: mov.l @(4,r8), r0 nkeynes@976: add r0, r14 nkeynes@976: utlb_read_test_done: nkeynes@976: nkeynes@976: /*********************** Begin write tests *****************************/ nkeynes@976: tst r13, r13 nkeynes@976: bt utlb_write_test_noexc nkeynes@976: nkeynes@976: /* Exception write tests */ nkeynes@976: utlb_write_test_exc: nkeynes@976: bsr utlb_expect_exc nkeynes@976: nop nkeynes@976: nkeynes@976: mova test_writel_pc, r0 nkeynes@976: .align 4 nkeynes@976: test_writel_pc: nkeynes@976: mov.l r1, @r10 nkeynes@976: bsr utlb_check_write_exc nkeynes@976: nop nkeynes@976: nkeynes@976: mova test_writelp_pc, r0 nkeynes@976: mov r10, r8 nkeynes@976: .align 4 nkeynes@976: test_writelp_pc: nkeynes@976: mov.l r1, @-r8 nkeynes@976: bsr utlb_check_write_exc nkeynes@976: nop nkeynes@976: cmp/eq r8, r10 nkeynes@976: bt test_writelp_ok nkeynes@976: add #1, r14 nkeynes@976: mov.l err_writelp_bad_msg_k, r4 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: test_writelp_ok: nkeynes@976: nkeynes@976: mova test_writew_pc, r0 nkeynes@976: .align 4 nkeynes@976: test_writew_pc: nkeynes@976: mov.w r1, @r10 nkeynes@976: bsr utlb_check_write_exc nkeynes@976: nop nkeynes@976: nkeynes@976: mova test_writewp_pc, r0 nkeynes@976: mov r10, r8 nkeynes@976: .align 4 nkeynes@976: test_writewp_pc: nkeynes@976: mov.w r1, @-r8 nkeynes@976: bsr utlb_check_write_exc nkeynes@976: nop nkeynes@976: cmp/eq r8, r10 nkeynes@976: bt test_writewp_ok nkeynes@976: add #1, r14 nkeynes@976: mov.l err_writewp_bad_msg_k, r4 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: test_writewp_ok: nkeynes@976: nkeynes@976: mova test_writeb_pc, r0 nkeynes@976: .align 4 nkeynes@976: test_writeb_pc: nkeynes@976: mov.b r1, @r10 nkeynes@976: bsr utlb_check_write_exc nkeynes@976: nop nkeynes@976: nkeynes@976: mova test_writebp_pc, r0 nkeynes@976: mov r10, r8 nkeynes@976: .align 4 nkeynes@976: test_writebp_pc: nkeynes@976: mov.b r1, @-r8 nkeynes@976: bsr utlb_check_write_exc nkeynes@976: nop nkeynes@976: cmp/eq r8, r10 nkeynes@976: bt test_writebp_ok nkeynes@976: add #1, r14 nkeynes@976: mov.l err_writelp_bad_msg_k, r4 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: test_writebp_ok: nkeynes@976: nkeynes@976: bra utlb_write_test_done nkeynes@976: nop nkeynes@976: nkeynes@976: /* Non-exception write tests */ nkeynes@976: utlb_write_test_noexc: nkeynes@976: mov.l utlb_exc_k_2, r8 nkeynes@976: mov.l addr_mask, r0 nkeynes@976: and r0, r8 nkeynes@976: bsr utlb_noexpect_exc nkeynes@976: nop nkeynes@976: nkeynes@976: mov.l @r11, r7 nkeynes@976: ocbp @r11 nkeynes@976: not r7, r1 nkeynes@976: nkeynes@976: mov.l r1, @r10 nkeynes@976: ocbp @r10 nkeynes@976: mov.l @r11, r6 nkeynes@976: cmp/eq r6, r1 nkeynes@976: bt test_writel_1_ok nkeynes@976: nkeynes@976: add #1, r14 nkeynes@976: mov.l err_write_ignored_msg_k, r4 nkeynes@976: mov r9, r5 nkeynes@976: trapa #41 nkeynes@976: nkeynes@976: test_writel_1_ok: nkeynes@976: nkeynes@976: mov.l @(4,r8), r0 nkeynes@976: add r0, r14 nkeynes@976: utlb_write_test_done: nkeynes@976: nkeynes@976: xor r0, r0 nkeynes@976: mov.l r0, @(16,r8) nkeynes@976: nkeynes@976: mov.l @r15+, r0 nkeynes@976: mov.l r0, @r11 nkeynes@976: mov.l @r15+, r8 nkeynes@976: mov.l @r15+, r9 nkeynes@976: mov.l @r15+, r10 nkeynes@976: mov.l @r15+, r11 nkeynes@976: mov.l @r15+, r12 nkeynes@976: mov.l @r15+, r13 nkeynes@976: mov.l @r15+, r1 nkeynes@976: lds r1, pr nkeynes@976: mov r14, r0 nkeynes@976: mov.l @r15+, r14 nkeynes@976: rts nkeynes@976: nop nkeynes@976: nkeynes@976: .align 4 nkeynes@976: err_read_mismatch_msg_k: nkeynes@976: .long err_read_mismatch_msg nkeynes@976: err_write_ignored_msg_k: nkeynes@976: .long err_write_ignored_msg nkeynes@976: err_readlp_bad_msg_k: nkeynes@976: .long err_readlp_bad_msg nkeynes@976: err_readwp_bad_msg_k: nkeynes@976: .long err_readwp_bad_msg nkeynes@976: err_readbp_bad_msg_k: nkeynes@976: .long err_readbp_bad_msg nkeynes@976: err_writelp_bad_msg_k: nkeynes@976: .long err_readlp_bad_msg nkeynes@976: err_writewp_bad_msg_k: nkeynes@976: .long err_readwp_bad_msg nkeynes@976: err_writebp_bad_msg_k: nkeynes@976: .long err_readbp_bad_msg nkeynes@976: nkeynes@976: nkeynes@976: nkeynes@976: .global _run_utlb_user_test nkeynes@976: _run_utlb_user_test: nkeynes@976: sts pr, r0 nkeynes@976: mov.l r0, @-r15 nkeynes@976: stc sr, r2 nkeynes@976: mov.l sr_mask, r1 nkeynes@976: and r1, r2 nkeynes@976: nkeynes@976: mova user_entry_point, r0 nkeynes@976: mov.l addr_mask, r1 nkeynes@976: and r1, r0 nkeynes@976: nkeynes@976: mov.l r15, @-r15 nkeynes@976: nkeynes@976: jmp @r0 nkeynes@976: nop nkeynes@976: nkeynes@976: user_entry_point: nkeynes@976: nop nkeynes@976: ldc r2, sr nkeynes@976: nkeynes@976: /* In user mode */ nkeynes@976: nkeynes@976: mov.l main_test_k, r0 nkeynes@976: and r1, r0 nkeynes@976: and r1, r4 nkeynes@976: and r1, r15 nkeynes@976: jsr @r0 nkeynes@976: nop nkeynes@976: nkeynes@976: /* Done, return to priv mode */ nkeynes@976: trapa #42 nkeynes@976: mov.l user_retaddr, r1 nkeynes@976: jmp @r1 nkeynes@976: nop nkeynes@976: nkeynes@976: user_exit_point: nkeynes@976: /* Back to priv mode */ nkeynes@976: mov.l @r15+, r15 nkeynes@976: mov.l @r15+, r1 nkeynes@976: lds r1, pr nkeynes@976: rts nkeynes@976: nop nkeynes@976: .align 4 nkeynes@976: nkeynes@976: utlb_exc_k_2: nkeynes@976: .long utlb_exc nkeynes@976: main_test_k: nkeynes@976: .long _run_utlb_priv_test nkeynes@976: addr_mask: nkeynes@976: .long 0x1FFFFFFF nkeynes@976: sr_mask: nkeynes@976: .long 0x3FFFFFFF nkeynes@976: user_retaddr: nkeynes@976: .long user_exit_point nkeynes@976: nkeynes@976: err_read_exc_msg: nkeynes@976: .string "%s: Read failed: Expected Exc %04X but got %04X\n" nkeynes@976: err_read_count_msg: nkeynes@976: .string "%s: Read bad exception: Exception 1 exception, but got %d\n" nkeynes@976: err_read_pc_msg: nkeynes@976: .string "%s: Read bad exception: Expected PC=%08X but was %08X\n" nkeynes@976: err_read_mismatch_msg: nkeynes@976: .string "%s: Read failed: Data mismatch!\n" nkeynes@976: err_readlp_bad_msg: nkeynes@976: .string "%s: Mov.l @Rm+, Rn failed: Rm changed!\n" nkeynes@976: err_readwp_bad_msg: nkeynes@976: .string "%s: Mov.w @Rm+, Rn failed: Rm changed!\n" nkeynes@976: err_readbp_bad_msg: nkeynes@976: .string "%s: Mov.b @Rm+, Rn failed: Rm changed!\n" nkeynes@976: err_writelp_bad_msg: nkeynes@976: .string "%s: Mov.l Rm, @-Rn failed: Rm changed!\n" nkeynes@976: err_writewp_bad_msg: nkeynes@976: .string "%s: Mov.w Rm, @-Rn failed: Rm changed!\n" nkeynes@976: err_writebp_bad_msg: nkeynes@976: .string "%s: Mov.b Rm, @-Rn failed: Rm changed!\n" nkeynes@976: err_write_exc_msg: nkeynes@976: .string "%s: Write failed: Expected Exc %04X but got %04X\n" nkeynes@976: err_write_count_msg: nkeynes@976: .string "%s: Write bad exception: Expected 1 exception, but got %d\n" nkeynes@976: err_write_pc_msg: nkeynes@976: .string "%s: Write bad exception: Expected PC=%08X but was %08X\n" nkeynes@976: err_write_ignored_msg: nkeynes@976: .string "%s: Write failed: write didn't happen!\n" nkeynes@976: utlb_unexpected_msg: nkeynes@976: .string "*** Unexpected exception %04X at %08X!\n"