Search
lxdream.org :: lxdream/test/sh4/testutlb.s
lxdream 0.9.1
released Jun 29
Download Now
filename test/sh4/testutlb.s
changeset 976:e57a25d9eb7d
next1044:01e46b0aafaf
author nkeynes
date Mon Jan 26 12:32:23 2009 +0000 (15 years ago)
permissions -rw-r--r--
last change Add some initial TLB test cases
file annotate diff log raw
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"
.