// Copyright 2017 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.

/* mkkdtb - packages kernel file and dtb in kdtb format, required by some
            bootloaders instead of just appending dtb to end of kernel.
*/

#include <assert.h>
#include <ctype.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char magic[4];
    uint32_t kern_size;
    uint32_t dtb_size;
} kdtb_header_t;

int print_usage(void) {
    printf("mkkdtb kernfile dtbfile outfile\n");
    return 0;
}

int main(int argc, char** argv) {

    int retval = 0;

    uint8_t* kern_buffer = NULL;
    uint8_t* dtb_buffer = NULL;

    FILE* dtb_fd = NULL;
    FILE* out_fd = NULL;

    kdtb_header_t kheader = {"KDTB", 0, 0};

    if (argc < 4) {
        print_usage();
        return -1;
    }

    FILE* kernel_fd = fopen(argv[1], "r");
    if (!kernel_fd) {
        fprintf(stderr, "Kernel file not found\n");
        retval = -1;
        goto fail;
    }

    dtb_fd = fopen(argv[2], "r");
    if (!dtb_fd) {
        fprintf(stderr, "DTB file not found\n");
        retval = -1;
        goto fail;
    }

    out_fd = fopen(argv[3], "w");
    if (!out_fd) {
        fprintf(stderr, "Can't open output file\n");
        retval = -1;
        goto fail;
    }

    fseek(kernel_fd, 0, SEEK_END);
    kheader.kern_size = ftell(kernel_fd);
    fseek(kernel_fd, 0, SEEK_SET);

    fseek(dtb_fd, 0, SEEK_END);
    kheader.dtb_size = ftell(dtb_fd);
    fseek(dtb_fd, 0, SEEK_SET);

    kern_buffer = malloc(kheader.kern_size);
    if (!kern_buffer) {
        retval = -1;
        goto fail;
    }
    if (fread(kern_buffer, kheader.kern_size, 1, kernel_fd) != 1) {
        fprintf(stderr, "kernel read error\n");
        retval = -1;
        goto fail;
    }

    dtb_buffer = malloc(kheader.dtb_size);
    if (!dtb_buffer) {
        retval = -1;
        goto fail;
    }
    if (fread(dtb_buffer, kheader.dtb_size, 1, dtb_fd) != 1) {
        fprintf(stderr, "dtb read error\n");
        retval = -1;
        goto fail;
    }

    fwrite(&kheader, sizeof(kheader), 1, out_fd);
    fwrite(kern_buffer, sizeof(uint8_t), kheader.kern_size, out_fd);
    fwrite(dtb_buffer, sizeof(uint8_t), kheader.dtb_size, out_fd);

fail:
    if (kernel_fd)
        fclose(kernel_fd);
    if (dtb_fd)
        fclose(dtb_fd);
    if (out_fd)
        fclose(out_fd);
    if (kern_buffer)
        free(kern_buffer);
    if (dtb_buffer)
        free(dtb_buffer);
    return retval;
}
