diff --git a/binaries/ilo-amd64-openbsd b/binaries/ilo-amd64-openbsd index 6c14fd8..ee77fd3 100755 Binary files a/binaries/ilo-amd64-openbsd and b/binaries/ilo-amd64-openbsd differ 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 */