aboutsummaryrefslogtreecommitdiff
path: root/src/lib/rmodule.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2013-02-27 22:50:12 -0600
committerStefan Reinauer <stefan.reinauer@coreboot.org>2013-03-22 00:13:42 +0100
commitdd4a6d2357decf0cf505370234b378985c68f97f (patch)
tree6c656e9d13fbc39a9a88766d9b3f533a98a9f89b /src/lib/rmodule.c
parent24d1d4b47274eb82893e6726472a991a36fce0aa (diff)
coreboot: dynamic cbmem requirement
Dynamic cbmem is now a requirement for relocatable ramstage. This patch replaces the reserve_* fields in the romstage_handoff structure by using the dynamic cbmem library. The haswell code is not moved over in this commit, but it should be safe because there is a hard requirement for DYNAMIC_CBMEM when using a reloctable ramstage. Change-Id: I59ab4552c3ae8c2c3982df458cd81a4a9b712cc2 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/2849 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/lib/rmodule.c')
-rw-r--r--src/lib/rmodule.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/src/lib/rmodule.c b/src/lib/rmodule.c
index 4276ed33e8..b56ec322be 100644
--- a/src/lib/rmodule.c
+++ b/src/lib/rmodule.c
@@ -16,6 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -254,16 +255,22 @@ int rmodule_load(void *base, struct rmodule *module)
return 0;
}
-void *rmodule_find_region_below(void *addr, size_t rmodule_size,
- void **program_start, void **rmodule_start)
+int rmodule_calc_region(unsigned int region_alignment, size_t rmodule_size,
+ size_t *region_size, int *load_offset)
{
- unsigned long ceiling;
- unsigned long program_base;
- unsigned long placement_loc;
- unsigned long program_begin;
+ /* region_alignment must be a power of 2. */
+ if (region_alignment & (region_alignment - 1))
+ BUG();
- ceiling = (unsigned long)addr;
- /* Place the rmodule just under the ceiling. The rmodule files
+ if (region_alignment < 4096)
+ region_alignment = 4096;
+
+ /* Sanity check rmodule_header size. The code below assumes it is less
+ * than the minimum alignment required. */
+ if (region_alignment < sizeof(struct rmodule_header))
+ BUG();
+
+ /* Place the rmodule according to alignment. The rmodule files
* themselves are packed as a header and a payload, however the rmodule
* itself is linked along with the header. The header starts at address
* 0. Immediately following the header in the file is the program,
@@ -273,13 +280,13 @@ void *rmodule_find_region_below(void *addr, size_t rmodule_size,
* to place the rmodule so that the program falls on the aligned
* address with the header just before it. Therefore, we need at least
* a page to account for the size of the header. */
- program_base = ALIGN((ceiling - (rmodule_size + 4096)), 4096);
+ *region_size = ALIGN(rmodule_size + region_alignment, 4096);
/* The program starts immediately after the header. However,
* it needs to be aligned to a 4KiB boundary. Therefore, adjust the
* program location so that the program lands on a page boundary. The
* layout looks like the following:
*
- * +--------------------------------+ ceiling
+ * +--------------------------------+ region_alignment + region_size
* | >= 0 bytes from alignment |
* +--------------------------------+ program end (4KiB aligned)
* | program size |
@@ -287,14 +294,9 @@ void *rmodule_find_region_below(void *addr, size_t rmodule_size,
* | sizeof(struct rmodule_header) |
* +--------------------------------+ rmodule header start
* | >= 0 bytes from alignment |
- * +--------------------------------+ program_base (4KiB aligned)
+ * +--------------------------------+ region_alignment
*/
- placement_loc = ALIGN(program_base + sizeof(struct rmodule_header),
- 4096) - sizeof(struct rmodule_header);
- program_begin = placement_loc + sizeof(struct rmodule_header);
-
- *program_start = (void *)program_begin;
- *rmodule_start = (void *)placement_loc;
+ *load_offset = region_alignment;
- return (void *)program_base;
+ return region_alignment - sizeof(struct rmodule_header);
}