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 | |
42 | MALLOC_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 | |
63 | MALLOC_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 | |