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 */