| # mach: crisv32 | |
| # output: 40\n40\n140\nabadefb0\n6543789c\n0\n0\n0\n0\n0\n0\n0\n0\n | |
| ; Check for protected operations being NOP in user mode, for the | |
| ; parts implemented in this simulator. | |
| .include "testutils.inc" | |
| start | |
| move 0,ccs | |
| move 0,usp | |
| move 0,pid | |
| move 0,srs | |
| move 0,ebp | |
| move 0,spc | |
| setf u | |
| ; Flag settings, besides what's tested in rfn.ms, rfe.ms and | |
| ; sfe.ms. | |
| setf i | |
| move ccs,r3 | |
| dumpr3 ; 0x40 | |
| clearf u | |
| move ccs,r3 | |
| dumpr3 ; 0x40 | |
| move 0xc0000300,ccs | |
| move ccs,r3 | |
| dumpr3 ; 0x140 | |
| ; R14==USP | |
| move.d 0xabadefb0,r14 | |
| nop | |
| nop | |
| nop | |
| move usp,r3 | |
| dumpr3 ; 0xabadefb0 | |
| move 0x6543789c,usp | |
| nop | |
| nop | |
| nop | |
| move.d r14,r3 | |
| dumpr3 ; 0x6543789c | |
| ; We can't go back to kernel mode, so we can't check that R14 in | |
| ; kernel mode wasn't affected. | |
| ; Moves to protected special registers. | |
| .macro testsr reg,val=-1 | |
| move \val,\reg | |
| ; Registers shorter than dword will not affect the rest of the | |
| ; general register when copied using a move insn. | |
| clear.d r3 | |
| ; Three cycles are needed between move to protected register and | |
| ; read from it, to avoid reading undefined contents due to | |
| ; incomplete forwarding. | |
| nop | |
| nop | |
| move \reg,r3 | |
| dumpr3 | |
| moveq \val,r3 | |
| move r3,\reg | |
| clear.d r3 | |
| nop | |
| nop | |
| move \reg,r3 | |
| dumpr3 | |
| .endm | |
| testsr pid ; 0 0 | |
| testsr srs,3 ; 0 0 | |
| testsr ebp ; 0 0 | |
| testsr spc ; 0 0 | |
| quit |