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 */ 39 STATIC_RW_DATA unsigned long malloc_ptr; 40 STATIC_RW_DATA int malloc_count; 41 malloc(int size)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 + 7) & ~7; /* 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 free(void * where)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 */ 103