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 
__uml_load_file(const char * filename,void * buf,int size)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 
uml_load_file(const char * filename,unsigned long long * size)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