Revision c305e32f

b/tests/tcg/xtensa/test_mmu.S
293 293
    assert  eq, a2, a3
294 294
test_end
295 295

  
296
test dtlb_autoload
297
    set_vector kernel, 0
298

  
299
    movi    a2, 0xd4000000
296
/* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
297
 * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
298
 */
299
.macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
300
    movi    a2, 0x80000000
300 301
    wsr     a2, ptevaddr
301
    movi    a3, 0x00001013
302
    s32i    a3, a2, 4
302

  
303
    movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
304
    movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
305
    wdtlb   a4, a3
306
    isync
307

  
308
    movi    a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr)
309
    movi    a1, ((\vaddr) >> 12) << 2
310
    add     a2, a1, a2
311
    s32i    a3, a2, 0
312

  
313
    movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
314
    movi    a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
315
    wdtlb   a4, a3
316
    isync
317

  
318
    movi    a3, (\vaddr)
319
.endm
320

  
321
/* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
322
.macro go_ring ring, excm, vaddr
323
    movi    a3, 10f
324
    pitlb   a3, a3
325
    ritlb1  a2, a3
326
    movi    a1, 0x10
327
    or      a2, a2, a1
328
    movi    a1, 0x000ff000
329
    and     a3, a3, a1
330
    movi    a1, 4
331
    or      a3, a3, a1
332
    witlb   a2, a3
333
    movi    a3, 10f
334
    movi    a1, 0x000fffff
335
    and     a1, a3, a1
336

  
337
    movi    a2, 0
338
    wsr     a2, excvaddr
339

  
340
    movi    a3, \vaddr
341
    movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
342
    jx      a1
343
10:
344
    wsr     a2, ps
345
    isync
346
.endm
347

  
348
/* in: a3 -- virtual address to test */
349
.macro assert_auto_tlb
350
    movi    a2, 0x4000f
351
    wsr     a2, ps
352
    isync
353
    pdtlb   a2, a3
354
    movi    a1, 0xfffff01f
355
    and     a2, a2, a1
356
    movi    a1, 0xfffff000
357
    and     a1, a1, a3
358
    xor     a1, a1, a2
359
    assert  gei, a1, 0x10
360
    movi    a2, 0x14
361
    assert  lt, a1, a2
362
.endm
363

  
364
/* in: a3 -- virtual address to test */
365
.macro assert_no_auto_tlb
366
    movi    a2, 0x4000f
367
    wsr     a2, ps
368
    isync
303 369
    pdtlb   a2, a3
304 370
    movi    a1, 0x10
305 371
    and     a1, a1, a2
306 372
    assert  eqi, a1, 0
307
    l8ui    a1, a3, 0
308
    pdtlb   a2, a3
309
    movi    a1, 0xfffff010
310
    and     a1, a1, a2
311
    movi    a3, 0x00001010
312
    assert  eq, a1, a3
313
    movi    a1, 0xf
373
.endm
374

  
375
.macro assert_sr sr, v
376
    rsr     a2, \sr
377
    movi    a1, (\v)
378
    assert  eq, a1, a2
379
.endm
380

  
381
.macro assert_epc1_1m vaddr
382
    movi    a2, (\vaddr)
383
    movi    a1, 0xfffff
314 384
    and     a1, a1, a2
315
    assert  lti, a1, 4
385
    rsr     a2, epc1
386
    assert  eq, a1, a2
387
.endm
388

  
389
test dtlb_autoload
390
    set_vector kernel, 0
391

  
392
    pt_setup    0, 3, 1, 0x1000, 0x1000, 3
393
    assert_no_auto_tlb
394

  
395
    l8ui    a1, a3, 0
396

  
397
    rsr     a2, excvaddr
398
    assert  eq, a2, a3
399

  
400
    assert_auto_tlb
401
test_end
402

  
403
test autoload_load_store_privilege
404
    set_vector kernel, 0
405
    set_vector double, 2f
406

  
407
    pt_setup    0, 3, 0, 0x2000, 0x2000, 3
408
    movi    a3, 0x2004
409
    assert_no_auto_tlb
410

  
411
    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
412
    wsr     a2, ps
413
    isync
414
1:
415
    l32e    a2, a3, -4     /* ring used */
416
    test_fail
417
2:
418
    rsr     a2, excvaddr
419
    addi    a1, a3, -4
420
    assert  eq, a1, a2
421

  
422
    assert_auto_tlb
423
    assert_sr depc, 1b
424
    assert_sr exccause, 26
425
test_end
426

  
427
test autoload_pte_load_prohibited
428
    set_vector kernel, 2f
429

  
430
    pt_setup    0, 3, 0, 0x3000, 0, 0xc
431
    assert_no_auto_tlb
432
1:
433
    l32i    a2, a3, 0
434
    test_fail
435
2:
436
    rsr     a2, excvaddr
437
    assert  eq, a2, a3
438

  
439
    assert_auto_tlb
440
    assert_sr epc1, 1b
441
    assert_sr exccause, 28
442
test_end
443

  
444
test autoload_pt_load_prohibited
445
    set_vector kernel, 2f
446

  
447
    pt_setup    0, 0xc, 0, 0x4000, 0x4000, 3
448
    assert_no_auto_tlb
449
1:
450
    l32i    a2, a3, 0
451
    test_fail
452
2:
453
    rsr     a2, excvaddr
454
    assert  eq, a2, a3
455

  
456
    assert_no_auto_tlb
457
    assert_sr epc1, 1b
458
    assert_sr exccause, 24
459
test_end
460

  
461
test autoload_pt_privilege
462
    set_vector  kernel, 2f
463
    pt_setup    0, 3, 1, 0x5000, 0, 3
464
    go_ring     1, 0, 0x5001
465

  
466
    l8ui    a2, a3, 0
467
1:
468
    syscall
469
2:
470
    rsr     a2, excvaddr
471
    assert  eq, a2, a3
472

  
473
    assert_auto_tlb
474
    assert_epc1_1m 1b
475
    assert_sr exccause, 1
476
test_end
477

  
478
test autoload_pte_privilege
479
    set_vector  kernel, 2f
480
    pt_setup    0, 3, 0, 0x6000, 0, 3
481
    go_ring     1, 0, 0x6001
482
1:
483
    l8ui    a2, a3, 0
484
    syscall
485
2:
486
    rsr     a2, excvaddr
487
    assert  eq, a2, a3
488

  
489
    assert_auto_tlb
490
    assert_epc1_1m 1b
491
    assert_sr exccause, 26
492
test_end
493

  
494
test autoload_3_level_pt
495
    set_vector  kernel, 2f
496
    pt_setup    1, 3, 1, 0x00400000, 0, 3
497
    pt_setup    1, 3, 1, 0x80001000, 0x2000000, 3
498
    go_ring     1, 0, 0x00400001
499
1:
500
    l8ui    a2, a3, 0
501
    syscall
502
2:
503
    rsr     a2, excvaddr
504
    assert  eq, a2, a3
505

  
506
    assert_no_auto_tlb
507
    assert_epc1_1m 1b
508
    assert_sr exccause, 24
316 509
test_end
317 510

  
318 511
test_suite_end

Also available in: Unified diff