cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

load_file.c (1180B)


      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, 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}