From d75650233f37fc61bd95a7b493750ea00e82db65 Mon Sep 17 00:00:00 2001 From: Sarah Mount Date: Thu, 11 Aug 2016 22:57:15 +0100 Subject: [PATCH] Remove max_insts from asm tests. Improve ILATST and RTI tests by adding an interrupt handler. Fixes #51. --- revelation/test/asm/ilatst.S | 42 +++++++++++++++++++++++++++++---- revelation/test/asm/ilatst.elf | Bin 82640 -> 82732 bytes revelation/test/asm/rti.S | 41 ++++++++++++++++++++++++++++++-- revelation/test/asm/rti.elf | Bin 82640 -> 82732 bytes revelation/test/test_asm.py | 16 ++----------- 5 files changed, 79 insertions(+), 20 deletions(-) diff --git a/revelation/test/asm/ilatst.S b/revelation/test/asm/ilatst.S index ccc2605..1c7bcb9 100644 --- a/revelation/test/asm/ilatst.S +++ b/revelation/test/asm/ilatst.S @@ -1,7 +1,41 @@ #include "epiphany-macros.h" .global main +interrupt_handler: + mov r0, #1 + mov r1, %low(message) + movt r1, %high(message) + mov r2, #17 + mov r3, #5 + trap #7 + TEAR_DOWN main: - mov r0, #0x3ff - movts ilatst, r0 ; After this instruction ILAT will hold 0x3fe. One bit - ; will be cleared and put into IPEND. -TEAR_DOWN + ; ivt = (uint32_t *) 0x24; + mov r0, #0x24 + ; branch_addr = (uint32_t) &interrupt_handler; + mov r1, %low(interrupt_handler) + movt r1, %high(interrupt_handler) + ; branch_addr -= (uint32_t) ivt; + sub r2, r1, r0 + ; branch_addr = (branch_addr >> 1); + lsr r2, r2, #1 + ; rel_branch_instruction32 = 0xe8; + mov r3, 0xe8 + ; rel_branch_instruction32 |= ((branch_addr & (0x00ffffff))) << 8; + mov r4, %low(0x00ffffff) + movt r4, %high(0x00ffffff) + and r5, r2, r4 ; branch_addr & (0x00ffffff) + mov r6, #8 + lsl r7, r5, r6 ; (branch_addr & 0x00ffffff) << 8 + orr r8, r3, r7 + ; *ivt = rel_branch_instruction32; + str r8, [r0, #0] + ; Clear interrupt mask. + mov r45, 0 + movts imask, r45 + ; Enable interrupts. + gie + ; Set interrupt latch. + mov r45, 0x200 + movts ilatst, r45 +message: + .ascii "Interrupt fired.\n" diff --git a/revelation/test/asm/ilatst.elf b/revelation/test/asm/ilatst.elf index 6ad768abdca579b546d7d16863859e885ef62114..a27170356b441d6c9348377024c21a2d0bac93d7 100755 GIT binary patch delta 1315 zcmY+DTWAwO6o$`CHnAqP*#wn>fvjz)RZ1Isp%S$%OGQPz(5E7bT8;PC(hG{W*fxq7 zsm6edidw6_lnUMhKG`DpA|fcF=!5n_#J;rR{xTQb1l%M2)wN%s@ky#m;LjTh)o5y2Vi+S1OF3~0-yx|! z8D_a=CW0eW0Tjv zdnd0;b>oO*Y|-zG*R5?L(jYtJy)AED5T2ouA@3b|YjsCYw5zMPvq#&xrz^Un(oG&| zrSXDDY`RD@KE9<;qEDxfKPmK}lvAPyv4O=$ABtx}mMh7z!|5g|3ToP>P$@PC>cdv3 zm>+PV>CDdYERzE{E;3omvDf7C9IGaWmGnrRxF$-n!h(ebQC3*cEGhyA6k~6_Xz+(2 z07UcAZaB4y@uXf<##CFFoQvki32&J5))`pfF}MkWx;gKn z=jOb%sUJ0b3D#H)#_QjMr?6+1zsBqU9?;MfE}wP9X22XUUmcr@GtLLM*(FwyP#OH} zzoz0}s{o%C*^11-YqcV+emb)jycNKbd?m3h82Fb_fOdiNH|zi}$xEOc3>%D~^P}X4 z!1*OkfZsW@B`%<(wcZTU(BIBuR77U(rt2c&saROm)81LNeS7o1+SZk8D-Y0~>|@-r zdt1kj{n0LJk9K!&+Z9d!SSl2m{sZo@=_(2rLjqyfN;^N0J zJ8pbqpI=xYZupzvYw)$W5n-QSR(afLW1kNmj;GHw3Add2$w?GM#!HQ>x|mno6A|<% KFL~U!X@3D)1JNn~ delta 1139 zcmYk5Ur1AN6vxl`&CNe^^KO!8jyC_`qtsO~#->Aj=^-`gp$CH!!ssD-3sRaol5k;- zLHD6Qi1ZXfX~IH8jC=^%!vd)hJuLA-@Fk&$U{K$4@9x@x-@U)j@0|1fo!`IJ1!wM_ z^HE6UqN(;tS3waSs=w8I=tkTAP_@cMp zJnmcP6;7Vi=_stHN9Vg-=qAyfp4WSeh%P9tDp1^`&YqCgm3)hl7E3w#6#r$VZLWyo z$i}di&Ls1C`uluDwdm0$TSC*A+}ZKdXsm{>@hi8X0OS)GGlUBzRa4*1xMy(A3x`I zTbK#LOk@i)dB_XSI*c3rJm4=t0Ep(J>*yRfjLm-Tj_;I&CI6urZ|Wn?OHaTPCBLFN zS_5B#y9%uh-yLv`6;2u*|NRKwE5-X%1API1D6@wS!1lt#f6Nr8P=$cPHHZ)`$pk)f z(Ft%plEgHsrB<-`#AL#5Fltw)_%+BK zF1fW^3FB0Z+g);Fcg=p2F%jc>m%N2+!ng@%tz4H}0wo!3F>W+g#V>CmpD?y1S=Lst fk~75^|K!@&PNE%S5I6n<3dX$h diff --git a/revelation/test/asm/rti.S b/revelation/test/asm/rti.S index 627f3b6..9e2cd4a 100644 --- a/revelation/test/asm/rti.S +++ b/revelation/test/asm/rti.S @@ -1,5 +1,42 @@ #include "epiphany-macros.h" .global main -main: +interrupt_handler: + mov r0, #1 + mov r1, %low(message) + movt r1, %high(message) + mov r2, #17 + mov r3, #5 + trap #7 rti -TEAR_DOWN +main: + ; ivt = (uint32_t *) 0x24; + mov r0, #0x24 + ; branch_addr = (uint32_t) &interrupt_handler; + mov r1, %low(interrupt_handler) + movt r1, %high(interrupt_handler) + ; branch_addr -= (uint32_t) ivt; + sub r2, r1, r0 + ; branch_addr = (branch_addr >> 1); + lsr r2, r2, #1 + ; rel_branch_instruction32 = 0xe8; + mov r3, 0xe8 + ; rel_branch_instruction32 |= ((branch_addr & (0x00ffffff))) << 8; + mov r4, %low(0x00ffffff) + movt r4, %high(0x00ffffff) + and r5, r2, r4 ; branch_addr & (0x00ffffff) + mov r6, #8 + lsl r7, r5, r6 ; (branch_addr & 0x00ffffff) << 8 + orr r8, r3, r7 + ; *ivt = rel_branch_instruction32; + str r8, [r0, #0] + ; Clear interrupt mask. + mov r45, 0 + movts imask, r45 + ; Enable interrupts. + gie + ; Set interrupt latch. + mov r45, 0x200 + movts ilatst, r45 + TEAR_DOWN +message: + .ascii "Interrupt fired.\n" diff --git a/revelation/test/asm/rti.elf b/revelation/test/asm/rti.elf index cee42dbe6e2c972b7dab0870e939ae7bd651a3a2..5b6a713070a9c3a13d926a35f23326a1bab8eddb 100755 GIT binary patch delta 1324 zcmY+DTS!zv7{|YvJ-gbTa?dUmLc*SOGYioz6JsrvQ_+ns_*79;=4w|HwF^nEmrbG# z%N9CBH}mo$1!|Xtp0a{oBBG)T`CvXo)JuldOR)XtTx|Pb=6t_1^ZnotYl1L84im;^0l^m^a&xHRK>yYHd=AY2&+;xuA z-){c!e7nh&9fOY1#lMptx4M%^g>H{$fcIZwa!+=T=ML|m@T{+E3O6(yt8Y?k4m5)c5G*>hDYBu-(yc1&y%`GPbDfiOE0RL zLdk?VP$yxEWPHFg4JUJ&XBn(cbB4izY4#YLH_eK{K`Aj<%x!nnf94 zRniZZurgl|0zfn`?T52W(jS(vg2-%3Sj1m2<{SE$mqAy-L)Jz(xoKDkSSHbAaumGP z8Yhgu2473zkKk>XFP4~({wp}$idPW-lTn21oq4&37$?fI67q6v0Bl!6jL!qBDFXT6 z6+~Sk#7izJ2hYSJ!W5c8YrvKqcrv*S4C@k|;2IwJKcf@o1Tk(b)C~?oa4wn;JG^C# zn|lxf55N@=)QoW#Ju}A5MSZB@3$QB0U}F9U@OP|f^OuMfAbzN5k|>{f#74jzusAwl z3idc3TxFG5K|;Ck?YpMnuH}QzGP@#ac(!Jw*-s`nf%gD}q&SkuZv6O{Q5MyLQx~iQ zFHcFJ5e(}Jq4S~SC&8&Dj)C7h?GmR`w>jSkQqd2jFe<{6Ly6)Ld&CwMHXW%i+_&#| z^@iHowFO7%fc+kK@84TjeK_1eN5YMbduzjqsZu8K#IKdCg|Vmlv2x~jiV{reSISwA zOFRfAsy{Ag*)H)IGNbxe;j8e~sP3zPFYZ(zs)vLx?q6P1uM)o4crcncSHawT#<-Kn XkBm$8>l&Mv*%V@QKP7pbxM6<*sr}Qu delta 1139 zcmYk5Pe>GT6vyA2aaY~-&+JNOthDQ&I!cX+WvedYr9)cc!Gl2xp>*gPWVGs*gcGI= zID!-*okA#WVM0U<783HXMdT75OuBhVC?XQ-`(}2xeeh;}pWl1G@9+KoEl+vU4?MFG zCEY$(KkUsYM0?80^z67|_{`dgR$oXbKPj3&s+-p)!ivAyyf?8L_D`dGT+#Xh_@cF6 z(-&CfB{ojzbZ|j8dnZp7OWQzuY*Ih>2kCo?R#bcRi5iEaLx6(bkqk zvM1TCnYOW`n_nj{sz!}&h7)H)A9=shf85RACgQ<)D&GA}jmErgzDo?fZoI!cHkTeq za*CC-I`{UD9aFfZd3Zr3$5gCBEScvrhu8C5?rAafN)e z0vxrIsmkSR`)0s#frAWAeN69mXh z$G~M6B&Ja*g}@RMlL?!^uo?LXN5O>!U3TLVcIFuYpMhRAJctF|R^k$Jhls!suoN_9-)Q4awtJ(jDt3Pd-(?=PK6G-}BkNkQes*$$ zS8i=GVV#U|y;pARy3?+<24h_2mA8;eSho-?mFu#VKuK0zjH|3=iOX9^C#($_ENjcS fgYBaj|KQSB9-=S`J8%8&;*h7ijmfaMi>v+t8HB$9 diff --git a/revelation/test/test_asm.py b/revelation/test/test_asm.py index 1de409a..443b6c8 100644 --- a/revelation/test/test_asm.py +++ b/revelation/test/test_asm.py @@ -11,6 +11,8 @@ @pytest.mark.parametrize("elf,expected", [('trap.elf', "Hello, world!"), ('trap_undocumented.elf', "Hello, world!"), + ('ilatst.elf', "Interrupt fired."), + ('rti.elf', "Interrupt fired."), ]) def test_elf_with_stdout(elf, expected, capfd): """Test ELF files by checking STDOUT. @@ -20,7 +22,6 @@ def test_elf_with_stdout(elf, expected, capfd): revelation = Revelation() with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) - revelation.max_insts = 10000 revelation.run() assert not revelation.states[0].running out, err = capfd.readouterr() @@ -51,8 +52,6 @@ def test_elf_with_stdout(elf, expected, capfd): rf4=0x640, rf5=0x640, rf6=0x640, rf7=0x640, rf8=0x640)), ('ilatcl.elf', StateChecker(rf0=0x3ff, rfILATCL=0x3ff, rfILAT=0)), - ('ilatst.elf', StateChecker(rfILATST=0x3ff, rfILAT=0x3fe, - rfIPEND=0x1)), ('jalr.elf', StateChecker(rfLR=0x356)), ('jr.elf', StateChecker(rf0=3, rf1=1, rf2=2)), ('low_high.elf', StateChecker(rf3=0xffffffff)), @@ -65,7 +64,6 @@ def test_elf_with_stdout(elf, expected, capfd): ('movts.elf', StateChecker(rf0=7, rfIRET=7)), ('nop.elf', StateChecker(pc=0x354)), ('orr.elf', StateChecker(rf0=5, rf1=7, rf2=7)), - ('rti.elf', StateChecker(GID=0)), ('rts.elf', StateChecker(rf1=100, rf2=200, rf3=300, rfLR=0x352)), ('special_regs.elf', StateChecker(rf0=1, rf1=2, rf2=3, rf3=4, rf4=5, rf5=6, rf6=7, rf7=8, rf8=9, rf10=11, @@ -85,7 +83,6 @@ def test_elf(elf, expected): revelation = Revelation() with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) - revelation.max_insts = 10000 revelation.run() expected.check(revelation.states[0]) @@ -100,12 +97,10 @@ def test_elf_writes_to_memory(elf, expected, memory): revelation = Revelation() with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) - revelation.max_insts = 10000 revelation.run() expected.check(revelation.states[0], memory) - @pytest.mark.parametrize("elf,expected", [('fabs.elf', StateChecker(rf0=float2bits(5.0), rf1=float2bits(0.0), @@ -178,7 +173,6 @@ def test_fp_elf(elf, expected): revelation = Revelation() with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) - revelation.max_insts = 10000 revelation.run() expected.fp_check(revelation.states[0]) @@ -196,7 +190,6 @@ def test_load(elf, expected): with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) revelation.states[0].mem.write(0x00100004, 4, 0xffffffff) - revelation.max_insts = 10000 revelation.run() expected.check(revelation.states[0]) @@ -213,7 +206,6 @@ def test_store(elf, expected): revelation = Revelation() with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) - revelation.max_insts = 10000 revelation.run() expected.check(revelation.states[0], memory=[(0x00100004, 4, 0xffffffff)]) @@ -224,7 +216,6 @@ def test_elf_load_pm(): with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) revelation.states[0].mem.write(0x80002, 4, 0xffffffff) - revelation.max_insts = 10000 revelation.run() expected = StateChecker(rf0=0xffffffff, rf1=0x100004, rf2=0x80002) expected.check(revelation.states[0]) @@ -237,7 +228,6 @@ def test_elf_store_pm(): revelation = Revelation() with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) - revelation.max_insts = 10000 revelation.run() expected = StateChecker(rf0=0xffffffff, rf1=0x00100004, rf2=4) expected.check(revelation.states[0], memory=[(0x100000, 4, 0xffffffff)]) @@ -249,7 +239,6 @@ def test_testset32(): with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) revelation.states[0].mem.write(0x100004, 4, 0x0) - revelation.max_insts = 100000 revelation.run() expected = StateChecker(AZ=1, rf0=0, rf1=0x100000, rf2=0x4) expected.check(revelation.states[0], memory=[(0x100004, 4, 0xffff)]) @@ -268,7 +257,6 @@ def test_testset32_fail(capfd): revelation = Revelation() with open(elf_filename, 'rb') as elf: revelation.init_state(elf, elf_filename, False, is_test=True) - revelation.max_insts = 100000 revelation.run() out, err = capfd.readouterr() assert err == ''