From 2eb174d697df06b303c45fb145b1434305a6ed5e Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 5 Jan 2019 01:07:37 -0800 Subject: [PATCH] 4908 Fix CI. a) Update canonical binaries. b) Fix an out-of-bounds access in `clear-stream`. This also required supporting a new instruction in `subx run` to load an imm8 into rm8. --- subx/021byte_addressing.cc | 38 ++++++++++++++++++++++++++++++++++++- subx/031check_operands.cc | 1 + subx/056write.subx | 6 +++--- subx/apps/crenshaw2-1 | Bin 8241 -> 8720 bytes subx/apps/crenshaw2-1b | Bin 8800 -> 9279 bytes subx/apps/factorial | Bin 7159 -> 7638 bytes subx/apps/handle | Bin 7952 -> 8431 bytes subx/apps/hex | Bin 11755 -> 12234 bytes 8 files changed, 41 insertions(+), 4 deletions(-) diff --git a/subx/021byte_addressing.cc b/subx/021byte_addressing.cc index cffc4050..fba9a827 100644 --- a/subx/021byte_addressing.cc +++ b/subx/021byte_addressing.cc @@ -48,7 +48,7 @@ put_new(Name, "88", "copy r8 to r8/m8-at-r32"); 88 18 # copy BL to the byte at *EAX # ModR/M in binary: 00 (indirect mode) 011 (src BL) 000 (dest EAX) == 0x2000 -f0 cc bb aa # 0xf0 with more data in following bytes +f0 cc bb aa +run: copy BL to r8/m8-at-r32 +run: effective address is 0x00002000 (EAX) +run: storing 0xab @@ -114,3 +114,39 @@ case 0x8a: { // copy r/m8 to r8 +run: storing 0x44 # ensure ESI is unchanged % CHECK_EQ(Reg[ESI].u, 0xaabbccdd); + +//: + +:(before "End Initialize Op Names") +put_new(Name, "c6", "copy imm8 to r8/m8-at-r32 (mov)"); + +:(scenario copy_imm8_to_mem_at_r32) +% Reg[EAX].i = 0x2000; +== 0x1 +# op ModR/M SIB displacement immediate + c6 00 dd # copy to the byte at *EAX +# ModR/M in binary: 00 (indirect mode) 000 (unused) 000 (dest EAX) +== 0x2000 +f0 cc bb aa ++run: copy imm8 to r8/m8-at-r32 ++run: effective address is 0x00002000 (EAX) ++run: storing 0xdd +% CHECK_EQ(0xaabbccdd, read_mem_u32(0x2000)); + +:(before "End Single-Byte Opcodes") +case 0xc6: { // copy imm8 to r/m8 + const uint8_t modrm = next(); + const uint8_t src = next(); + trace(90, "run") << "copy imm8 to r8/m8-at-r32" << end(); + trace(90, "run") << "imm8 is 0x" << HEXWORD << src << end(); + const uint8_t subop = (modrm>>3)&0x7; // middle 3 'reg opcode' bits + if (subop != 0) { + cerr << "unrecognized subop for opcode c6: " << NUM(subop) << " (only 0/copy currently implemented)\n"; + exit(1); + } + // use unsigned to zero-extend 8-bit value to 32 bits + uint8_t* dest = reinterpret_cast(effective_byte_address(modrm)); + *dest = src; + trace(90, "run") << "storing 0x" << HEXBYTE << NUM(*dest) << end(); + break; +} diff --git a/subx/031check_operands.cc b/subx/031check_operands.cc index 1038bca9..4fd500fa 100644 --- a/subx/031check_operands.cc +++ b/subx/031check_operands.cc @@ -228,6 +228,7 @@ void init_permitted_operands() { // imm32 imm8 disp32 |disp16 disp8 subop modrm // 0 1 0 |0 0 1 1 put(Permitted_operands, "c1", 0x23); // combine + put(Permitted_operands, "c6", 0x23); // copy //// Class P: op, ModR/M, subop (not r32) and imm32 // imm32 imm8 disp32 |disp16 disp8 subop modrm diff --git a/subx/056write.subx b/subx/056write.subx index 395d33b5..8f5de6e9 100644 --- a/subx/056write.subx +++ b/subx/056write.subx @@ -107,9 +107,9 @@ $clear-stream:loop: 39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # compare EAX with ECX 7d/jump-if-greater-or-equal $clear-stream:end/disp8 # *EAX = 0 - c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX - # EAX += 4 - 81 0/subop/add 3/mod/direct 0/rm32/EAX . . . . . 4/imm32 # add to EAX + c6 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm8 # copy byte to *EAX + # ++EAX + 40/increment-EAX eb/jump $clear-stream:loop/disp8 $clear-stream:end: # . restore registers diff --git a/subx/apps/crenshaw2-1 b/subx/apps/crenshaw2-1 index 5a28117cbe66f02dcc7d2d3153c41ca4157f8f4c..efb462ec769aa27e82c959642a3c7dd317c69d08 100755 GIT binary patch literal 8720 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 RA=3zLN5f8vC?dlb{SQnuG(-RZ literal 8241 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 diff --git a/subx/apps/crenshaw2-1b b/subx/apps/crenshaw2-1b index 46a261830933eecc5991dea27bbda60691cabe65..e6dceafa80fafc7a4f053b941f42d589fee7e3c3 100755 GIT binary patch literal 9279 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 literal 8800 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 diff --git a/subx/apps/factorial b/subx/apps/factorial index 679feb7191a0b71058fdcf835418fca89eb339c5..ac02aca4eb337fdb951efe538ca522df3695410d 100755 GIT binary patch literal 7638 zcmbVQdu&_P9lmLuJN=i$Cwk|CcDqPZ0ph#-NTE!FiPwOE#z2DU2$uol(ZU$s?>pz-b8Z|L zIxPA4-rxPs_j{jnd~a)C+fh|jrMaIe+Efj9SxuX^(iPJ0N-dyGaqgYx90T0G*_wuL zHJ;aNe7^4tO`~rezAx#ThHs7YJpW#9n1gmLHQ%M@B}-?!XK7mQ2!XUKL2sSLMjJHE zu6~=I7wb(>vzavHj`(QIkB zzoQFbem<;++0W>K(7chWoic~iAbjjet_6OM!bnALBD^NT#m=KA4%wJJi_bHs61a<5 z+;V6&14Owl%&Mi;W(-OY<5EgzAMkhr2?JPyVC4>Vt+P9IyDIxqM+mJI zr{rgC+<-|GTN5ESr-S7k$Aoci0vs^!hC)0Hvt3f1`AQDa%}z+6h6v|Ku|wEZviwNEMUo|V0u0%?`LWy>%*^Zgv8kQ@{Ix#rm6-<} z&&BsRS$QtlH6$*NmH9BuB30}*VidV4S@jSkq`(|?Fq@>PWX%TV9+^<{O-e9CmwPaN zc7W^=^PU;?|jw&}N+_kQ|r`K-x7g9c3FZgHJ!@Aw;x3~J5{xaOy^zzO? zeygvSbxYd98ef=cb*`2bZ>~7Jw`Nb ztI>2}_D3l-#}Gw4VnZ_W;{Gk}EGC%G0u<_tY9k;mrTnai3d(6Rp(rjXy^4CI)O=qm z@+n21L5T7Z#EtB0DmcMwUUnuuLlik-Ddl7D$cN+1AOj{vlL9%$C_q=yEa5e8>eu)! z>Vp91p%udH?1_*=5+b5UJ!7})xf5i+c3W+ABmER-=T2ZQ-S*l3b3-!Dk`#e*ue*9tG&lHG-{9YQb}w5h zxp=L-QtMJvrL_C^w9Tw9t?_Mj7lv>bxmmc@*Hvm{@A8=lledEIk_6tw4oj&Sq6xyS zWSLvP;P%L-PiIT*1&6 zt?Ho8<84QU<1{r9?DE-jXdf%Ay~=;#mm>(o^SjGC^b&4557HHA!^P_U2?UJ`$H*CB zAHNqZw^D`sFb{8^C%li*LOY>B|I8_ro>6uGw$!tslAhqQ z*X@$a+Zuw59%<%ssX;5#;8z;B#;i z$VgWy%=VX)Juatt&EGGjrX|e}aUlZ4p+{SEs#2%xLrPl?6GX5sRod9&bX}h9@(yex zKBog$Q3FyX41Ze#-pR|u(}3<#g7#G2zIKn!yRXK7;Zq~z0d-$h4K_%%Xg?-*R&y7+ z?>=>Zzx2M93we0}Bx+_A&mb2*2qa-BV^@*D*}q=k!RVuqVG=gYMe?CjK$k0RT>DaW z&!l!$_1r|E{R!1+A4ufSWq){(`xNruK=Ph+ExLm*poC{&I>m^BG*4+|zohH(+Q6pdKmK~5t=dl~+kDm05Dap5CA)2jFSiQ! z)^vOG65Tm@+iRETAvzn{0i1Vp$B>x(+a@N4*#k0HVYY}Q>&>fS4N``4MV>FYh=Qm< zeq_eBu!M_vGzMJr`H_V6$SF?I$@AW3(#7|kae|b4R$lenISp(rF2lBggZwOegHGF0 zVe>qHcVY7^e>cnVvVeV6RqpYQ?=!S_+t&^VCRAQ9LLq7AlH^Qdp;izlU(be$b$J+1+$K zAyy{-f3hmM7Uiq&r=p^D=Tka@A;ZolD>mwxcCX%3*gO{jn@Ir+^8)1w6@MZERkij^ zep>LLmPu4qt=g4ODX=p{ymN;U$l|}803RR|*&kGNUVzVBc%2Hws}P20FB!oTEDLo+ z;%?O(y+cuaC@FMB@u?JkqWbF#2wUsg>Ll+YJbEH=oOhApZ8+OC?O{bR7edsLq(~|X ziVL-6J^f2rtNXh6kx`tT@Q*Hc1k12{sN{cY_@7W5q;B-vR=wRhoBq+9*7Vx&w7m=V zENtmmQ~Z#}oVUt7q-H|;p$w}y)%O;^UEkDT&3_z*wYD_9I6U2MY`Vnqhgw>TAM@^~ zqc|SQm3<}rSVaRnq=I$@gp_ew4(^rxG;W#@CxP9guo(zJ8D>Ks?0$$30E;Gfjzk9` z6uco1_GO6Q0Jc$K-+@r@p5ejrTBr9c6h_q3QF=*3i3;c>N1Vd_UT zXdlz?5{BR>H0;B$^HUoBhN0s#8g9o>_?(8C<22lbVf_gjZvKLX2QZ9%Nka+4y8qD7 z{1pum40|vq;r`R_K#~Z;55iAW!9x(I2C*1P9_)#w1(tL&i|3A}!yAz)H9jeLE=H^om^> zkxG-wAmk{=a@$Dkal+$%sPCM~a8bz41T;Y_hPL@9MMhF7BhjBhJVSl+yfEsBer}b+ zCLnkRC{0w5AuFDZrQ*hfRH(snk0+>F8H!9cnF?mM#ZsA|iwAmp zEPIMDp&ch0$tg-%_^EuDGZ``=i4!QY=}6SApOa7sh(kf#+Jqp9r^Zk!yCWEnB@6)Y zxq!aX&}ecf6-gUG0pndHE~y-;|C~0(w2QuFS^`1i$|g*87$#JgRQf|J62}Tonlc>N zA9e7{D`_JqyfcF0PAtNBsmxE3lU&0R7u;r~6NalR=PDge)N+&FYu8}93uKe{< zTwKZSO3Jw-YG!}*JIsX3-(i}l*A=H|X~s;ZX@?AQTd^l&HEuk`$?;@j(4C9oG_VH* UVu?W1G@{$EU}r=YQQ^z~2RZH!oB#j- literal 7159 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 diff --git a/subx/apps/handle b/subx/apps/handle index 7bc762e43d73c79670e9347eea0a3d9147b7ee3c..17cdcc8f675a07ddd57e92fb84998684509e94ed 100755 GIT binary patch literal 8431 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 Y)Nuy*qj7(~q4)2>hMl&uhzei$U&ydsr~m)} diff --git a/subx/apps/hex b/subx/apps/hex index 93c9f27f7ec04280e48ee1b4a79c70be83449afa..8680176ce4b6a5992dbf23691c91242ba6bb28be 100755 GIT binary patch literal 12234 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 ZP3!^TWICL%%*0kSY`R~-6)5!i{|^&TN(le} literal 11755 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