hex0.S: use r14 to store system->boot->open_protocol rather than system->boot.
Also reuse r14 for rootdir and free up rsi for further optimizations.
This commit is contained in:
parent
f5bae9d646
commit
1d3ea9e5c0
|
@ -11,10 +11,9 @@
|
||||||
# but we need to leave stack space
|
# but we need to leave stack space
|
||||||
|
|
||||||
# Registers:
|
# Registers:
|
||||||
# rsi rootdir
|
|
||||||
# r12 in/fin: input file name, later reused for handle
|
# r12 in/fin: input file name, later reused for handle
|
||||||
# r13 out/fout: output file name, later reused for handle
|
# r13 out/fout: output file name, later reused for handle
|
||||||
# r14 system->boot from UEFI, later reused for hex0 algorithm
|
# r14 system->boot->open_protocol from UEFI, later reused for hex0 algorithm, later reused for rootdir
|
||||||
# r15 image_handle from UEFI, later reused for hex0 algorithm
|
# r15 image_handle from UEFI, later reused for hex0 algorithm
|
||||||
|
|
||||||
.global _start
|
.global _start
|
||||||
|
@ -23,7 +22,8 @@
|
||||||
_start:
|
_start:
|
||||||
mov rbp, rsp # save stack pointer
|
mov rbp, rsp # save stack pointer
|
||||||
mov r15, rcx # save image_handle
|
mov r15, rcx # save image_handle
|
||||||
mov r14, [rdx+96] # save system->boot
|
mov r14, [rdx+96] # system->boot
|
||||||
|
mov r14, [r14+280] # system->boot->open_protocol
|
||||||
|
|
||||||
# Open Loaded Image protocol
|
# Open Loaded Image protocol
|
||||||
push rax # allocate stack for image
|
push rax # allocate stack for image
|
||||||
|
@ -38,7 +38,7 @@ _start:
|
||||||
mov r9, rcx # arg4 = image_handle
|
mov r9, rcx # arg4 = image_handle
|
||||||
# arg1 = ImageHandle (already set)
|
# arg1 = ImageHandle (already set)
|
||||||
sub rsp, 32 # allocate stack
|
sub rsp, 32 # allocate stack
|
||||||
call [r14+280] # system->boot->open_protocol(image_handle, &guid, &image, image_handle, 0, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
call r14 # system->boot->open_protocol(image_handle, &guid, &image, image_handle, 0, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
||||||
mov rax, [rsp+64] # get image
|
mov rax, [rsp+64] # get image
|
||||||
|
|
||||||
# Command line args
|
# Command line args
|
||||||
|
@ -77,7 +77,7 @@ loop_options2: # Skip argv[1]
|
||||||
mov r9, r15 # arg4 = image_handle
|
mov r9, r15 # arg4 = image_handle
|
||||||
mov rcx, [rcx+24] # arg1 = root_device = image->device
|
mov rcx, [rcx+24] # arg1 = root_device = image->device
|
||||||
sub rsp, 32 # allocate stack
|
sub rsp, 32 # allocate stack
|
||||||
call [r14+280] # system->boot->open_protocol(root_device, &guid, &rootfs, image_handle, 0, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
call r14 # system->boot->open_protocol(root_device, &guid, &rootfs, image_handle, 0, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
||||||
mov rcx, [rsp+64] # get rootfs
|
mov rcx, [rsp+64] # get rootfs
|
||||||
|
|
||||||
# Get rootfs
|
# Get rootfs
|
||||||
|
@ -85,7 +85,7 @@ loop_options2: # Skip argv[1]
|
||||||
mov rdx, rsp # arg2 = &rootdir
|
mov rdx, rsp # arg2 = &rootdir
|
||||||
sub rsp, 16 # allocate stack
|
sub rsp, 16 # allocate stack
|
||||||
call [rcx+8] # rootfs->open_volume(rootfs, &rootdir)
|
call [rcx+8] # rootfs->open_volume(rootfs, &rootdir)
|
||||||
mov rsi, [rsp+16] # save &rootdir
|
mov r14, [rsp+16] # save &rootdir
|
||||||
|
|
||||||
# Open file for writing
|
# Open file for writing
|
||||||
push rdx # allocate stack for fout
|
push rdx # allocate stack for fout
|
||||||
|
@ -93,7 +93,7 @@ loop_options2: # Skip argv[1]
|
||||||
push 0 # arg5 = 0
|
push 0 # arg5 = 0
|
||||||
mov r9, 0x8000000000000003 # arg4 = EFI_FILE_MODE_CREATE| EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ
|
mov r9, 0x8000000000000003 # arg4 = EFI_FILE_MODE_CREATE| EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ
|
||||||
mov r8, r13 # arg3 = out
|
mov r8, r13 # arg3 = out
|
||||||
mov rcx, rsi # arg1 = rootdir
|
mov rcx, r14 # arg1 = rootdir
|
||||||
sub rsp, 32 # allocate stack
|
sub rsp, 32 # allocate stack
|
||||||
call [rcx+8] # rootdir->open()
|
call [rcx+8] # rootdir->open()
|
||||||
mov r13, [rsp+40] # get fout
|
mov r13, [rsp+40] # get fout
|
||||||
|
@ -104,7 +104,7 @@ loop_options2: # Skip argv[1]
|
||||||
push 1 # arg5 = EFI_FILE_READ_ONLY
|
push 1 # arg5 = EFI_FILE_READ_ONLY
|
||||||
mov r9, 1 # arg4 = EFI_FILE_MODE_READ
|
mov r9, 1 # arg4 = EFI_FILE_MODE_READ
|
||||||
mov r8, r12 # arg3 = in
|
mov r8, r12 # arg3 = in
|
||||||
mov rcx, rsi # arg1 = rootdir
|
mov rcx, r14 # arg1 = rootdir
|
||||||
sub rsp, 32 # allocate stack
|
sub rsp, 32 # allocate stack
|
||||||
call [rcx+8] # rootdir->open()
|
call [rcx+8] # rootdir->open()
|
||||||
mov r12, [rsp+40] # get fin
|
mov r12, [rsp+40] # get fin
|
||||||
|
|
Loading…
Reference in New Issue