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
10static 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
32void *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

source code of linux/arch/um/kernel/load_file.c