ilo-amd64-openbsd: use libc instead of direct syscalls

This commit is contained in:
crc 2024-10-14 17:58:17 +02:00
parent 5fb0e2de51
commit a4832ca8c9
2 changed files with 72 additions and 87 deletions

Binary file not shown.

View file

@ -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 */