summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Garber <jgarber1@ualberta.ca>2019-05-14 11:21:41 -0600
committerStefan Reinauer <stefan.reinauer@coreboot.org>2019-05-16 18:08:50 +0000
commitbc674765a93bc5c9bf2c20ce2444389dccc754e1 (patch)
treeb363bda561b009f204ff3580f68afe318aead52b
parent2e8188aa13b84f607fd3a1e95fb7b63b26ff1d89 (diff)
downloadcoreboot-bc674765a93bc5c9bf2c20ce2444389dccc754e1.tar.gz
coreboot-bc674765a93bc5c9bf2c20ce2444389dccc754e1.tar.bz2
coreboot-bc674765a93bc5c9bf2c20ce2444389dccc754e1.zip
{arch,cpu}/x86, drivers/intel: Restore cpu_index error handling
Previously cpu_index() always succeeded, but since commit 095c931 (src/arch/x86: Use core apic id to get cpu_index()) it is now possible for it to indicate an error by returning -1. This commit adds error handling for all calls to cpu_index(), and restores several checks that were removed in commit 7c712bb (Fix code that would trip -Wtype-limits) but are now needed. Signed-off-by: Jacob Garber <jgarber1@ualberta.ca> Change-Id: I5436eed4cb5675f916924eb9670db04592a8b927 Reviewed-on: https://review.coreboot.org/c/coreboot/+/32795 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r--src/arch/x86/cpu.c2
-rw-r--r--src/arch/x86/exception.c2
-rw-r--r--src/arch/x86/include/arch/cpu.h2
-rw-r--r--src/cpu/x86/mp_init.c15
-rw-r--r--src/cpu/x86/pae/pgtbl.c4
-rw-r--r--src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c9
6 files changed, 28 insertions, 6 deletions
diff --git a/src/arch/x86/cpu.c b/src/arch/x86/cpu.c
index fb4c7b6cfeca..e6c943550338 100644
--- a/src/arch/x86/cpu.c
+++ b/src/arch/x86/cpu.c
@@ -350,7 +350,7 @@ void arch_bootstate_coreboot_exit(void)
* Hence new logic to use cpuid to fetch lapic id and matches with
* cpus_default_apic_id[] variable to return correct cpu_index().
*/
-unsigned long cpu_index(void)
+int cpu_index(void)
{
int i;
int lapic_id = initial_lapicid();
diff --git a/src/arch/x86/exception.c b/src/arch/x86/exception.c
index b00777a45531..b88f4a7553ec 100644
--- a/src/arch/x86/exception.c
+++ b/src/arch/x86/exception.c
@@ -502,7 +502,7 @@ void x86_exception(struct eregs *info)
}
#else /* !CONFIG_GDB_STUB */
#define MDUMP_SIZE 0x80
- unsigned int logical_processor = 0;
+ int logical_processor = 0;
#if ENV_RAMSTAGE
logical_processor = cpu_index();
diff --git a/src/arch/x86/include/arch/cpu.h b/src/arch/x86/include/arch/cpu.h
index 481ee9d8e013..078ea1748b05 100644
--- a/src/arch/x86/include/arch/cpu.h
+++ b/src/arch/x86/include/arch/cpu.h
@@ -379,6 +379,6 @@ uint32_t cpu_get_feature_flags_edx(void);
* Hence new logic to use cpuid to fetch lapic id and matches with
* cpus_default_apic_id[] variable to return correct cpu_index().
*/
-unsigned long cpu_index(void);
+int cpu_index(void);
#endif /* ARCH_CPU_H */
diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c
index 8957515540c1..b7b8fe2afaf2 100644
--- a/src/cpu/x86/mp_init.c
+++ b/src/cpu/x86/mp_init.c
@@ -870,13 +870,20 @@ static int run_ap_work(struct mp_callback *val, long expire_us)
int i;
int cpus_accepted;
struct stopwatch sw;
- int cur_cpu = cpu_index();
+ int cur_cpu;
if (!CONFIG(PARALLEL_MP_AP_WORK)) {
printk(BIOS_ERR, "APs already parked. PARALLEL_MP_AP_WORK not selected.\n");
return -1;
}
+ cur_cpu = cpu_index();
+
+ if (cur_cpu < 0) {
+ printk(BIOS_ERR, "Invalid CPU index.\n");
+ return -1;
+ }
+
/* Signal to all the APs to run the func. */
for (i = 0; i < ARRAY_SIZE(ap_callbacks); i++) {
if (cur_cpu == i)
@@ -918,6 +925,12 @@ static void ap_wait_for_instruction(void)
return;
cur_cpu = cpu_index();
+
+ if (cur_cpu < 0) {
+ printk(BIOS_ERR, "Invalid CPU index.\n");
+ return;
+ }
+
per_cpu_slot = &ap_callbacks[cur_cpu];
while (1) {
diff --git a/src/cpu/x86/pae/pgtbl.c b/src/cpu/x86/pae/pgtbl.c
index 062ee402f12d..9c921342f102 100644
--- a/src/cpu/x86/pae/pgtbl.c
+++ b/src/cpu/x86/pae/pgtbl.c
@@ -116,12 +116,12 @@ void *map_2M_page(unsigned long page)
static struct pg_table pgtbl[CONFIG_MAX_CPUS]
__attribute__((aligned(4096)));
static unsigned long mapped_window[CONFIG_MAX_CPUS];
- unsigned long index;
+ int index;
unsigned long window;
void *result;
int i;
index = cpu_index();
- if (index >= CONFIG_MAX_CPUS)
+ if (index < 0)
return MAPPING_ERROR;
window = page >> 10;
if (window != mapped_window[index]) {
diff --git a/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c b/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
index cdc98e06deca..e26701b0991f 100644
--- a/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
+++ b/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
@@ -45,6 +45,9 @@ static efi_return_status_t mp_get_processor_info(const
efi_uintn_t processor_number,
efi_processor_information *processor_info_buffer)
{
+ if (cpu_index() < 0)
+ return FSP_DEVICE_ERROR;
+
if (processor_info_buffer == NULL)
return FSP_INVALID_PARAMETER;
@@ -68,6 +71,9 @@ static efi_return_status_t mp_startup_all_aps(const
efi_ap_procedure procedure, efi_boolean_t ignored3,
efi_uintn_t timeout_usec, void *argument)
{
+ if (cpu_index() < 0)
+ return FSP_DEVICE_ERROR;
+
if (procedure == NULL)
return FSP_INVALID_PARAMETER;
@@ -85,6 +91,9 @@ static efi_return_status_t mp_startup_this_ap(const
efi_ap_procedure procedure, efi_uintn_t processor_number,
efi_uintn_t timeout_usec, void *argument)
{
+ if (cpu_index() < 0)
+ return FSP_DEVICE_ERROR;
+
if (processor_number > get_cpu_count())
return FSP_NOT_FOUND;