Newer
Older
honey-os / src / userland / mbr / main.c
#include <hlib.h>
#include <mbr.h>

ListElement *devices = NULL;

void registerDevice(uint32_t deviceId, uint32_t reserved, uint32_t serviceName, uint32_t serviceId) {
    MbrDevice *device = malloc(sizeof(MbrDevice));
    device->serviceId = serviceId;
    device->deviceId = deviceId;
    device->readFunktion = getFunction(serviceId, "mbr_read");
    device->writeFunktion = getFunction(serviceId, "mbr_write");
    listAdd(&devices, device);

    void *firstSector = PTR(request(device->serviceId, device->readFunktion, device->deviceId | 512 << 16, 0));
    void *dataHere = requestMemory(1, NULL, firstSector);
    device->mbr = malloc(sizeof(ClassicMBR));
    memcpy(dataHere + 446, device->mbr, sizeof(ClassicMBR));
    if (device->mbr->signature[0] != 0x55 || device->mbr->signature[1] != 0xAA) {
        printf("MBR signature did not match, got: 0x%x%x\n", device->mbr->signature[0], device->mbr->signature[1]);
        return;
    }
    for (uint32_t entry = 0; entry < 4; entry++) {
        PartitionTableEntry *partition = &device->mbr->entries[entry];
        if (partition->type == 0 || partition->sectorCount == 0) {
            // https://uefi.org/sites/default/files/resources/UEFI_Spec_2_10_Aug29.pdf, page 111
            continue;
        }
        printf("partition %i: %i: start: %i, end: %i, active: %i\n", entry, partition->type, partition->lbaStart, partition->lbaStart + partition->sectorCount, partition->active);
        if (partition->type == 0xEE) {
            printf("partition %i is a GPT\n", entry);
            // TODO
            // look at https://uefi.org/sites/default/files/resources/UEFI_Spec_2_10_Aug29.pdf, page 110 for information for this
        } else  if (partition->type == 0xEF) {
            printf("partition %i is an UEFI system partition\n", entry);
            // TODO
            // probably not relevant?
        }
    }
}

int32_t main() {
    createFunction("register", (void *)registerDevice);
}