0001
0002
0003
0004
0005 #include <linux/memblock.h>
0006 #include <os.h>
0007
0008 #include "um_arch.h"
0009
0010 static int __init __uml_load_file(const char *filename, void *buf, int size)
0011 {
0012 int fd, n;
0013
0014 fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
0015 if (fd < 0) {
0016 printk(KERN_ERR "Opening '%s' failed - err = %d\n", filename,
0017 -fd);
0018 return -1;
0019 }
0020 n = os_read_file(fd, buf, size);
0021 if (n != size) {
0022 printk(KERN_ERR "Read of %d bytes from '%s' failed, "
0023 "err = %d\n", size,
0024 filename, -n);
0025 return -1;
0026 }
0027
0028 os_close_file(fd);
0029 return 0;
0030 }
0031
0032 void *uml_load_file(const char *filename, unsigned long long *size)
0033 {
0034 void *area;
0035 int err;
0036
0037 *size = 0;
0038
0039 if (!filename)
0040 return NULL;
0041
0042 err = os_file_size(filename, size);
0043 if (err)
0044 return NULL;
0045
0046 if (*size == 0) {
0047 printk(KERN_ERR "\"%s\" is empty\n", filename);
0048 return NULL;
0049 }
0050
0051 area = memblock_alloc(*size, SMP_CACHE_BYTES);
0052 if (!area)
0053 panic("%s: Failed to allocate %llu bytes\n", __func__, *size);
0054
0055 if (__uml_load_file(filename, area, *size)) {
0056 memblock_free(area, *size);
0057 return NULL;
0058 }
0059
0060 return area;
0061 }