| 1 | |
| 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_or_panic(*size, SMP_CACHE_BYTES);
|
| 52 |
|
| 53 | if (__uml_load_file(filename, area, *size)) {
|
| 54 | memblock_free(area, *size);
|
| 55 | return NULL;
|
| 56 | }
|
| 57 |
|
| 58 | return area;
|
| 59 | }
|