kaem-minimal.S: make sure to close files and free pools when exiting.
This commit is contained in:
parent
0895da7db6
commit
9af7fdf9bb
|
@ -33,11 +33,11 @@ efi_status_t efi_main(efi_handle_t image_handle, struct efi_system_table *system
|
||||||
*options = 0;
|
*options = 0;
|
||||||
out = ++options;
|
out = ++options;
|
||||||
|
|
||||||
/* Get root device */
|
/* Get root file system */
|
||||||
efi_handle_t root_device = image->device;
|
efi_handle_t root_device = image->device;
|
||||||
system->boot->open_protocol(root_device, &guid2, (void **) &rootfs, image_handle, 0,
|
system->boot->open_protocol(root_device, &guid2, (void **) &rootfs, image_handle, 0,
|
||||||
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
||||||
/* Get root fs */
|
/* Get root directory */
|
||||||
rootfs->open_volume(rootfs, &rootdir);
|
rootfs->open_volume(rootfs, &rootdir);
|
||||||
|
|
||||||
/* Open file for writing */
|
/* Open file for writing */
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include "efi/efi.h"
|
#include "efi/efi.h"
|
||||||
|
|
||||||
#define max_string 512
|
#define max_string 2048
|
||||||
|
|
||||||
#define HARDWARE_DEVICE_PATH 1
|
#define HARDWARE_DEVICE_PATH 1
|
||||||
#define END_HARDWARE_DEVICE_PATH 0x7F
|
#define END_HARDWARE_DEVICE_PATH 0x7F
|
||||||
|
@ -44,11 +44,11 @@ efi_status_t efi_main(efi_handle_t image_handle, struct efi_system_table *system
|
||||||
script_file = ++options;
|
script_file = ++options;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get root device */
|
/* Get root file system */
|
||||||
efi_handle_t root_device = image->device;
|
efi_handle_t root_device = image->device;
|
||||||
system->boot->open_protocol(root_device, &guid2, (void **) &rootfs, image_handle, 0,
|
system->boot->open_protocol(root_device, &guid2, (void **) &rootfs, image_handle, 0,
|
||||||
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
||||||
/* Get root fs */
|
/* Get root directory */
|
||||||
rootfs->open_volume(rootfs, &rootdir);
|
rootfs->open_volume(rootfs, &rootdir);
|
||||||
|
|
||||||
/* Open file for reading */
|
/* Open file for reading */
|
||||||
|
@ -66,7 +66,7 @@ efi_status_t efi_main(efi_handle_t image_handle, struct efi_system_table *system
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
efi_uint_t size = 1;
|
efi_uint_t size = 1;
|
||||||
efi_uint_t file_size = 1;
|
efi_uint_t file_size;
|
||||||
efi_uint_t return_code;
|
efi_uint_t return_code;
|
||||||
void *executable;
|
void *executable;
|
||||||
efi_handle_t child_ih;
|
efi_handle_t child_ih;
|
||||||
|
@ -130,6 +130,7 @@ efi_status_t efi_main(efi_handle_t image_handle, struct efi_system_table *system
|
||||||
|
|
||||||
system->boot->allocate_pool(EFI_LOADER_CODE, file_size, (void **) &executable);
|
system->boot->allocate_pool(EFI_LOADER_CODE, file_size, (void **) &executable);
|
||||||
fcmd->read(fcmd, &file_size, executable);
|
fcmd->read(fcmd, &file_size, executable);
|
||||||
|
fcmd->close(fcmd);
|
||||||
|
|
||||||
struct efi_device_path_protocol *device_path;
|
struct efi_device_path_protocol *device_path;
|
||||||
system->boot->allocate_pool(EFI_LOADER_DATA, 4 + sizeof(struct efi_device_path_protocol), (void **) &device_path);
|
system->boot->allocate_pool(EFI_LOADER_DATA, 4 + sizeof(struct efi_device_path_protocol), (void **) &device_path);
|
||||||
|
@ -161,6 +162,7 @@ efi_status_t efi_main(efi_handle_t image_handle, struct efi_system_table *system
|
||||||
if(return_code != 0) {
|
if(return_code != 0) {
|
||||||
system->boot->free_pool(command);
|
system->boot->free_pool(command);
|
||||||
system->out->output_string(system->out, L"Subprocess error.\r\n");
|
system->out->output_string(system->out, L"Subprocess error.\r\n");
|
||||||
|
rootdir->close(fin);
|
||||||
return return_code;
|
return return_code;
|
||||||
}
|
}
|
||||||
} while(true);
|
} while(true);
|
||||||
|
|
|
@ -9,7 +9,7 @@ lflags = -subsystem:efi_application -nodefaultlib -dll
|
||||||
|
|
||||||
build = build
|
build = build
|
||||||
|
|
||||||
all: $(build)/hex0.efi
|
all: $(build)/hex0.efi $(build)/kaem-optional.efi
|
||||||
|
|
||||||
$(build)/%.o : %.S
|
$(build)/%.o : %.S
|
||||||
mkdir -p $(build)
|
mkdir -p $(build)
|
||||||
|
|
|
@ -104,9 +104,9 @@ DEFINE TEST_ESI_ESI 85F6
|
||||||
SUBI8_RSP !32 # allocate shadow stack space for UEFI function
|
SUBI8_RSP !32 # allocate shadow stack space for UEFI function
|
||||||
CALL_R14 # 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)
|
||||||
LOAD64_into_RAX_from_Address_RSP_Immediate8 !64 # get_image
|
LOAD64_into_RAX_from_Address_RSP_Immediate8 !64 # get_image
|
||||||
|
COPY_RCX_to_RAX # save image
|
||||||
|
|
||||||
# Command line args
|
# Command line args
|
||||||
COPY_RCX_to_RAX # save image
|
|
||||||
LOAD64_into_RBX_from_Address_RAX_Immediate8 !56 # options = image->load_options
|
LOAD64_into_RBX_from_Address_RAX_Immediate8 !56 # options = image->load_options
|
||||||
|
|
||||||
:loop_options1 # Skip application name
|
:loop_options1 # Skip application name
|
||||||
|
@ -128,7 +128,7 @@ DEFINE TEST_ESI_ESI 85F6
|
||||||
ADDI8_RBX !2 # ++options
|
ADDI8_RBX !2 # ++options
|
||||||
COPY_RBX_to_R13 # save output file
|
COPY_RBX_to_R13 # save output file
|
||||||
|
|
||||||
# Get root device
|
# Get root file system
|
||||||
PUSH_RAX # allocate stack for rootfs
|
PUSH_RAX # allocate stack for rootfs
|
||||||
COPY_RSP_to_R8 # arg3 = &rootfs
|
COPY_RSP_to_R8 # arg3 = &rootfs
|
||||||
LOADI64_rel_RDX %SIMPLE_FS_PROTOCOL_8 # EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID (last 64 bits)
|
LOADI64_rel_RDX %SIMPLE_FS_PROTOCOL_8 # EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID (last 64 bits)
|
||||||
|
|
|
@ -44,9 +44,9 @@ _start:
|
||||||
sub rsp, 32 # allocate shadow stack space for UEFI function
|
sub rsp, 32 # allocate shadow stack space for UEFI function
|
||||||
call r14 # 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
|
||||||
|
mov rcx, rax # save image
|
||||||
|
|
||||||
# Command line args
|
# Command line args
|
||||||
mov rcx, rax # save image
|
|
||||||
mov rbx, [rax+56] # options = image->load_options
|
mov rbx, [rax+56] # options = image->load_options
|
||||||
|
|
||||||
loop_options1: # Skip application name
|
loop_options1: # Skip application name
|
||||||
|
@ -68,7 +68,7 @@ loop_options2: # Skip argv[1]
|
||||||
add rbx, 2 # ++options
|
add rbx, 2 # ++options
|
||||||
mov r13, rbx # save output file
|
mov r13, rbx # save output file
|
||||||
|
|
||||||
# Get root device
|
# Get root file system
|
||||||
push rax # allocate stack for rootfs
|
push rax # allocate stack for rootfs
|
||||||
mov r8, rsp # arg3 = &rootfs
|
mov r8, rsp # arg3 = &rootfs
|
||||||
mov rdx, [rip+SIMPLE_FS_PROTOCOL+8] # EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID (last 64 bits)
|
mov rdx, [rip+SIMPLE_FS_PROTOCOL+8] # EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID (last 64 bits)
|
||||||
|
|
|
@ -42,9 +42,9 @@
|
||||||
4883EC 20 ; SUBI8_RSP !32 # allocate shadow stack space for UEFI function
|
4883EC 20 ; SUBI8_RSP !32 # allocate shadow stack space for UEFI function
|
||||||
41FFD6 ; CALL_R14 # system->boot->open_protocol(image_handle, &guid, &image, image_handle, 0, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL)
|
41FFD6 ; CALL_R14 # system->boot->open_protocol(image_handle, &guid, &image, image_handle, 0, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL)
|
||||||
488B4424 40 ; LOAD64_into_RAX_from_Address_RSP_Immediate8 !64 # get_image
|
488B4424 40 ; LOAD64_into_RAX_from_Address_RSP_Immediate8 !64 # get_image
|
||||||
|
4889C1 ; COPY_RCX_to_RAX # save image
|
||||||
|
|
||||||
# Command line args
|
# Command line args
|
||||||
4889C1 ; COPY_RCX_to_RAX # save image
|
|
||||||
488B58 38 ; LOAD64_into_RBX_from_Address_RAX_Immediate8 !56 # options = image->load_options
|
488B58 38 ; LOAD64_into_RBX_from_Address_RAX_Immediate8 !56 # options = image->load_options
|
||||||
|
|
||||||
:loop_options1 # Skip application name
|
:loop_options1 # Skip application name
|
||||||
|
@ -66,7 +66,7 @@
|
||||||
4883C3 02 ; ADDI8_RBX !2 # ++options
|
4883C3 02 ; ADDI8_RBX !2 # ++options
|
||||||
4989DD ; COPY_RBX_to_R13 # save output file
|
4989DD ; COPY_RBX_to_R13 # save output file
|
||||||
|
|
||||||
# Get root device
|
# Get root file system
|
||||||
50 ; PUSH_RAX # allocate stack for rootfs
|
50 ; PUSH_RAX # allocate stack for rootfs
|
||||||
4989E0 ; COPY_RSP_to_R8 # arg3 = &rootfs
|
4989E0 ; COPY_RSP_to_R8 # arg3 = &rootfs
|
||||||
488B15 %SIMPLE_FS_PROTOCOL_8 ; LOADI64_rel_RDX %SIMPLE_FS_PROTOCOL_8 # EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID (last 64 bits)
|
488B15 %SIMPLE_FS_PROTOCOL_8 ; LOADI64_rel_RDX %SIMPLE_FS_PROTOCOL_8 # EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID (last 64 bits)
|
||||||
|
|
|
@ -172,9 +172,9 @@ A3 01 00 00 ; SizeOfRawData
|
||||||
4883EC 20 ; SUBI8_RSP !32 # allocate shadow stack space for UEFI function
|
4883EC 20 ; SUBI8_RSP !32 # allocate shadow stack space for UEFI function
|
||||||
41FFD6 ; CALL_R14 # system->boot->open_protocol(image_handle, &guid, &image, image_handle, 0, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL)
|
41FFD6 ; CALL_R14 # system->boot->open_protocol(image_handle, &guid, &image, image_handle, 0, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL)
|
||||||
488B4424 40 ; LOAD64_into_RAX_from_Address_RSP_Immediate8 !64 # get_image
|
488B4424 40 ; LOAD64_into_RAX_from_Address_RSP_Immediate8 !64 # get_image
|
||||||
|
4889C1 ; COPY_RCX_to_RAX # save image
|
||||||
|
|
||||||
# Command line args
|
# Command line args
|
||||||
4889C1 ; COPY_RCX_to_RAX # save image
|
|
||||||
488B58 38 ; LOAD64_into_RBX_from_Address_RAX_Immediate8 !56 # options = image->load_options
|
488B58 38 ; LOAD64_into_RBX_from_Address_RAX_Immediate8 !56 # options = image->load_options
|
||||||
|
|
||||||
# :loop_options1 [_start+0x42] # Skip application name
|
# :loop_options1 [_start+0x42] # Skip application name
|
||||||
|
@ -196,7 +196,7 @@ A3 01 00 00 ; SizeOfRawData
|
||||||
4883C3 02 ; ADDI8_RBX !2 # ++options
|
4883C3 02 ; ADDI8_RBX !2 # ++options
|
||||||
4989DD ; COPY_RBX_to_R13 # save output file
|
4989DD ; COPY_RBX_to_R13 # save output file
|
||||||
|
|
||||||
# Get root device [_start+0x67]
|
# Get root file system [_start+0x67]
|
||||||
50 ; PUSH_RAX # allocate stack for rootfs
|
50 ; PUSH_RAX # allocate stack for rootfs
|
||||||
4989E0 ; COPY_R8_to_RSP # arg3 = &rootfs
|
4989E0 ; COPY_R8_to_RSP # arg3 = &rootfs
|
||||||
488B15 29010000 ; LOADI64_rel_RDX %SIMPLE_FS_PROTOCOL_8 # EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID (last 64 bits)
|
488B15 29010000 ; LOADI64_rel_RDX %SIMPLE_FS_PROTOCOL_8 # EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID (last 64 bits)
|
||||||
|
|
Loading…
Reference in New Issue