1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 4 */ 5 #include <linux/memblock.h> 6 #include <os.h> 7 8 #include "um_arch.h" 9 10 static int __init __uml_load_file(const char *filename, void *buf, int size) 11 { 12 int fd, n; 13 14 fd = os_open_file(filename, of_read(OPENFLAGS()), 0); 15 if (fd < 0) { 16 printk(KERN_ERR "Opening '%s' failed - err = %d\n", filename, 17 -fd); 18 return -1; 19 } 20 n = os_read_file(fd, buf, size); 21 if (n != size) { 22 printk(KERN_ERR "Read of %d bytes from '%s' failed, " 23 "err = %d\n", size, 24 filename, -n); 25 return -1; 26 } 27 28 os_close_file(fd); 29 return 0; 30 } 31 32 void *uml_load_file(const char *filename, unsigned long long *size) 33 { 34 void *area; 35 int err; 36 37 *size = 0; 38 39 if (!filename) 40 return NULL; 41 42 err = os_file_size(filename, size); 43 if (err) 44 return NULL; 45 46 if (*size == 0) { 47 printk(KERN_ERR "\"%s\" is empty\n", filename); 48 return NULL; 49 } 50 51 area = memblock_alloc(*size, SMP_CACHE_BYTES); 52 if (!area) 53 panic("%s: Failed to allocate %llu bytes\n", __func__, *size); 54 55 if (__uml_load_file(filename, area, *size)) { 56 memblock_free(area, *size); 57 return NULL; 58 } 59 60 return area; 61 } 62