GNU Linux-libre 6.5.10-gnu
[releases.git] / arch / um / kernel / load_file.c
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 }