Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
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 }