#include #include #include #include #include struct gpt_header *read_gpt_disk(struct disk *disk) { uint16_t *gpt = kmalloc(512); if (!read(disk->port, 1, 1, gpt)) return NULL; struct gpt_header *part = (void*) gpt; if (memcmp(part->sig, "EFI PART", 8) != 0) { vga_puts("not gpt"); return NULL; } vga_puts("found gpt table on disk 0\n"); vga_puts("number of partitions: "); vga_putn(part->number_partitions); vga_putc('\n'); vga_puts("starting lba: "); vga_putn(part->first_lba); vga_putc('\n'); vga_puts("size per entry: "); vga_putn(part->size_partitions); vga_putc('\n'); return part; } struct gpt_entry *get_gpt_entry(struct disk *disk, struct gpt_header *header, size_t num) { if (num >= header->number_partitions) return NULL; uint16_t *data = kmalloc(512); if (!read(disk->port, header->first_lba + num, 1, data)) return NULL; struct gpt_entry *entry = (void *) data; /* vga_puts("unique guid for first partition: "); vga_putx(entry->guid); vga_putc('\n'); */ vga_puts("starting partition lba: "); vga_putn(entry->lba.start); vga_putc('\n'); vga_puts("ending partition lba: "); vga_putn(entry->lba.end); vga_putc('\n'); return entry; } char *read_gpt_entry(struct disk *disk, struct gpt_entry *entry) { uint16_t *data = kmalloc(512 * (entry->lba.end - entry->lba.start)); uint16_t *ptr = data; for (size_t lba = entry->lba.start; lba < entry->lba.end; lba += 1024) { if (!read(disk->port, lba, entry->lba.end - lba < 1024 ? entry->lba.end - lba : 1024, ptr)) { vga_puts("failed to read disk"); kfree(data); return NULL; } ptr += 1024 * 256; } return (char *)data; }