ilo-amd64-openbsd: use libc instead of direct syscalls
This commit is contained in:
parent
5fb0e2de51
commit
a4832ca8c9
2 changed files with 72 additions and 87 deletions
Binary file not shown.
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue