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 */
|
/* 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 */
|
||||||
|
|
Loading…
Reference in a new issue