summarylogtreecommitdiffstats
path: root/mm_2.patch
blob: 817b017e2b39ca35ba2c5c5d8fb24e938908bf78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
---
 grub-core/kern/mm.c | 10 ++++++++++
 include/grub/mm.h   | 16 ++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
index e0e580270..2df835392 100644
--- a/grub-core/kern/mm.c
+++ b/grub-core/kern/mm.c
@@ -81,6 +81,7 @@
 
 
 grub_mm_region_t grub_mm_base;
+grub_mm_add_region_func_t grub_mm_add_region_fn;
 
 /* Get a header from the pointer PTR, and set *P and *R to a pointer
    to the header and a pointer to its region, respectively. PTR must
@@ -360,6 +361,15 @@ grub_memalign (grub_size_t align, grub_size_t size)
       count++;
       goto again;
 
+    case 1:
+      /* Request additional pages.  */
+      count++;
+
+      if (grub_mm_add_region_fn && grub_mm_add_region_fn (size, GRUB_MM_ADD_REGION_CONSECUTIVE) == GRUB_ERR_NONE)
+	goto again;
+
+      /* fallthrough */
+
     default:
       break;
     }
diff --git a/include/grub/mm.h b/include/grub/mm.h
index 9c38dd3ca..afde57d2e 100644
--- a/include/grub/mm.h
+++ b/include/grub/mm.h
@@ -20,6 +20,7 @@
 #ifndef GRUB_MM_H
 #define GRUB_MM_H	1
 
+#include <grub/err.h>
 #include <grub/types.h>
 #include <grub/symbol.h>
 #include <config.h>
@@ -28,6 +29,21 @@
 # define NULL	((void *) 0)
 #endif
 
+#define GRUB_MM_ADD_REGION_NONE        0
+#define GRUB_MM_ADD_REGION_CONSECUTIVE (1 << 0)
+
+/*
+ * Function used to request memory regions of `grub_size_t` bytes. The second
+ * parameter is a bitfield of `GRUB_MM_ADD_REGION` flags.
+ */
+typedef grub_err_t (*grub_mm_add_region_func_t) (grub_size_t, unsigned int);
+
+/*
+ * Set this function pointer to enable adding memory-regions at runtime in case
+ * a memory allocation cannot be satisfied with existing regions.
+ */
+extern grub_mm_add_region_func_t EXPORT_VAR(grub_mm_add_region_fn);
+
 void grub_mm_init_region (void *addr, grub_size_t size);
 void *EXPORT_FUNC(grub_calloc) (grub_size_t nmemb, grub_size_t size);
 void *EXPORT_FUNC(grub_malloc) (grub_size_t size);
-- 
2.32.0


-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEEF9hrgiFbCdvenl/rVbJhu7ckPpQFAmEY9dkACgkQVbJhu7ck
PpScOQ//UbROjKLOAviqmbQoJLJHxwcOKGzpSWDmHI4mjXxc+wafFL6rPOa75//8
R5QoYbEN1uCSkrK4Mgjn4aqwCHp9PyL+thJXuryzHNVtyPrz96aUi4kwXWfsX6Jw
O6a1JpqTJieJyRcTWG91i6k8SMdtPuNXAt/tsllbRy6jp/fYDz4inJHgtG6p//WI
4ORbW4OcFO7n3FCFa1l4EYqsaWJDSkAuKLk5QUKgpAKn3YEc1uL32TgFt77jIjSi
4RIVZT4kNv6aVhCfwLQQW8g1BZkTYO5ehzDXB6SnI+4CjxeGwVMgeZFF6NbU68LX
B4ZBO+SfTpwMoexHykM3VtVEzAQfmY8idIeS0m0ptC5j8rlz/oxI3TrqHkoTxgSU
ZhyrqNOdMOnYx2jLqnh79qmizEebai1nPA/bl2Jke0lQvWSORH9h/HpfN3vCFTW3
Vw8nfZS7MgbU0hk/14rFd/1TWV9m+aEgUITYxL1cnOI70V/Ne+HO41O+NJh6fT14
5yZScrJ3FD8BkvJi/IW4PBZ2Iq8n7u9/UIvhKiNisQuHr13jgaGF2NYm6RYYZANg
1qz7wkf3ora3nN74fu26ohWejlC9hcNGYlIjBI0iRF5E6IJ/mT4jq8PVJ0DJnrUc
8AeLPgnW6BiPgTUevUOODo5jGZQ3oJ6zFumZNLl28wN0Lr9Mqnw=
=+47H
-----END PGP SIGNATURE-----