linux/arch/mips/boot/compressed/calc_vmlinuz_load_addr.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (C) 2010 "Wu Zhangjin" <wuzhangjin@gmail.com>
   4 */
   5
   6#include <sys/types.h>
   7#include <sys/stat.h>
   8#include <errno.h>
   9#include <stdint.h>
  10#include <stdio.h>
  11#include <stdlib.h>
  12#include <linux/sizes.h>
  13
  14int main(int argc, char *argv[])
  15{
  16        unsigned long long vmlinux_size, vmlinux_load_addr, vmlinuz_load_addr;
  17        struct stat sb;
  18
  19        if (argc != 3) {
  20                fprintf(stderr, "Usage: %s <pathname> <vmlinux_load_addr>\n",
  21                                argv[0]);
  22                return EXIT_FAILURE;
  23        }
  24
  25        if (stat(argv[1], &sb) == -1) {
  26                perror("stat");
  27                return EXIT_FAILURE;
  28        }
  29
  30        /* Convert hex characters to dec number */
  31        errno = 0;
  32        if (sscanf(argv[2], "%llx", &vmlinux_load_addr) != 1) {
  33                if (errno != 0)
  34                        perror("sscanf");
  35                else
  36                        fprintf(stderr, "No matching characters\n");
  37
  38                return EXIT_FAILURE;
  39        }
  40
  41        vmlinux_size = (uint64_t)sb.st_size;
  42        vmlinuz_load_addr = vmlinux_load_addr + vmlinux_size;
  43
  44        /*
  45         * Align with 64KB: KEXEC needs load sections to be aligned to PAGE_SIZE,
  46         * which may be as large as 64KB depending on the kernel configuration.
  47         */
  48
  49        vmlinuz_load_addr += (SZ_64K - vmlinux_size % SZ_64K);
  50
  51        printf("0x%llx\n", vmlinuz_load_addr);
  52
  53        return EXIT_SUCCESS;
  54}
  55