diff options
author | Aaron Durbin <adurbin@chromium.org> | 2015-03-20 09:42:05 -0500 |
---|---|---|
committer | Aaron Durbin <adurbin@google.com> | 2015-03-31 19:42:08 +0200 |
commit | 6e76fff96961264e8c7213142966de6589092291 (patch) | |
tree | 34dd8402cbd71114974f2128f5fdc7671bc371c6 /src/lib/selfboot.c | |
parent | ebf2ed46211e0ccd82d11c34226eb578f9532a2a (diff) | |
download | coreboot-6e76fff96961264e8c7213142966de6589092291.tar.xz |
program loading: provide one cache maintenance callback
Instead of having 2 different functions to call when a program
is loaded provide a single callback with flags parameter. The
previous callbacks for cache management routines did this:
for_each_program_segment:
arch_program_segment_loaded(start, size);
arch_program_loaded();
Now, use one callback instead:
for_each_program_segment:
arch_segment_loaded(start, size, SEG_FINAL?);
Change-Id: I3811cba92e3355d172f605e4444f053321b07a2a
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/8838
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/lib/selfboot.c')
-rw-r--r-- | src/lib/selfboot.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c index fe73c0c451..b29a34eb36 100644 --- a/src/lib/selfboot.c +++ b/src/lib/selfboot.c @@ -314,9 +314,16 @@ static int load_self_segments( struct payload *payload) { struct segment *ptr; + struct segment *last_non_empty; const unsigned long one_meg = (1UL << 20); unsigned long bounce_high = lb_end; + /* Determine last non-empty loaded segment. */ + last_non_empty = NULL; + for(ptr = head->next; ptr != head; ptr = ptr->next) + if (ptr->s_filesz != 0) + last_non_empty = ptr; + for(ptr = head->next; ptr != head; ptr = ptr->next) { if (bootmem_region_targets_usable_ram(ptr->s_dstaddr, ptr->s_memsz)) @@ -442,17 +449,11 @@ static int load_self_segments( * Each architecture can perform additonal operations * on the loaded segment */ - arch_program_segment_loaded((uintptr_t)dest, - ptr->s_memsz); + arch_segment_loaded((uintptr_t)dest, ptr->s_memsz, + last_non_empty == ptr ? SEG_FINAL : 0); } } - /* - * Each architecture can perform additonal operations once the entire - * program is loaded - */ - arch_program_loaded(); - return 1; } |