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