cbfs/rmodule: add architecture specific operations at stage load
Two weak functions were added so that architecture specific operations on each segment of payload or stage can be performed. Each architecture must define its own operations, otherwise the behavior will default to do-nothing functions. This patch has been updated by to fit more in line with how program loading is currently being done. The API is the same as the original, but all call sites to stages/payloads have been updated. This is known to break any archs that use rmodule loading that needs cache maintenance. That will be fixed in a forthcoming patch. Also, the vboot paths are left as is for easier upstreaming of the rest of the vboot patches. Original-Change-Id: Ie29e7f9027dd430c8b4dde9848fa3413c5dbfbfa Original-Signed-off-by: Ionela Voinescu <ionela.voinescu@imgtec.com> Original-Reviewed-on: https://chromium-review.googlesource.com/239881 Original-Reviewed-by: Vadim Bendebury <vbendeb@chromium.org> (cherry picked from commit c82c21ce87a4c02bd9219548a4226a58e77beef0) Signed-off-by: Aaron Durbin <adurbin@chromium.org> Change-Id: Ifcee5cd9ac5dbca991556296eb5e170b47b77af7 Reviewed-on: http://review.coreboot.org/8837 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
parent
b337c1d1f5
commit
00903e5fc0
|
@ -2,6 +2,7 @@
|
||||||
* This file is part of the coreboot project.
|
* This file is part of the coreboot project.
|
||||||
*
|
*
|
||||||
* Copyright 2015 Google Inc.
|
* Copyright 2015 Google Inc.
|
||||||
|
* Copyright (C) 2014 Imagination Technologies
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -22,6 +23,12 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* For each segment of a program loaded this function is called*/
|
||||||
|
void arch_program_segment_loaded(uintptr_t start, size_t size);
|
||||||
|
|
||||||
|
/* Upon completion of loading a program this function is called */
|
||||||
|
void arch_program_loaded(void);
|
||||||
|
|
||||||
/************************
|
/************************
|
||||||
* ROMSTAGE LOADING *
|
* ROMSTAGE LOADING *
|
||||||
************************/
|
************************/
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#
|
#
|
||||||
subdirs-y += loaders
|
subdirs-y += loaders
|
||||||
|
|
||||||
|
bootblock-y += arch_ops.c
|
||||||
bootblock-y += cbfs.c cbfs_core.c
|
bootblock-y += cbfs.c cbfs_core.c
|
||||||
bootblock-$(CONFIG_COMMON_CBFS_SPI_WRAPPER) += cbfs_spi.c
|
bootblock-$(CONFIG_COMMON_CBFS_SPI_WRAPPER) += cbfs_spi.c
|
||||||
|
|
||||||
|
@ -25,6 +26,7 @@ bootblock-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c
|
||||||
bootblock-y += memchr.c
|
bootblock-y += memchr.c
|
||||||
bootblock-y += memcmp.c
|
bootblock-y += memcmp.c
|
||||||
|
|
||||||
|
verstage-y += arch_ops.c
|
||||||
verstage-y += delay.c
|
verstage-y += delay.c
|
||||||
verstage-y += cbfs.c
|
verstage-y += cbfs.c
|
||||||
verstage-y += memcmp.c
|
verstage-y += memcmp.c
|
||||||
|
@ -33,6 +35,7 @@ verstage-$(CONFIG_COMMON_CBFS_SPI_WRAPPER) += cbfs_spi.c
|
||||||
verstage-y += tlcl.c
|
verstage-y += tlcl.c
|
||||||
verstage-$(CONFIG_GENERIC_UDELAY) += timer.c
|
verstage-$(CONFIG_GENERIC_UDELAY) += timer.c
|
||||||
|
|
||||||
|
romstage-y += arch_ops.c
|
||||||
romstage-y += memchr.c
|
romstage-y += memchr.c
|
||||||
romstage-y += memcmp.c
|
romstage-y += memcmp.c
|
||||||
$(foreach arch,$(ARCH_SUPPORTED),\
|
$(foreach arch,$(ARCH_SUPPORTED),\
|
||||||
|
@ -57,6 +60,7 @@ romstage-$(CONFIG_ARCH_ROMSTAGE_X86_32) += gcc.c
|
||||||
ramstage-$(CONFIG_ARCH_RAMSTAGE_X86_32) += gcc.c
|
ramstage-$(CONFIG_ARCH_RAMSTAGE_X86_32) += gcc.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ramstage-y += arch_ops.c
|
||||||
ramstage-y += hardwaremain.c
|
ramstage-y += hardwaremain.c
|
||||||
ramstage-y += selfboot.c
|
ramstage-y += selfboot.c
|
||||||
ramstage-y += coreboot_table.c
|
ramstage-y += coreboot_table.c
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the coreboot project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Imagination Technologies
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <program_loading.h>
|
||||||
|
|
||||||
|
/* For each segment of a program loaded this function is called*/
|
||||||
|
__attribute__ ((weak)) void arch_program_segment_loaded(uintptr_t start,
|
||||||
|
size_t size)
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Upon completion of loading a program this function is called */
|
||||||
|
__attribute__ ((weak)) void arch_program_loaded(void)
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
}
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <program_loading.h>
|
||||||
#include "cbfs_core.h"
|
#include "cbfs_core.h"
|
||||||
|
|
||||||
#ifndef __SMM__
|
#ifndef __SMM__
|
||||||
|
@ -111,6 +112,8 @@ void *cbfs_load_stage_by_offset(struct cbfs_media *media, ssize_t offset)
|
||||||
media->unmap(media, data);
|
media->unmap(media, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arch_program_segment_loaded(stage.load, stage.memlen);
|
||||||
|
arch_program_loaded();
|
||||||
DEBUG("stage loaded\n");
|
DEBUG("stage loaded\n");
|
||||||
|
|
||||||
return (void *)(uintptr_t)stage.entry;
|
return (void *)(uintptr_t)stage.entry;
|
||||||
|
|
|
@ -22,8 +22,8 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <arch/cache.h>
|
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
|
#include <program_loading.h>
|
||||||
#include <rmodule.h>
|
#include <rmodule.h>
|
||||||
|
|
||||||
/* Change this define to get more verbose debugging for module loading. */
|
/* Change this define to get more verbose debugging for module loading. */
|
||||||
|
@ -200,7 +200,9 @@ int rmodule_load(void *base, struct rmodule *module)
|
||||||
return -1;
|
return -1;
|
||||||
rmodule_clear_bss(module);
|
rmodule_clear_bss(module);
|
||||||
|
|
||||||
cache_sync_instructions();
|
arch_program_segment_loaded((uintptr_t)module->location,
|
||||||
|
rmodule_memory_size(module));
|
||||||
|
arch_program_loaded();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -437,8 +437,22 @@ static int load_self_segments(
|
||||||
memcpy((char*)to, (char*)from, amount);
|
memcpy((char*)to, (char*)from, amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Each architecture can perform additonal operations
|
||||||
|
* on the loaded segment
|
||||||
|
*/
|
||||||
|
arch_program_segment_loaded((uintptr_t)dest,
|
||||||
|
ptr->s_memsz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Each architecture can perform additonal operations once the entire
|
||||||
|
* program is loaded
|
||||||
|
*/
|
||||||
|
arch_program_loaded();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue