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 */ /* AMD64 ilo, (c) 2023 Christopher Leonard, MIT License */
.global _start .global main
.extern open, read, write, close, exit, lseek
/* rax: top of stack */ /* rax: top of stack */
/* rbx: data stack */ /* rbx: data stack */
@ -10,40 +11,6 @@
/* r14: opcode shift register */ /* r14: opcode shift register */
/* r15: memory */ /* 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 .bss
.align 8 .align 8
@ -78,24 +45,18 @@ io_table:
.text .text
rdonly: mov $5, %eax /* sys_open */ rdonly:
xor %esi, %esi /* O_RDONLY */ mov $0, %esi /* O_RDONLY */
mov $0666, %edx call open
rd0: syscall
mov %eax, %edi mov %eax, %edi
ret ret
wronly: mov $5, %eax /* sys_open */ wronly:
mov $1, %esi /* O_WRONLY */ mov $1, %esi /* O_WRONLY */
mov $0666, %edx call open
rd1: syscall
mov %eax, %edi mov %eax, %edi
ret ret
close: mov $6, %eax /* sys_close */
rd2: syscall
ret
load_image: load_image:
mov rom(%rip), %rdi mov rom(%rip), %rdi
call rdonly call rdonly
@ -103,8 +64,7 @@ load_image:
jz 1f jz 1f
mov %r15, %rsi mov %r15, %rsi
mov $65536 * 4, %edx mov $65536 * 4, %edx
mov $3, %eax /* sys_read */ call read
rd3: syscall
call close call close
xor %eax, %eax xor %eax, %eax
lea dstack-4(%rip), %rbx lea dstack-4(%rip), %rbx
@ -120,28 +80,36 @@ save_image:
jz 1f jz 1f
mov %r15, %rsi mov %r15, %rsi
mov $65536 * 4, %edx mov $65536 * 4, %edx
mov $4, %eax call write
rd4: syscall
call close call close
1: pop %rax 1: pop %rax
ret ret
block_common: block_read:
mov $0xA6, %eax /* sys_lseek */ mov (%rbx), %esi # Get the block number
mov (%rbx), %esi shl $12, %esi # Multiply by 4096 (block size)
shl $12, %esi xor %edx, %edx # SEEK_SET
xor %edx, %edx /* SEEK_SET */ mov %rax, %rdi # File descriptor (from %rax)
rd5: syscall call lseek # Call lseek
mov $3, %eax /* sys_read */ mov $4096, %edx # Number of bytes to read
or %r10b, %r10b lea (%r15, %r8, 4), %rsi # Buffer location
jz 1f call read # Call read
mov $4, %al /* sys_write */ mov -4(%rbx), %esi # Retrieve value from the stack
1: lea (%r15,%r8,4), %rsi sub $8, %rbx # Update the stack pointer
mov $4096, %edx ret
rd6: syscall
mov -4(%rbx), %esi block_write:
sub $8, %rbx mov (%rbx), %esi # Get the block number
ret 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 .align 32
table: ret table: ret
@ -271,7 +239,7 @@ an: and (%rbx), %eax
or: or (%rbx), %eax or: or (%rbx), %eax
sub $4, %rbx sub $4, %rbx
ret ret
.align 32 .align 32
xo: xor (%rbx), %eax xo: xor (%rbx), %eax
sub $4, %rbx sub $4, %rbx
ret ret
@ -324,48 +292,64 @@ io: mov %eax, %ecx
1: ret 1: ret
ioa: push %rax ioa: push %rax
mov $4, %eax /* sys_write */ mov %rsp, %rsi /* buffer pointer */
mov $1, %edi mov $1, %edx /* write one byte */
mov %rsp, %rsi mov $1, %edi /* file descriptor (stdout) */
mov $1, %edx call write
rd7: syscall
pop %rax pop %rax
mov (%rbx), %eax mov (%rbx), %eax
sub $4, %rbx sub $4, %rbx
ret ret
iob: add $4, %rbx
xiob: add $4, %rbx
mov %eax, (%rbx) mov %eax, (%rbx)
mov $3, %eax /* sys_read */
push %rax push %rax
xor %edi, %edi xor %edi, %edi /* file descriptor (stdin) */
mov %rsp, %rsi mov %rsp, %rsi /* buffer pointer */
mov $1, %edx mov $1, %edx /* read one byte */
rd8: syscall call read
pop %rax pop %rax
ret 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 ioc: mov %eax, %r8d
mov blocks(%rip), %rdi mov blocks(%rip), %rdi
call rdonly mov $0, %rsi
xor %r10d, %r10d mov $0, %rdx
call block_common call open /* open file (read-only) */
call block_read
call close call close
mov %esi, %eax mov %esi, %eax
ret ret
iod: mov %eax, %r8d iod: mov %eax, %r8d
mov blocks(%rip), %rdi mov blocks(%rip), %rdi
call wronly mov $1, %rsi
mov $1, %r10b mov $0, %rdx
call block_common call open /* open file (write-only) */
call block_write
call close call close
mov %esi, %eax mov %esi, %eax
ret ret
ioe: jmp save_image ioe: jmp save_image
iof: call load_image iof: call load_image
xor %rax, %rax xor %rax, %rax
xor %r13, %r13 xor %r13, %r13
jmp _execute jmp _execute
iog: mov $65536, %r13d iog: mov $65536, %r13d
ret ret
ioh: add $8, %rbx ioh: add $8, %rbx
mov %eax, -4(%rbx) mov %eax, -4(%rbx)
lea astack-4(%rip), %rdx lea astack-4(%rip), %rdx
@ -377,7 +361,9 @@ ioh: add $8, %rbx
shr $2, %eax shr $2, %eax
ret ret
_start: xor %eax, %eax main:
xor %eax, %eax
lea memory(%rip), %r15 lea memory(%rip), %r15
lea dstack-4(%rip), %rbx lea dstack-4(%rip), %rbx
lea astack-4(%rip), %r12 lea astack-4(%rip), %r12
@ -434,6 +420,5 @@ _execute:
1: inc %r13 1: inc %r13
3: cmp $65536, %r13 3: cmp $65536, %r13
jl 2b jl 2b
mov $1, %eax /* sys_exit */
xor %edi, %edi xor %edi, %edi
rd9: syscall call exit /* exit program */