// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <efi/types.h>
#include <efi/system-table.h>

#include <printf.h>

static const char* MemTypeName(uint32_t type, char* buf) {
    switch (type) {
    case EfiReservedMemoryType:
        return "Reserved";
    case EfiLoaderCode:
        return "LoaderCode";
    case EfiLoaderData:
        return "LoaderData";
    case EfiBootServicesCode:
        return "BootSvcsCode";
    case EfiBootServicesData:
        return "BootSvcsData";
    case EfiRuntimeServicesCode:
        return "RunTimeCode";
    case EfiRuntimeServicesData:
        return "RunTimeData";
    case EfiConventionalMemory:
        return "Conventional";
    case EfiUnusableMemory:
        return "Unusable";
    case EfiACPIReclaimMemory:
        return "ACPIReclaim";
    case EfiACPIMemoryNVS:
        return "ACPINonVolMem";
    case EfiMemoryMappedIO:
        return "MemMappedIO";
    case EfiMemoryMappedIOPortSpace:
        return "MemMappedPort";
    case EfiPalCode:
        return "PalCode";
    default:
        sprintf(buf, "0x%08x", type);
        return buf;
    }
}

static unsigned char scratch[4096];

static void dump_memmap(efi_system_table* systab) {
    efi_status r;
    size_t msize, off;
    efi_memory_descriptor* mmap;
    size_t mkey, dsize;
    uint32_t dversion;
    char tmp[32];

    msize = sizeof(scratch);
    mmap = (efi_memory_descriptor*)scratch;
    mkey = dsize = dversion;
    r = systab->BootServices->GetMemoryMap(&msize, mmap, &mkey, &dsize, &dversion);
    printf("r=%lx msz=%lx key=%lx dsz=%lx dvn=%x\n",
           r, msize, mkey, dsize, dversion);
    if (r != EFI_SUCCESS) {
        return;
    }
    for (off = 0; off < msize; off += dsize) {
        mmap = (efi_memory_descriptor*)(scratch + off);
        printf("%016lx %016lx %08lx %c %04lx %s\n",
               mmap->PhysicalStart, mmap->VirtualStart,
               mmap->NumberOfPages,
               mmap->Attribute & EFI_MEMORY_RUNTIME ? 'R' : '-',
               mmap->Attribute & 0xFFFF,
               MemTypeName(mmap->Type, tmp));
    }
}

#include <utils.h>

efi_status efi_main(efi_handle img, efi_system_table* sys) {
    InitGoodies(img, sys);
    dump_memmap(sys);
    WaitAnyKey();
    return EFI_SUCCESS;
}
