{arch,cpu}/x86, drivers/intel: Restore cpu_index error handling
Previously cpu_index() always succeeded, but since commit095c931
(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 commit7c712bb
(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>
This commit is contained in:
parent
2e8188aa13
commit
bc674765a9
|
@ -350,7 +350,7 @@ void arch_bootstate_coreboot_exit(void)
|
||||||
* Hence new logic to use cpuid to fetch lapic id and matches with
|
* Hence new logic to use cpuid to fetch lapic id and matches with
|
||||||
* cpus_default_apic_id[] variable to return correct cpu_index().
|
* cpus_default_apic_id[] variable to return correct cpu_index().
|
||||||
*/
|
*/
|
||||||
unsigned long cpu_index(void)
|
int cpu_index(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int lapic_id = initial_lapicid();
|
int lapic_id = initial_lapicid();
|
||||||
|
|
|
@ -502,7 +502,7 @@ void x86_exception(struct eregs *info)
|
||||||
}
|
}
|
||||||
#else /* !CONFIG_GDB_STUB */
|
#else /* !CONFIG_GDB_STUB */
|
||||||
#define MDUMP_SIZE 0x80
|
#define MDUMP_SIZE 0x80
|
||||||
unsigned int logical_processor = 0;
|
int logical_processor = 0;
|
||||||
|
|
||||||
#if ENV_RAMSTAGE
|
#if ENV_RAMSTAGE
|
||||||
logical_processor = cpu_index();
|
logical_processor = cpu_index();
|
||||||
|
|
|
@ -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
|
* Hence new logic to use cpuid to fetch lapic id and matches with
|
||||||
* cpus_default_apic_id[] variable to return correct cpu_index().
|
* cpus_default_apic_id[] variable to return correct cpu_index().
|
||||||
*/
|
*/
|
||||||
unsigned long cpu_index(void);
|
int cpu_index(void);
|
||||||
|
|
||||||
#endif /* ARCH_CPU_H */
|
#endif /* ARCH_CPU_H */
|
||||||
|
|
|
@ -870,13 +870,20 @@ static int run_ap_work(struct mp_callback *val, long expire_us)
|
||||||
int i;
|
int i;
|
||||||
int cpus_accepted;
|
int cpus_accepted;
|
||||||
struct stopwatch sw;
|
struct stopwatch sw;
|
||||||
int cur_cpu = cpu_index();
|
int cur_cpu;
|
||||||
|
|
||||||
if (!CONFIG(PARALLEL_MP_AP_WORK)) {
|
if (!CONFIG(PARALLEL_MP_AP_WORK)) {
|
||||||
printk(BIOS_ERR, "APs already parked. PARALLEL_MP_AP_WORK not selected.\n");
|
printk(BIOS_ERR, "APs already parked. PARALLEL_MP_AP_WORK not selected.\n");
|
||||||
return -1;
|
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. */
|
/* Signal to all the APs to run the func. */
|
||||||
for (i = 0; i < ARRAY_SIZE(ap_callbacks); i++) {
|
for (i = 0; i < ARRAY_SIZE(ap_callbacks); i++) {
|
||||||
if (cur_cpu == i)
|
if (cur_cpu == i)
|
||||||
|
@ -918,6 +925,12 @@ static void ap_wait_for_instruction(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cur_cpu = cpu_index();
|
cur_cpu = cpu_index();
|
||||||
|
|
||||||
|
if (cur_cpu < 0) {
|
||||||
|
printk(BIOS_ERR, "Invalid CPU index.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
per_cpu_slot = &ap_callbacks[cur_cpu];
|
per_cpu_slot = &ap_callbacks[cur_cpu];
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
|
@ -116,12 +116,12 @@ void *map_2M_page(unsigned long page)
|
||||||
static struct pg_table pgtbl[CONFIG_MAX_CPUS]
|
static struct pg_table pgtbl[CONFIG_MAX_CPUS]
|
||||||
__attribute__((aligned(4096)));
|
__attribute__((aligned(4096)));
|
||||||
static unsigned long mapped_window[CONFIG_MAX_CPUS];
|
static unsigned long mapped_window[CONFIG_MAX_CPUS];
|
||||||
unsigned long index;
|
int index;
|
||||||
unsigned long window;
|
unsigned long window;
|
||||||
void *result;
|
void *result;
|
||||||
int i;
|
int i;
|
||||||
index = cpu_index();
|
index = cpu_index();
|
||||||
if (index >= CONFIG_MAX_CPUS)
|
if (index < 0)
|
||||||
return MAPPING_ERROR;
|
return MAPPING_ERROR;
|
||||||
window = page >> 10;
|
window = page >> 10;
|
||||||
if (window != mapped_window[index]) {
|
if (window != mapped_window[index]) {
|
||||||
|
|
|
@ -45,6 +45,9 @@ static efi_return_status_t mp_get_processor_info(const
|
||||||
efi_uintn_t processor_number,
|
efi_uintn_t processor_number,
|
||||||
efi_processor_information *processor_info_buffer)
|
efi_processor_information *processor_info_buffer)
|
||||||
{
|
{
|
||||||
|
if (cpu_index() < 0)
|
||||||
|
return FSP_DEVICE_ERROR;
|
||||||
|
|
||||||
if (processor_info_buffer == NULL)
|
if (processor_info_buffer == NULL)
|
||||||
return FSP_INVALID_PARAMETER;
|
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_ap_procedure procedure, efi_boolean_t ignored3,
|
||||||
efi_uintn_t timeout_usec, void *argument)
|
efi_uintn_t timeout_usec, void *argument)
|
||||||
{
|
{
|
||||||
|
if (cpu_index() < 0)
|
||||||
|
return FSP_DEVICE_ERROR;
|
||||||
|
|
||||||
if (procedure == NULL)
|
if (procedure == NULL)
|
||||||
return FSP_INVALID_PARAMETER;
|
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_ap_procedure procedure, efi_uintn_t processor_number,
|
||||||
efi_uintn_t timeout_usec, void *argument)
|
efi_uintn_t timeout_usec, void *argument)
|
||||||
{
|
{
|
||||||
|
if (cpu_index() < 0)
|
||||||
|
return FSP_DEVICE_ERROR;
|
||||||
|
|
||||||
if (processor_number > get_cpu_count())
|
if (processor_number > get_cpu_count())
|
||||||
return FSP_NOT_FOUND;
|
return FSP_NOT_FOUND;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue