limine-install: Misc adjustments
This commit is contained in:
parent
edbc127ffc
commit
5d1f87d068
2
Makefile
2
Makefile
|
@ -11,7 +11,7 @@ PATH := $(shell pwd)/toolchain/bin:$(PATH)
|
||||||
all: limine-install
|
all: limine-install
|
||||||
|
|
||||||
limine-install: limine-install.c limine.o
|
limine-install: limine-install.c limine.o
|
||||||
$(CC) $(CFLAGS) limine.o limine-install.c -o limine-install
|
$(CC) $(CFLAGS) -std=c11 limine.o limine-install.c -o limine-install
|
||||||
|
|
||||||
limine.o: limine.bin
|
limine.o: limine.bin
|
||||||
$(OBJCOPY) -I binary -O default limine.bin limine.o
|
$(OBJCOPY) -I binary -O default limine.bin limine.o
|
||||||
|
|
|
@ -121,18 +121,18 @@ static bool device_init(void) {
|
||||||
for (size_t i = 0; i < sizeof(guesses) / sizeof(size_t); i++) {
|
for (size_t i = 0; i < sizeof(guesses) / sizeof(size_t); i++) {
|
||||||
void *tmp = realloc(cache, guesses[i]);
|
void *tmp = realloc(cache, guesses[i]);
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
cache = tmp;
|
cache = tmp;
|
||||||
|
|
||||||
if (lseek(device, 0, SEEK_SET) == (off_t)-1) {
|
if (lseek(device, 0, SEEK_SET) == (off_t)-1) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ssize_t ret = read(device, cache, guesses[i]);
|
ssize_t ret = read(device, cache, guesses[i]);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
block_size = ret;
|
block_size = ret;
|
||||||
|
@ -146,7 +146,7 @@ static bool device_init(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "Error: Couldn't determine block size of device.\n");
|
fprintf(stderr, "ERROR: Couldn't determine block size of device.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,17 +155,17 @@ static bool device_flush_cache(void) {
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (lseek(device, cached_block * block_size, SEEK_SET) == (off_t)-1) {
|
if (lseek(device, cached_block * block_size, SEEK_SET) == (off_t)-1) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t ret = write(device, cache, block_size);
|
ssize_t ret = write(device, cache, block_size);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((size_t)ret != block_size) {
|
if ((size_t)ret != block_size) {
|
||||||
fprintf(stderr, "Error: Wrote back less bytes than cache size.\n");
|
fprintf(stderr, "ERROR: Wrote back less bytes than cache size.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,17 +183,17 @@ static bool device_cache_block(uint64_t block) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lseek(device, block * block_size, SEEK_SET) == (off_t)-1) {
|
if (lseek(device, block * block_size, SEEK_SET) == (off_t)-1) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t ret = read(device, cache, block_size);
|
ssize_t ret = read(device, cache, block_size);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((size_t)ret != block_size) {
|
if ((size_t)ret != block_size) {
|
||||||
fprintf(stderr, "Error: Read back less bytes than cache size.\n");
|
fprintf(stderr, "ERROR: Read back less bytes than cache size.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,7 +208,7 @@ static bool _device_read(void *buffer, uint64_t loc, size_t count) {
|
||||||
uint64_t block = (loc + progress) / block_size;
|
uint64_t block = (loc + progress) / block_size;
|
||||||
|
|
||||||
if (!device_cache_block(block)) {
|
if (!device_cache_block(block)) {
|
||||||
fprintf(stderr, "Error: Read error.\n");
|
fprintf(stderr, "ERROR: Read error.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,7 +230,7 @@ static bool _device_write(const void *buffer, uint64_t loc, size_t count) {
|
||||||
uint64_t block = (loc + progress) / block_size;
|
uint64_t block = (loc + progress) / block_size;
|
||||||
|
|
||||||
if (!device_cache_block(block)) {
|
if (!device_cache_block(block)) {
|
||||||
fprintf(stderr, "Error: Write error.\n");
|
fprintf(stderr, "ERROR: Write error.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,6 +268,11 @@ int main(int argc, char *argv[]) {
|
||||||
(size_t)_binary_limine_bin_end - (size_t)_binary_limine_bin_start;
|
(size_t)_binary_limine_bin_end - (size_t)_binary_limine_bin_start;
|
||||||
uint8_t orig_mbr[70], timestamp[6];
|
uint8_t orig_mbr[70], timestamp[6];
|
||||||
|
|
||||||
|
if (sizeof(off_t) != 8) {
|
||||||
|
fprintf(stderr, "ERROR: off_t type is not 64-bit.\n");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
if (argc > 1 && strstr("limine.bin", argv[1]) != NULL) {
|
if (argc > 1 && strstr("limine.bin", argv[1]) != NULL) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"WARNING: Passing the bootloader binary as a file argument is\n"
|
"WARNING: Passing the bootloader binary as a file argument is\n"
|
||||||
|
@ -279,12 +284,12 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
printf("Usage: %s <device> [GPT partition index]\n", argv[0]);
|
printf("Usage: %s <device> [GPT partition index]\n", argv[0]);
|
||||||
return 1;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
device = open(argv[1], O_RDWR);
|
device = open(argv[1], O_RDWR);
|
||||||
if (device == -1) {
|
if (device == -1) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,7 +342,7 @@ int main(int argc, char *argv[]) {
|
||||||
sscanf(argv[3], "%" SCNu32, &partition_num);
|
sscanf(argv[3], "%" SCNu32, &partition_num);
|
||||||
partition_num--;
|
partition_num--;
|
||||||
if (partition_num > gpt_header.number_of_partition_entries) {
|
if (partition_num > gpt_header.number_of_partition_entries) {
|
||||||
fprintf(stderr, "error: Partition number is too large.\n");
|
fprintf(stderr, "ERROR: Partition number is too large.\n");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,7 +354,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
if (gpt_entry.unique_partition_guid[0] == 0 &&
|
if (gpt_entry.unique_partition_guid[0] == 0 &&
|
||||||
gpt_entry.unique_partition_guid[1] == 0) {
|
gpt_entry.unique_partition_guid[1] == 0) {
|
||||||
fprintf(stderr, "error: No such partition.\n");
|
fprintf(stderr, "ERROR: No such partition.\n");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,7 +397,7 @@ int main(int argc, char *argv[]) {
|
||||||
new_partition_array_lba_size * partition_entries_per_lb;
|
new_partition_array_lba_size * partition_entries_per_lb;
|
||||||
|
|
||||||
if ((ssize_t)new_partition_entry_count <= max_partition_entry_used) {
|
if ((ssize_t)new_partition_entry_count <= max_partition_entry_used) {
|
||||||
fprintf(stderr, "error: Cannot embed because there are too many used partition entries.\n");
|
fprintf(stderr, "ERROR: Cannot embed because there are too many used partition entries.\n");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,7 +406,7 @@ int main(int argc, char *argv[]) {
|
||||||
uint8_t *partition_array =
|
uint8_t *partition_array =
|
||||||
malloc(new_partition_entry_count * gpt_header.size_of_partition_entry);
|
malloc(new_partition_entry_count * gpt_header.size_of_partition_entry);
|
||||||
if (partition_array == NULL) {
|
if (partition_array == NULL) {
|
||||||
perror("Error");
|
perror("ERROR");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,6 +474,8 @@ int main(int argc, char *argv[]) {
|
||||||
if (!device_flush_cache())
|
if (!device_flush_cache())
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
fprintf(stderr, "Limine installed successfully!\n");
|
||||||
|
|
||||||
ok = 0;
|
ok = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
Loading…
Reference in New Issue