|
@@ -104,6 +104,29 @@ extern struct boot_params boot_params;
|
|
|
extern unsigned long _brk_end;
|
|
|
void *extend_brk(size_t size, size_t align);
|
|
|
|
|
|
+/*
|
|
|
+ * Reserve space in the brk section. The name must be unique within
|
|
|
+ * the file, and somewhat descriptive. The size is in bytes. Must be
|
|
|
+ * used at file scope.
|
|
|
+ *
|
|
|
+ * (This uses a temp function to wrap the asm so we can pass it the
|
|
|
+ * size parameter; otherwise we wouldn't be able to. We can't use a
|
|
|
+ * "section" attribute on a normal variable because it always ends up
|
|
|
+ * being @progbits, which ends up allocating space in the vmlinux
|
|
|
+ * executable.)
|
|
|
+ */
|
|
|
+#define RESERVE_BRK(name,sz) \
|
|
|
+ static void __section(.discard) __used \
|
|
|
+ __brk_reservation_fn_##name##__(void) { \
|
|
|
+ asm volatile ( \
|
|
|
+ ".pushsection .brk_reservation,\"aw\",@nobits;" \
|
|
|
+ "__brk_reservation_" #name "__:" \
|
|
|
+ " 1:.skip %c0;" \
|
|
|
+ " .size __brk_reservation_" #name "__, . - 1b;" \
|
|
|
+ " .popsection" \
|
|
|
+ : : "i" (sz)); \
|
|
|
+ }
|
|
|
+
|
|
|
#ifdef __i386__
|
|
|
|
|
|
void __init i386_start_kernel(void);
|
|
@@ -115,6 +138,13 @@ void __init x86_64_start_reservations(char *real_mode_data);
|
|
|
|
|
|
#endif /* __i386__ */
|
|
|
#endif /* _SETUP */
|
|
|
+#else
|
|
|
+#define RESERVE_BRK(name,sz) \
|
|
|
+ .pushsection .brk_reservation,"aw",@nobits; \
|
|
|
+__brk_reservation_##name##__: \
|
|
|
+1: .skip sz; \
|
|
|
+ .size __brk_reservation_##name##__,.-1b; \
|
|
|
+ .popsection
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
#endif /* __KERNEL__ */
|
|
|
|