diff --git a/limine.bin b/limine.bin index 28833f5e..b9d1a300 100644 Binary files a/limine.bin and b/limine.bin differ diff --git a/stage2/lib/blib.c b/stage2/lib/blib.c index ee53ec7f..f6b018a1 100644 --- a/stage2/lib/blib.c +++ b/stage2/lib/blib.c @@ -119,7 +119,58 @@ static int char_value(char c) { return c - '0'; } - return 0; + return -1; +} + +static bool is_valid_guid(const char *s) { + for (size_t i = 0; ; i++) { + switch (i) { + case 8: + case 13: + case 18: + case 23: + if (s[i] != '-') + return false; + break; + case 36: + return s[i] == 0; + default: + if (char_value(s[i]) == -1) + return false; + break; + } + } +} + +static void guid_convert_le_cluster(uint8_t *dest, const char *s, int len) { + size_t p = 0; + for (int i = len - 1; i >= 0; i--) { + int val = char_value(s[i]); + + i % 2 ? (dest[p] = val) : (dest[p++] |= val << 4); + } +} + +static void guid_convert_be_cluster(uint8_t *dest, const char *s, int len) { + size_t p = 0; + for (int i = 0; i < len; i++) { + int val = char_value(s[i]); + + i % 2 ? (dest[p++] |= val) : (dest[p] = val << 4); + } +} + +bool string_to_guid(struct guid *guid, const char *s) { + if (!is_valid_guid(s)) + return false; + + guid_convert_le_cluster((uint8_t *)guid + 0, s + 0, 8); + guid_convert_le_cluster((uint8_t *)guid + 4, s + 9, 4); + guid_convert_le_cluster((uint8_t *)guid + 6, s + 14, 4); + guid_convert_be_cluster((uint8_t *)guid + 8, s + 19, 4); + guid_convert_be_cluster((uint8_t *)guid + 10, s + 24, 16); + + return true; } uint64_t strtoui(const char *s) { diff --git a/stage2/lib/blib.h b/stage2/lib/blib.h index af00263e..8dc60a53 100644 --- a/stage2/lib/blib.h +++ b/stage2/lib/blib.h @@ -8,6 +8,15 @@ extern uint8_t boot_drive; +struct guid { + uint32_t a; + uint16_t b; + uint16_t c; + uint8_t d[8]; +} __attribute__((packed)); + +bool string_to_guid(struct guid *guid, const char *s); + bool uri_open(struct file_handle *fd, char *uri); uint64_t sqrt(uint64_t a_nInput); diff --git a/stage2/lib/part.c b/stage2/lib/part.c index a2cf71a4..9c3fe988 100644 --- a/stage2/lib/part.c +++ b/stage2/lib/part.c @@ -23,10 +23,7 @@ struct gpt_table_header { uint64_t last_usable_lba; // the guid - struct { - uint64_t low; - uint64_t high; - } disk_guid; + struct guid disk_guid; // entries related uint64_t partition_entry_lba; @@ -36,15 +33,9 @@ struct gpt_table_header { } __attribute__((packed)); struct gpt_entry { - struct { - uint64_t low; - uint64_t high; - } partition_type_guid; + struct guid partition_type_guid; - struct { - uint64_t low; - uint64_t high; - } unique_partition_guid; + struct guid unique_partition_guid; uint64_t starting_lba; uint64_t ending_lba; @@ -74,8 +65,9 @@ static int gpt_get_part(struct part *ret, int drive, int partition) { (header.partition_entry_lba * 512) + (partition * sizeof(entry)), sizeof(entry)); - if (entry.unique_partition_guid.low == 0 && - entry.unique_partition_guid.high == 0) return NO_PARTITION; + struct guid empty_guid = {0}; + if (!memcmp(&entry.unique_partition_guid, &empty_guid, sizeof(struct guid))) + return NO_PARTITION; ret->first_sect = entry.starting_lba; ret->sect_count = (entry.ending_lba - entry.starting_lba) + 1;