 c09015dd04
			
		
	
	
		c09015dd04
		
	
	
	
	
		
			
			Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
		
			
				
	
	
		
			195 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .include "macros.inc"
 | |
| 
 | |
| test_suite interrupt
 | |
| 
 | |
| .macro clear_interrupts
 | |
|     movi    a2, 0
 | |
|     wsr     a2, intenable
 | |
|     wsr     a2, ccompare0
 | |
|     wsr     a2, ccompare1
 | |
|     wsr     a2, ccompare2
 | |
|     esync
 | |
|     rsr     a2, interrupt
 | |
|     wsr     a2, intclear
 | |
| 
 | |
|     esync
 | |
|     rsr     a2, interrupt
 | |
|     assert  eqi, a2, 0
 | |
| .endm
 | |
| 
 | |
| .macro check_l1
 | |
|     rsr     a2, ps
 | |
|     movi    a3, 0x1f        /* EXCM | INTMASK */
 | |
|     and     a2, a2, a3
 | |
|     assert  eqi, a2, 0x10   /* only EXCM is set for level-1 interrupt */
 | |
|     rsr     a2, exccause
 | |
|     assert  eqi, a2, 4
 | |
| .endm
 | |
| 
 | |
| test rsil
 | |
|     clear_interrupts
 | |
| 
 | |
|     rsr     a2, ps
 | |
|     rsil    a3, 7
 | |
|     rsr     a4, ps
 | |
|     assert  eq, a2, a3
 | |
|     movi    a2, 0xf
 | |
|     and     a2, a4, a2
 | |
|     assert  eqi, a2, 7
 | |
|     xor     a3, a3, a4
 | |
|     movi    a2, 0xfffffff0
 | |
|     and     a2, a3, a2
 | |
|     assert  eqi, a2, 0
 | |
| test_end
 | |
| 
 | |
| test soft_disabled
 | |
|     set_vector kernel, 1f
 | |
|     clear_interrupts
 | |
| 
 | |
|     movi    a2, 0x80
 | |
|     wsr     a2, intset
 | |
|     esync
 | |
|     rsr     a3, interrupt
 | |
|     assert  eq, a2, a3
 | |
|     wsr     a2, intclear
 | |
|     esync
 | |
|     rsr     a3, interrupt
 | |
|     assert  eqi, a3, 0
 | |
|     j       2f
 | |
| 1:
 | |
|     test_fail
 | |
| 2:
 | |
| test_end
 | |
| 
 | |
| test soft_intenable
 | |
|     set_vector kernel, 1f
 | |
|     clear_interrupts
 | |
| 
 | |
|     movi    a2, 0x80
 | |
|     wsr     a2, intset
 | |
|     esync
 | |
|     rsr     a3, interrupt
 | |
|     assert  eq, a2, a3
 | |
|     rsil    a3, 0
 | |
|     wsr     a2, intenable
 | |
|     esync
 | |
|     test_fail
 | |
| 1:
 | |
|     check_l1
 | |
| test_end
 | |
| 
 | |
| test soft_rsil
 | |
|     set_vector kernel, 1f
 | |
|     clear_interrupts
 | |
| 
 | |
|     movi    a2, 0x80
 | |
|     wsr     a2, intset
 | |
|     esync
 | |
|     rsr     a3, interrupt
 | |
|     assert  eq, a2, a3
 | |
|     wsr     a2, intenable
 | |
|     rsil    a3, 0
 | |
|     esync
 | |
|     test_fail
 | |
| 1:
 | |
|     check_l1
 | |
| test_end
 | |
| 
 | |
| test soft_waiti
 | |
|     set_vector kernel, 1f
 | |
|     clear_interrupts
 | |
| 
 | |
|     movi    a2, 0x80
 | |
|     wsr     a2, intset
 | |
|     esync
 | |
|     rsr     a3, interrupt
 | |
|     assert  eq, a2, a3
 | |
|     wsr     a2, intenable
 | |
|     waiti   0
 | |
|     test_fail
 | |
| 1:
 | |
|     check_l1
 | |
| test_end
 | |
| 
 | |
| test soft_user
 | |
|     set_vector kernel, 1f
 | |
|     set_vector user, 2f
 | |
|     clear_interrupts
 | |
| 
 | |
|     movi    a2, 0x80
 | |
|     wsr     a2, intset
 | |
|     esync
 | |
|     rsr     a3, interrupt
 | |
|     assert  eq, a2, a3
 | |
|     wsr     a2, intenable
 | |
| 
 | |
|     rsr     a2, ps
 | |
|     movi    a3, 0x20
 | |
|     or      a2, a2, a3
 | |
|     wsr     a2, ps
 | |
|     waiti   0
 | |
| 1:
 | |
|     test_fail
 | |
| 2:
 | |
|     check_l1
 | |
| test_end
 | |
| 
 | |
| test soft_priority
 | |
|     set_vector kernel, 1f
 | |
|     set_vector level3, 2f
 | |
|     clear_interrupts
 | |
| 
 | |
|     movi    a2, 0x880
 | |
|     wsr     a2, intenable
 | |
|     rsil    a3, 0
 | |
|     esync
 | |
|     wsr     a2, intset
 | |
|     esync
 | |
| 1:
 | |
|     test_fail
 | |
| 2:
 | |
|     rsr     a2, ps
 | |
|     movi    a3, 0x1f        /* EXCM | INTMASK */
 | |
|     and     a2, a2, a3
 | |
|     movi    a3, 0x13
 | |
|     assert  eq, a2, a3      /* EXCM and INTMASK are set
 | |
|                                for high-priority interrupt */
 | |
| test_end
 | |
| 
 | |
| test eps_epc_rfi
 | |
|     set_vector level3, 3f
 | |
|     clear_interrupts
 | |
|     reset_ps
 | |
| 
 | |
|     movi    a2, 0x880
 | |
|     wsr     a2, intenable
 | |
|     rsil    a3, 0
 | |
|     rsr     a3, ps
 | |
|     esync
 | |
|     wsr     a2, intset
 | |
| 1:
 | |
|     esync
 | |
| 2:
 | |
|     test_fail
 | |
| 3:
 | |
|     rsr     a2, eps3
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc3
 | |
|     movi    a3, 1b
 | |
|     assert  ge, a2, a3
 | |
|     movi    a3, 2b
 | |
|     assert  ge, a3, a2
 | |
|     movi    a2, 4f
 | |
|     wsr     a2, epc3
 | |
|     movi    a2, 0x40003
 | |
|     wsr     a2, eps3
 | |
|     rfi     3
 | |
|     test_fail
 | |
| 4:
 | |
|     rsr     a2, ps
 | |
|     movi    a3, 0x40003
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test_suite_end
 |