/*
 * Copyright 2014, NICTA
 *
 * This software may be distributed and modified according to the terms of
 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
 * See "LICENSE_BSD2.txt" for details.
 *
 * @TAG(NICTA_BSD)
 */

#include <autoconf.h>

#include <stdio.h>

#include <sel4/sel4.h>
#include <sel4utils/util.h>

#ifdef CONFIG_USER_DEBUG_BUILD
void
debug_print_bootinfo(seL4_BootInfo *info)
{

    LOG_INFO("Node %u of %u", info->nodeID, info->numNodes);
    LOG_INFO("IOPT levels:     %u", info->numIOPTLevels);
    LOG_INFO("IPC buffer:      %p", info->ipcBuffer);
    LOG_INFO("Empty slots:     [%u --> %u)", info->empty.start, info->empty.end);
    LOG_INFO("sharedFrames:    [%u --> %u)", info->sharedFrames.start, info->sharedFrames.end);
    LOG_INFO("userImageFrames: [%u --> %u)", info->userImageFrames.start, info->userImageFrames.end);
    LOG_INFO("userImagePTs:    [%u --> %u)", info->userImagePTs.start, info->userImagePTs.end);
    LOG_INFO("untypeds:        [%u --> %u)", info->untyped.start, info->untyped.end);
    LOG_INFO("Initial thread domain: %u\n", info->initThreadDomain);
    LOG_INFO("Initial thread cnode size: %u", info->initThreadCNodeSizeBits);
    LOG_INFO("List of untypeds");
    LOG_INFO("------------------");
    LOG_INFO("Paddr    | Size   ");

    int sizes[32] = {0};
    for (int i = 0; i < CONFIG_MAX_NUM_BOOTINFO_UNTYPED_CAPS && i < (info->untyped.end - info->untyped.start); i++) {
        if (info->untypedPaddrList[i] != 0) {
            sizes[info->untypedSizeBitsList[i]]++;
            LOG_INFO("0x%08x | %u", info->untypedPaddrList[i], info->untypedSizeBitsList[i]);
        }
    }

    LOG_INFO("Untyped summary\n");
    for (int i = 0; i < 32; i++) {
        if (sizes[i] != 0) {
            printf("%d untypeds of size %d\n", sizes[i], i);
        }
    }

    /* mainline and experimental treat device regions differently*/
#ifdef CONFIG_KERNEL_STABLE
    LOG_INFO("device untypeds: [%u --> %u)", info->deviceUntyped.start, info->deviceUntyped.end);
    LOG_INFO("List of device untypes");
    LOG_INFO("Paddr    | Size   ");
    int start = info->untyped.end - info->untyped.start;
    int size = info->deviceUntyped.end - info->deviceUntyped.start;
    for (int i = start; i < start + size; i++) {
        if (info->untypedPaddrList[i] != 0) {
            LOG_INFO("0x%08x | %u", info->untypedPaddrList[i], info->untypedSizeBitsList[i]);
        }
    }
#else
    LOG_INFO("DeviceRegions: %u\n", info->numDeviceRegions);
    printf("List of deviceRegions\n");
    printf("Paddr    | Size     | Slot Region\n");
    for (int i = 0; i < info->numDeviceRegions; i++) {
        printf("0x%08x | %08u | [%u <--> %u ]\n", info->deviceRegions[i].basePaddr,
               info->deviceRegions[i].frameSizeBits,
               info->deviceRegions[i].frames.start,
               info->deviceRegions[i].frames.end);
    }
#endif /* CONFIG_KERNEL_STABLE */

}

#endif  /* CONFIG_USER_DEBUG_BUILD */



