From a4832ca8c9e34f446423d881e7c544dbf40a93ca Mon Sep 17 00:00:00 2001 From: crc Date: Mon, 14 Oct 2024 17:58:17 +0200 Subject: [PATCH] ilo-amd64-openbsd: use libc instead of direct syscalls --- binaries/ilo-amd64-openbsd | Bin 2528 -> 7048 bytes source/ilo-amd64-openbsd.s | 159 +++++++++++++++++-------------------- 2 files changed, 72 insertions(+), 87 deletions(-) diff --git a/binaries/ilo-amd64-openbsd b/binaries/ilo-amd64-openbsd index 6c14fd8ba9b1a6d5112de57790b0450dee7b02a9..ee77fd3016e9a6fec0ac303180e5ad1991788fab 100755 GIT binary patch literal 7048 zcmb_hdvH|M89$rd4GSh_6)lm6gc4e;xDXyz24k}%sdw#SQ;3zev?0kZBqgtAZxn25 zV|RGmE~~+6J0hLZhg1G>WI9u1tdGRyIg{3)9YvjSP)y?zxZsX=V89IWCvr<`%aJlFFt?O_?$rxkhyWW#Sf*hvPIcRpdhU zSUPDhlK`u1yK_dPPwCx2;+;@-Cr(y=jGQ4M@v^nN3DUwS{8A>KH7{k)%umhp#3bp* zXy?%!i>{XTqJ^XJh)Rsn$xEvVq{}6bQA#*^)ofIrR1S*QrsB1!c#M7(kCE%S@{}H- zk;cpOL_VC*)G(q-@ro%ZniJb|7DMN=7-6u4t4- z3SR<@JgeZND$Q0Y%N^j}r_vkrZ!(u*&mV{5ehD6Ze350Oq>C(;^M zOp;sx(ongl;)j}b0e(JJxVBN3Y`5M2%g%dVd%Ux3#jiWRyK`AV)t~qHZ<+N@!C&5e zxbq6w>8CC?p)M~m5jwi|xzRXY78Fu!XH%!$I(OFksi}{3)U0c4X^b_9=*C7})ZB4T z&C2Nd#+V*$FK?=i#iB7$t6Qd4oMh1+t&NEKrq)jjqAd}D1yYZt z5hz)(Ah5^^-6g@g7CANRo1W&xZLdvlA7{T!Z?8v>O>eKu5u4tA{q)=P zTx*Jb+@|MikMt*OdO8=}8k<@Jbxp1H8)AaG?XAs1EULbL&y&v`5Uy$NWpm+3^9o-j zL&J8(O&bFvW60{J%Kx^Ja$ZS=dQMXo`NRx(mQ8^9G6U=r=2Uf{$tHJrX_AI){@nq__d^7?9<}!;dk<^ z7C+z{%`eYw;c*AY}fv<0Qr_mE+y~e;MzP_tcHJD#D58{&Y1?Rw!|oknz)HSewS-bO5um zSEH|w>Jd)Nc;Y%_zi4_fmFD}@2``(m13LZ6(e5eb{}Y>kaFtce>aNo35nkxigKL66 z2-XC@#{*T-KwfL0)FJPMuOLS)S-SFlD&>-M5YzY2{NtrJ!%^s8Krcdjo}LG{+0do8 zU^d~zl9}kE`h|c{{G!=0OFP^Pra3q^A~6`RlNg?A=zJsTQ& ztFq+ey6$rGnlmA@Z^hEn9Uo!z6{t%l-GTWClNm{N)O;VseU0lQ=UdfP`eURnI_^H? zZMUYB@cs&3+U6d;Fq~ZS3-kwFeP(|sksFF1@4cg3@1yM0an~F z6zVnIdLHFheQ`KszSMD^7Vqdf`Z1(FdO4?_$8e~Rb$V0J(;`f7l7f~fJ#z!ZH&CF7 zJ^Gxmaq$`2L(+|~r*#}kdawcy!zY}aQ--`MOWsf6awy$Pw7rscb%wT*Xr(x;P9+xg zp3WFFun|@oRS!EDwp*g^pF?Xy^_rOyb*R^Uu9xmmds>~8^LwK^+sx!BL$k-8H^(q~ z6Yj@`E*O)uBsqJW_*aZ$Uo?)L;!}pNoESTSjD0w(eVMuB#k*yY?4sX@76^Z4-#6Yia&C9hq7#xx7|>$rA(sST?65jn7H=B~46(#Qv zJO=OJbMz!h3Hb~xv*fi)5Oe4aEm<*nV{bagaEFqfYtTuR^kBPQjNGtm?m#r`nv>v) zT~kZmv=}36i7=i$CLYy`spqHORL#i$4rK;KAt|OnQ3b`|bS;@b;WS7_{w?H?%=buX zA*A%zkmKMcUWAvx+Y^hQ3Ks0U80`JP7dL0z>+3z^)m;BHU%Px|g)uaW88Q!s9{7}s z()rsGGyO4Y)YpfD)#!dmk5}n)Lv+hN;7hT^VNVT@X*ZYb#FL;oXBUnIGs^^x*Fe;P zcW}d5*KNsk5(i!$k#Y9Kz>6a?J*f`-X+-vr{JRm^OY*}bGOg5spN+`40f~Y35gE6A zF;JJ0%{jTqZe7953Ss4E&bf%EUAuhVA%EbIPdntd9P+CU`EL&SP)0^(|5L*xti~j# zOr@oErv!mzi#KwsQ5D3svY$Cpsi+lFP0=hTARa}mHc=tV>T`}*p#167Q9CXn^X|D# zy$A983diAhE5G$NBHv+&%HykH#eO>HXp7O*%gS@+);i`;O{$5y_h96 zeuYH}7bq-KSfy~S!Zw9n3Pk{~!nz2oZ^fadRgVVfrMNB@2{cBcEz%HZYeJ_z+Egoh zc)5mL7mJBNL~m^e)JuqLYKiIXA`oq;S=V0M9Ia`HK>A@l4vj5%{ccmEzz$P${6hM1r2`xJAW%V84?^u2`ny#5${Dj=;->N>B3tc32Wz`;MO_-7S=w;V2WbjJS!EcW=_v!rYHRSGjq*>Un;fSUNc zzB1qW)x_sI_|E#*Ir!Q_NzfGE>F<;)9sDZAuTp$xzE1va4*pujUwfJS$HAwy!}I6+ z5&sXt|2OdZ;`p2wEi-%l`1@%Wz6(-ge<^)dE`q_%=lko zpPAX+Z{}bkwJ8_~5IKV6U4q)0t|&M4b4tjLkPv|NlQm=(&{;%-hY*$9e7v7TxghzF zNG-WcgJz7I9#J9s+!Jw3e@#w6L0zL)J#M&&-?wjD1a+hy=gOG%A-y4EJ4+Bs6feY$^xKv%M zoCN!JuXqMDXI1%5*qG8ao-`4fvV-5K@40>BllUri&B;Br^3{-6)qcj|6=oh*-cwC> zg(?G%dZCFk;#6q@h_sFZ)zsGb_zba_BALIenpBOo%H!8J9W|EB-)mB5=b*cbwF(yb z6Ldwa(XTp}Zw)8;b;OR~B&MAP#0IM9fVk!dOM93H3X*VEw3wN{L2DKLXi1+a)qZWh zPkQm_8An3nDfZEAR`u?F|*N4_v~gW6?X4$aQVI`0D*X zgm;4>gEiouNlVaJ(yu{ddFLO-62?^J2jG=0Ko0dB`e}B0Wq)O6N7l7ayrIfqj3+QRk?e0Ni zf^L@qSLk+@yK*NcbyBgAHRmTghSEHg7Fjg%9r&VQAsV{Ca2^cRC6*gm^aljd$PsjK zBVE4cf>t^FH)GXN`9;0RH#>b7Onu_HS^hJWXWjck<=-_c@POU;@5Vt|dm%E(t|SjV z!+kjLbrIi%!E}wpbGvf(UVAuA;$vAm6VJlol+KOBcaLPoYyt<;$gn+3;&x^~Xz5%I z;{K1(0ZC@VBaiz+APU;_xhl_5ZUllKQsY<(3a&xMp9@4mgL58@Fc$l)PKCLy_ke`9 z`W-;tH$=kvJwrtF3ohA85b#XL6B38KZ^(N{{l4MD+*gR4VQm@PXqWMCHyS~HdH(+b D66r6K diff --git a/source/ilo-amd64-openbsd.s b/source/ilo-amd64-openbsd.s index cd2ef07..94d1b78 100644 --- a/source/ilo-amd64-openbsd.s +++ b/source/ilo-amd64-openbsd.s @@ -1,6 +1,7 @@ /* AMD64 ilo, (c) 2023 Christopher Leonard, MIT License */ - .global _start + .global main + .extern open, read, write, close, exit, lseek /* rax: top of stack */ /* rbx: data stack */ @@ -10,40 +11,6 @@ /* r14: opcode shift register */ /* r15: memory */ -.section ".note.openbsd.ident", "a" - - .p2align 2 - .long 0x8 - .long 0x4 - .long 0x1 - .ascii "OpenBSD\0" - .long 0x0 - .p2align 2 - -.section ".openbsd.syscalls" -.long rd0 -.long $5 -.long rd1 -.long $5 -.long rd2 -.long $6 -.long rd3 -.long $3 -.long rd4 -.long $4 -.long rd5 -.long $0xA6 -.long rd6 -.long $3 -.long rd6 -.long $4 -.long rd7 -.long $4 -.long rd8 -.long $3 -.long rd9 -.long $1 - .bss .align 8 @@ -78,24 +45,18 @@ io_table: .text -rdonly: mov $5, %eax /* sys_open */ - xor %esi, %esi /* O_RDONLY */ - mov $0666, %edx -rd0: syscall +rdonly: + mov $0, %esi /* O_RDONLY */ + call open mov %eax, %edi ret -wronly: mov $5, %eax /* sys_open */ +wronly: mov $1, %esi /* O_WRONLY */ - mov $0666, %edx -rd1: syscall + call open mov %eax, %edi ret -close: mov $6, %eax /* sys_close */ -rd2: syscall - ret - load_image: mov rom(%rip), %rdi call rdonly @@ -103,8 +64,7 @@ load_image: jz 1f mov %r15, %rsi mov $65536 * 4, %edx - mov $3, %eax /* sys_read */ -rd3: syscall + call read call close xor %eax, %eax lea dstack-4(%rip), %rbx @@ -120,28 +80,36 @@ save_image: jz 1f mov %r15, %rsi mov $65536 * 4, %edx - mov $4, %eax -rd4: syscall + call write call close 1: pop %rax ret -block_common: - mov $0xA6, %eax /* sys_lseek */ - mov (%rbx), %esi - shl $12, %esi - xor %edx, %edx /* SEEK_SET */ -rd5: syscall - mov $3, %eax /* sys_read */ - or %r10b, %r10b - jz 1f - mov $4, %al /* sys_write */ -1: lea (%r15,%r8,4), %rsi - mov $4096, %edx -rd6: syscall - mov -4(%rbx), %esi - sub $8, %rbx - ret +block_read: + mov (%rbx), %esi # Get the block number + shl $12, %esi # Multiply by 4096 (block size) + xor %edx, %edx # SEEK_SET + mov %rax, %rdi # File descriptor (from %rax) + call lseek # Call lseek + mov $4096, %edx # Number of bytes to read + lea (%r15, %r8, 4), %rsi # Buffer location + call read # Call read + mov -4(%rbx), %esi # Retrieve value from the stack + sub $8, %rbx # Update the stack pointer + ret + +block_write: + mov (%rbx), %esi # Get the block number + shl $12, %esi # Multiply by 4096 (block size) + xor %edx, %edx # SEEK_SET + mov %rax, %rdi # File descriptor (from %rax) + call lseek # Call lseek + mov $4096, %edx # Number of bytes to read + lea (%r15, %r8, 4), %rsi # Buffer location + call write + mov -4(%rbx), %esi # Retrieve value from the stack + sub $8, %rbx # Update the stack pointer + ret .align 32 table: ret @@ -271,7 +239,7 @@ an: and (%rbx), %eax or: or (%rbx), %eax sub $4, %rbx ret - .align 32 + .align 32 xo: xor (%rbx), %eax sub $4, %rbx ret @@ -324,48 +292,64 @@ io: mov %eax, %ecx 1: ret ioa: push %rax - mov $4, %eax /* sys_write */ - mov $1, %edi - mov %rsp, %rsi - mov $1, %edx -rd7: syscall + mov %rsp, %rsi /* buffer pointer */ + mov $1, %edx /* write one byte */ + mov $1, %edi /* file descriptor (stdout) */ + call write pop %rax mov (%rbx), %eax sub $4, %rbx ret -iob: add $4, %rbx + +xiob: add $4, %rbx mov %eax, (%rbx) - mov $3, %eax /* sys_read */ push %rax - xor %edi, %edi - mov %rsp, %rsi - mov $1, %edx -rd8: syscall + xor %edi, %edi /* file descriptor (stdin) */ + mov %rsp, %rsi /* buffer pointer */ + mov $1, %edx /* read one byte */ + call read pop %rax ret + +iob: add $4, %rbx + mov %eax, (%rbx) + xor %edi, %edi # %edi = 0 (stdin) + lea a(%rip), %rsi # Load address of 'a' into %rsi (buffer) + mov $1, %edx # %edx = 1 (read one byte) + call read # Call libc read: read(0, a, 1) + movzx a(%rip), %eax # Move the byte from 'a' into %eax (zero-extend) +ret + ioc: mov %eax, %r8d mov blocks(%rip), %rdi - call rdonly - xor %r10d, %r10d - call block_common + mov $0, %rsi + mov $0, %rdx + call open /* open file (read-only) */ + call block_read call close mov %esi, %eax ret + iod: mov %eax, %r8d mov blocks(%rip), %rdi - call wronly - mov $1, %r10b - call block_common + mov $1, %rsi + mov $0, %rdx + call open /* open file (write-only) */ + call block_write call close mov %esi, %eax ret + ioe: jmp save_image + iof: call load_image xor %rax, %rax xor %r13, %r13 jmp _execute + iog: mov $65536, %r13d ret + ioh: add $8, %rbx mov %eax, -4(%rbx) lea astack-4(%rip), %rdx @@ -377,7 +361,9 @@ ioh: add $8, %rbx shr $2, %eax ret -_start: xor %eax, %eax +main: + + xor %eax, %eax lea memory(%rip), %r15 lea dstack-4(%rip), %rbx lea astack-4(%rip), %r12 @@ -434,6 +420,5 @@ _execute: 1: inc %r13 3: cmp $65536, %r13 jl 2b - mov $1, %eax /* sys_exit */ xor %edi, %edi -rd9: syscall + call exit /* exit program */