1 /* 2 * Copyright (C) 2010 "Wu Zhangjin" <wuzhangjin@gmail.com> 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License as published by the 6 * Free Software Foundation; either version 2 of the License, or (at your 7 * option) any later version. 8 */ 9 10 #include <sys/types.h> 11 #include <sys/stat.h> 12 #include <errno.h> 13 #include <stdint.h> 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include "../../../../include/linux/sizes.h" 17 18 int main(int argc, char *argv[]) 19 { 20 unsigned long long vmlinux_size, vmlinux_load_addr, vmlinuz_load_addr; 21 struct stat sb; 22 23 if (argc != 3) { 24 fprintf(stderr, "Usage: %s <pathname> <vmlinux_load_addr>\n", 25 argv[0]); 26 return EXIT_FAILURE; 27 } 28 29 if (stat(argv[1], &sb) == -1) { 30 perror("stat"); 31 return EXIT_FAILURE; 32 } 33 34 /* Convert hex characters to dec number */ 35 errno = 0; 36 if (sscanf(argv[2], "%llx", &vmlinux_load_addr) != 1) { 37 if (errno != 0) 38 perror("sscanf"); 39 else 40 fprintf(stderr, "No matching characters\n"); 41 42 return EXIT_FAILURE; 43 } 44 45 vmlinux_size = (uint64_t)sb.st_size; 46 vmlinuz_load_addr = vmlinux_load_addr + vmlinux_size; 47 48 /* 49 * Align with 64KB: KEXEC needs load sections to be aligned to PAGE_SIZE, 50 * which may be as large as 64KB depending on the kernel configuration. 51 */ 52 53 vmlinuz_load_addr += (SZ_64K - vmlinux_size % SZ_64K); 54 55 printf("0x%llx\n", vmlinuz_load_addr); 56 57 return EXIT_SUCCESS; 58 } 59