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: *size, SMP_CACHE_BYTES); |
52 | if (!area) |
53 | panic(fmt: "%s: Failed to allocate %llu bytes\n" , __func__, *size); |
54 | |
55 | if (__uml_load_file(filename, buf: area, size: *size)) { |
56 | memblock_free(ptr: area, size: *size); |
57 | return NULL; |
58 | } |
59 | |
60 | return area; |
61 | } |
62 | |