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

mm.h (2129B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * linux/compr_mm.h
      4 *
      5 * Memory management for pre-boot and ramdisk uncompressors
      6 *
      7 * Authors: Alain Knaff <alain@knaff.lu>
      8 *
      9 */
     10
     11#ifndef DECOMPR_MM_H
     12#define DECOMPR_MM_H
     13
     14#ifdef STATIC
     15
     16/* Code active when included from pre-boot environment: */
     17
     18/*
     19 * Some architectures want to ensure there is no local data in their
     20 * pre-boot environment, so that data can arbitrarily relocated (via
     21 * GOT references).  This is achieved by defining STATIC_RW_DATA to
     22 * be null.
     23 */
     24#ifndef STATIC_RW_DATA
     25#define STATIC_RW_DATA static
     26#endif
     27
     28/*
     29 * When an architecture needs to share the malloc()/free() implementation
     30 * between compilation units, it needs to have non-local visibility.
     31 */
     32#ifndef MALLOC_VISIBLE
     33#define MALLOC_VISIBLE static
     34#endif
     35
     36/* A trivial malloc implementation, adapted from
     37 *  malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
     38 */
     39STATIC_RW_DATA unsigned long malloc_ptr;
     40STATIC_RW_DATA int malloc_count;
     41
     42MALLOC_VISIBLE void *malloc(int size)
     43{
     44	void *p;
     45
     46	if (size < 0)
     47		return NULL;
     48	if (!malloc_ptr)
     49		malloc_ptr = free_mem_ptr;
     50
     51	malloc_ptr = (malloc_ptr + 3) & ~3;     /* Align */
     52
     53	p = (void *)malloc_ptr;
     54	malloc_ptr += size;
     55
     56	if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
     57		return NULL;
     58
     59	malloc_count++;
     60	return p;
     61}
     62
     63MALLOC_VISIBLE void free(void *where)
     64{
     65	malloc_count--;
     66	if (!malloc_count)
     67		malloc_ptr = free_mem_ptr;
     68}
     69
     70#define large_malloc(a) malloc(a)
     71#define large_free(a) free(a)
     72
     73#define INIT
     74
     75#else /* STATIC */
     76
     77/* Code active when compiled standalone for use when loading ramdisk: */
     78
     79#include <linux/kernel.h>
     80#include <linux/fs.h>
     81#include <linux/string.h>
     82#include <linux/slab.h>
     83#include <linux/vmalloc.h>
     84
     85/* Use defines rather than static inline in order to avoid spurious
     86 * warnings when not needed (indeed large_malloc / large_free are not
     87 * needed by inflate */
     88
     89#define malloc(a) kmalloc(a, GFP_KERNEL)
     90#define free(a) kfree(a)
     91
     92#define large_malloc(a) vmalloc(a)
     93#define large_free(a) vfree(a)
     94
     95#define INIT __init
     96#define STATIC
     97
     98#include <linux/init.h>
     99
    100#endif /* STATIC */
    101
    102#endif /* DECOMPR_MM_H */