14f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin/* 24f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * Copyright (C) 2016 The Android Open Source Project 34f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * 44f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * Licensed under the Apache License, Version 2.0 (the "License"); 54f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * you may not use this file except in compliance with the License. 64f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * You may obtain a copy of the License at 74f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * 84f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * http://www.apache.org/licenses/LICENSE-2.0 94f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * 104f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * Unless required by applicable law or agreed to in writing, software 114f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * distributed under the License is distributed on an "AS IS" BASIS, 124f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * See the License for the specific language governing permissions and 144f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin * limitations under the License. 154f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin */ 164f00eda9fa05364edd719b05b88e4445682eeee5SzuWei Lin 17f6c209b3f409f879305ac9837524b9d34c850de6Li Chen#include <stdio.h> 18f6c209b3f409f879305ac9837524b9d34c850de6Li Chen#include <stdlib.h> 19f6c209b3f409f879305ac9837524b9d34c850de6Li Chen#include <time.h> 20f6c209b3f409f879305ac9837524b9d34c850de6Li Chen 21f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin#include "ufdt_overlay.h" 22f6c209b3f409f879305ac9837524b9d34c850de6Li Chen#include "libufdt_sysdeps.h" 23f6c209b3f409f879305ac9837524b9d34c850de6Li Chen 24f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin#include "util.h" 25f6c209b3f409f879305ac9837524b9d34c850de6Li Chen 26f6c209b3f409f879305ac9837524b9d34c850de6Li Chen 27da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Linint apply_ovleray_files(const char *out_filename, 28da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin const char *base_filename, 29da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin const char *overlay_filename) { 30da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin int ret = 1; 31da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin char *base_buf = NULL; 32da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin char *overlay_buf = NULL; 33da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin struct fdt_header *new_blob = NULL; 34da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin 35da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin size_t blob_len; 36da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin base_buf = load_file(base_filename, &blob_len); 37da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin if (!base_buf) { 38da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin fprintf(stderr, "Can not load base file: %s\n", base_filename); 39da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin goto end; 40f6c209b3f409f879305ac9837524b9d34c850de6Li Chen } 41f6c209b3f409f879305ac9837524b9d34c850de6Li Chen 42da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin size_t overlay_len; 43da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin overlay_buf = load_file(overlay_filename, &overlay_len); 44da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin if (!overlay_buf) { 45da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin fprintf(stderr, "Can not load overlay file: %s\n", overlay_filename); 46da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin goto end; 47da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin } 48da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin 49da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin struct fdt_header *blob = ufdt_install_blob(base_buf, blob_len); 50f6c209b3f409f879305ac9837524b9d34c850de6Li Chen if (!blob) { 51da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin fprintf(stderr, "ufdt_install_blob() returns null\n"); 52da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin goto end; 53da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin } 54da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin 55da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin clock_t start = clock(); 56da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin new_blob = ufdt_apply_overlay(blob, blob_len, overlay_buf, overlay_len); 57da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin clock_t end = clock(); 58da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin 59f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin if (write_fdt_to_file(out_filename, new_blob) != 0) { 60da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin fprintf(stderr, "Write file error: %s\n", out_filename); 61da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin goto end; 62f6c209b3f409f879305ac9837524b9d34c850de6Li Chen } 63f6c209b3f409f879305ac9837524b9d34c850de6Li Chen 64da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin // Outputs the used time. 65da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin double cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC; 66f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin printf("ufdt_apply_overlay: took %.9f secs\n", cpu_time_used); 67da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin ret = 0; 68f6c209b3f409f879305ac9837524b9d34c850de6Li Chen 69da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Linend: 70f6c209b3f409f879305ac9837524b9d34c850de6Li Chen // Do not dto_free(blob) - it's the same as base_buf. 71f6c209b3f409f879305ac9837524b9d34c850de6Li Chen 72da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin if (new_blob) dto_free(new_blob); 73da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin if (overlay_buf) dto_free(overlay_buf); 74da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin if (base_buf) dto_free(base_buf); 75da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin 76da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin return ret; 77da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin} 78da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin 79da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Linint main(int argc, char **argv) { 80da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin if (argc < 4) { 81da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin fprintf(stderr, "Usage: %s <base_file> <overlay_file> <out_file>\n", argv[0]); 82da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin return 1; 83f6c209b3f409f879305ac9837524b9d34c850de6Li Chen } 84da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin 85da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin const char *base_file = argv[1]; 86da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin const char *overlay_file = argv[2]; 87da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin const char *out_file = argv[3]; 88da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin int ret = apply_ovleray_files(out_file, base_file, overlay_file); 89da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin 90da8237d9cceccc3e650ad433689ee4c6ba93b80bSzuWei Lin return ret; 91f6c209b3f409f879305ac9837524b9d34c850de6Li Chen} 92