rmodules: use rmodtool to create rmodules
Start using the rmodtool for generating rmodules. rmodule_link() has been changed to create 2 rules: one for the passed in <name>, the other for creating <name>.rmod which is an ELF file in the format of an rmodule. Since the header is not compiled and linked together with an rmodule there needs to be a way of marking which symbol is the entry point. __rmodule_entry is the symbol used for knowing the entry point. There was a little churn in SMM modules to ensure an rmodule entry point symbol takes a single argument. Change-Id: Ie452ed866f6596bf13f137f5b832faa39f48d26e Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/5379 Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Tested-by: build bot (Jenkins)
This commit is contained in:
committed by
Stefan Reinauer
parent
4fde5a66b4
commit
3eb8eb7eba
@@ -25,12 +25,12 @@ ramstage-srcs += $(SIPI_BIN)
|
||||
rmodules-y += sipi_vector.S
|
||||
rmodules-y += sipi_header.c
|
||||
|
||||
$(SIPI_DOTO): $(dir $(SIPI_ELF))sipi_vector.rmodules.o $(dir $(SIPI_ELF))sipi_header.rmodules.o
|
||||
$(SIPI_DOTO): $(dir $(SIPI_ELF))sipi_vector.rmodules.o
|
||||
$(CC) $(LDFLAGS) -nostdlib -r -o $@ $^
|
||||
|
||||
$(eval $(call rmodule_link,$(SIPI_ELF), $(SIPI_ELF:.elf=.o), 0))
|
||||
$(eval $(call rmodule_link,$(SIPI_ELF), $(SIPI_DOTO), 0))
|
||||
|
||||
$(SIPI_BIN): $(SIPI_ELF)
|
||||
$(SIPI_BIN): $(SIPI_ELF).rmod
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
||||
$(SIPI_BIN).ramstage.o: $(SIPI_BIN)
|
||||
|
@@ -1,6 +0,0 @@
|
||||
#include <rmodule.h>
|
||||
|
||||
|
||||
extern void *ap_start;
|
||||
|
||||
DEFINE_RMODULE_HEADER(sipi_vector_header, ap_start, RMODULE_TYPE_SIPI_VECTOR);
|
@@ -58,6 +58,8 @@ apic_to_cpu_num:
|
||||
.text
|
||||
.code16
|
||||
.global ap_start
|
||||
.global __rmodule_entry
|
||||
__rmodule_entry:
|
||||
ap_start:
|
||||
cli
|
||||
xorl %eax, %eax
|
||||
|
@@ -164,11 +164,18 @@ static int bsp_setup_msr_save_state(struct smm_relocation_params *relo_params)
|
||||
/* The relocation work is actually performed in SMM context, but the code
|
||||
* resides in the ramstage module. This occurs by trampolining from the default
|
||||
* SMRAM entry point to here. */
|
||||
static void asmlinkage
|
||||
cpu_smm_do_relocation(void *arg, int cpu, const struct smm_runtime *runtime)
|
||||
static void asmlinkage cpu_smm_do_relocation(void *arg)
|
||||
{
|
||||
msr_t mtrr_cap;
|
||||
struct smm_relocation_params *relo_params = arg;
|
||||
struct smm_relocation_params *relo_params;
|
||||
const struct smm_module_params *p;
|
||||
const struct smm_runtime *runtime;
|
||||
int cpu;
|
||||
|
||||
p = arg;
|
||||
runtime = p->runtime;
|
||||
relo_params = p->arg;
|
||||
cpu = p->cpu;
|
||||
|
||||
if (cpu >= CONFIG_MAX_CPUS) {
|
||||
printk(BIOS_CRIT,
|
||||
|
@@ -6,6 +6,7 @@ ramstage-$(CONFIG_PARALLEL_MP) += mp_init.c
|
||||
ramstage-$(CONFIG_MIRROR_PAYLOAD_TO_RAM_BEFORE_LOADING) += mirror_payload.c
|
||||
|
||||
SIPI_ELF=$(obj)/cpu/x86/sipi_vector.elf
|
||||
SIPI_RMOD=$(SIPI_ELF).rmod
|
||||
SIPI_BIN=$(SIPI_ELF:.elf=)
|
||||
SIPI_DOTO=$(SIPI_ELF:.elf=.o)
|
||||
|
||||
@@ -13,14 +14,13 @@ ifeq ($(CONFIG_PARALLEL_MP),y)
|
||||
ramstage-srcs += $(SIPI_BIN)
|
||||
endif
|
||||
rmodules-$(CONFIG_PARALLEL_MP) += sipi_vector.S
|
||||
rmodules-$(CONFIG_PARALLEL_MP) += sipi_header.c
|
||||
|
||||
$(SIPI_DOTO): $(dir $(SIPI_ELF))sipi_vector.rmodules.o $(dir $(SIPI_ELF))sipi_header.rmodules.o
|
||||
$(SIPI_DOTO): $(dir $(SIPI_ELF))sipi_vector.rmodules.o
|
||||
$(CC) $(LDFLAGS) -nostdlib -r -o $@ $^
|
||||
|
||||
$(eval $(call rmodule_link,$(SIPI_ELF), $(SIPI_ELF:.elf=.o), 0))
|
||||
|
||||
$(SIPI_BIN): $(SIPI_ELF)
|
||||
$(SIPI_BIN): $(SIPI_RMOD)
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
||||
$(SIPI_BIN).ramstage.o: $(SIPI_BIN)
|
||||
|
@@ -1,6 +0,0 @@
|
||||
#include <rmodule.h>
|
||||
|
||||
|
||||
extern void *ap_start;
|
||||
|
||||
DEFINE_RMODULE_HEADER(sipi_vector_header, ap_start, RMODULE_TYPE_SIPI_VECTOR);
|
@@ -58,6 +58,8 @@ ap_count:
|
||||
.text
|
||||
.code16
|
||||
.global ap_start
|
||||
.global __rmodule_entry
|
||||
__rmodule_entry:
|
||||
ap_start:
|
||||
cli
|
||||
xorl %eax, %eax
|
||||
|
@@ -21,10 +21,8 @@ ramstage-$(CONFIG_BACKUP_DEFAULT_SMM_REGION) += backup_default_smm.c
|
||||
|
||||
ifeq ($(CONFIG_SMM_MODULES),y)
|
||||
smmstub-y += smm_stub.S
|
||||
smmstub-y += smm_module_header.c
|
||||
|
||||
smm-y += smiutil.c
|
||||
smm-y += smm_module_header.c
|
||||
smm-y += smm_module_handler.c
|
||||
|
||||
ramstage-y += smm_module_loader.c
|
||||
@@ -40,7 +38,7 @@ $(obj)/cpu/x86/smm/smmstub.o: $$(smmstub-objs)
|
||||
# Link the SMM stub module with a 0-byte heap.
|
||||
$(eval $(call rmodule_link,$(obj)/cpu/x86/smm/smmstub.elf, $(obj)/cpu/x86/smm/smmstub.o, 0))
|
||||
|
||||
$(obj)/cpu/x86/smm/smmstub: $(obj)/cpu/x86/smm/smmstub.elf
|
||||
$(obj)/cpu/x86/smm/smmstub: $(obj)/cpu/x86/smm/smmstub.elf.rmod
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
||||
$(obj)/cpu/x86/smm/smmstub.ramstage.o: $(obj)/cpu/x86/smm/smmstub
|
||||
@@ -55,7 +53,7 @@ $(obj)/cpu/x86/smm/smm.o: $$(smm-objs) $(LIBGCC_FILE_NAME)
|
||||
|
||||
$(eval $(call rmodule_link,$(obj)/cpu/x86/smm/smm.elf, $(obj)/cpu/x86/smm/smm.o, $(CONFIG_SMM_MODULE_HEAP_SIZE)))
|
||||
|
||||
$(obj)/cpu/x86/smm/smm: $(obj)/cpu/x86/smm/smm.elf
|
||||
$(obj)/cpu/x86/smm/smm: $(obj)/cpu/x86/smm/smm.elf.rmod
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
||||
$(obj)/cpu/x86/smm/smm.ramstage.o: $(obj)/cpu/x86/smm/smm
|
||||
|
@@ -20,6 +20,7 @@
|
||||
#include <arch/io.h>
|
||||
#include <console/console.h>
|
||||
#include <cpu/x86/smm.h>
|
||||
#include <rmodule.h>
|
||||
|
||||
typedef enum { SMI_LOCKED, SMI_UNLOCKED } smi_semaphore;
|
||||
|
||||
@@ -113,8 +114,16 @@ void *smm_get_save_state(int cpu)
|
||||
return base;
|
||||
}
|
||||
|
||||
void smm_handler_start(void *arg, int cpu, const struct smm_runtime *runtime)
|
||||
void asmlinkage smm_handler_start(void *arg)
|
||||
{
|
||||
const struct smm_module_params *p;
|
||||
const struct smm_runtime *runtime;
|
||||
int cpu;
|
||||
|
||||
p = arg;
|
||||
runtime = p->runtime;
|
||||
cpu = p->cpu;
|
||||
|
||||
/* Make sure to set the global runtime. It's OK to race as the value
|
||||
* will be the same across CPUs as well as multiple SMIs. */
|
||||
if (smm_runtime == NULL)
|
||||
@@ -157,6 +166,8 @@ void smm_handler_start(void *arg, int cpu, const struct smm_runtime *runtime)
|
||||
smi_set_eos();
|
||||
}
|
||||
|
||||
RMODULE_ENTRY(smm_handler_start);
|
||||
|
||||
/* Provide a default implementation for all weak handlers so that relocation
|
||||
* entries in the modules make sense. Without default implementations the
|
||||
* weak relocations w/o a symbol have a 0 address which is where the modules
|
||||
|
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (C) 2013 ChromeOS Authors
|
||||
*
|
||||
* 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 <rmodule.h>
|
||||
|
||||
extern char smm_handler_start[];
|
||||
|
||||
DEFINE_RMODULE_HEADER(smm_module, smm_handler_start, RMODULE_TYPE_SMM);
|
@@ -61,6 +61,8 @@ fallback_stack_top:
|
||||
.text
|
||||
.code16
|
||||
.global smm_handler_start
|
||||
.global __rmodule_entry
|
||||
__rmodule_entry:
|
||||
smm_handler_start:
|
||||
movl $(smm_relocate_gdt), %ebx
|
||||
data32 lgdt (%ebx)
|
||||
@@ -132,11 +134,13 @@ smm_trampoline32:
|
||||
2:
|
||||
/* Call into the c-based SMM relocation function with the platform
|
||||
* parameters. Equivalent to:
|
||||
* c_handler(c_handler_params, cpu_num, smm_runtime);
|
||||
* struct arg = { c_handler_params, cpu_num, smm_runtime {;
|
||||
* c_handler(&arg)
|
||||
*/
|
||||
push $(smm_runtime)
|
||||
push %ecx
|
||||
push c_handler_arg
|
||||
push %esp
|
||||
mov c_handler, %eax
|
||||
call *%eax
|
||||
|
||||
|
Reference in New Issue
Block a user