Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c83a9d5e authored by Fenghua Yu's avatar Fenghua Yu Committed by H. Peter Anvin
Browse files

x86-32, microcode_intel_early: Fix crash with CONFIG_DEBUG_VIRTUAL



In 32-bit, __pa_symbol() in CONFIG_DEBUG_VIRTUAL accesses kernel data
(e.g.  max_low_pfn) that not only hasn't been setup yet in such early
boot phase, but since we are in linear mode, cannot even be detected
as uninitialized.

Thus, use __pa_nodebug() rather than __pa_symbol() to get a global
symbol's physical address.

Signed-off-by: default avatarFenghua Yu <fenghua.yu@intel.com>
Link: http://lkml.kernel.org/r/1363705484-27645-1-git-send-email-fenghua.yu@intel.com


Reported-and-tested-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 66db3feb
Loading
Loading
Loading
Loading
+13 −13
Original line number Original line Diff line number Diff line
@@ -90,13 +90,13 @@ microcode_phys(struct microcode_intel **mc_saved_tmp,
	struct microcode_intel ***mc_saved;
	struct microcode_intel ***mc_saved;


	mc_saved = (struct microcode_intel ***)
	mc_saved = (struct microcode_intel ***)
		   __pa_symbol(&mc_saved_data->mc_saved);
		   __pa_nodebug(&mc_saved_data->mc_saved);
	for (i = 0; i < mc_saved_data->mc_saved_count; i++) {
	for (i = 0; i < mc_saved_data->mc_saved_count; i++) {
		struct microcode_intel *p;
		struct microcode_intel *p;


		p = *(struct microcode_intel **)
		p = *(struct microcode_intel **)
			__pa(mc_saved_data->mc_saved + i);
			__pa_nodebug(mc_saved_data->mc_saved + i);
		mc_saved_tmp[i] = (struct microcode_intel *)__pa(p);
		mc_saved_tmp[i] = (struct microcode_intel *)__pa_nodebug(p);
	}
	}
}
}
#endif
#endif
@@ -562,7 +562,7 @@ scan_microcode(unsigned long start, unsigned long end,
	struct cpio_data cd;
	struct cpio_data cd;
	long offset = 0;
	long offset = 0;
#ifdef CONFIG_X86_32
#ifdef CONFIG_X86_32
	char *p = (char *)__pa_symbol(ucode_name);
	char *p = (char *)__pa_nodebug(ucode_name);
#else
#else
	char *p = ucode_name;
	char *p = ucode_name;
#endif
#endif
@@ -630,8 +630,8 @@ static void __cpuinit print_ucode(struct ucode_cpu_info *uci)
	if (mc_intel == NULL)
	if (mc_intel == NULL)
		return;
		return;


	delay_ucode_info_p = (int *)__pa_symbol(&delay_ucode_info);
	delay_ucode_info_p = (int *)__pa_nodebug(&delay_ucode_info);
	current_mc_date_p = (int *)__pa_symbol(&current_mc_date);
	current_mc_date_p = (int *)__pa_nodebug(&current_mc_date);


	*delay_ucode_info_p = 1;
	*delay_ucode_info_p = 1;
	*current_mc_date_p = mc_intel->hdr.date;
	*current_mc_date_p = mc_intel->hdr.date;
@@ -741,15 +741,15 @@ load_ucode_intel_bsp(void)
#ifdef CONFIG_X86_32
#ifdef CONFIG_X86_32
	struct boot_params *boot_params_p;
	struct boot_params *boot_params_p;


	boot_params_p = (struct boot_params *)__pa_symbol(&boot_params);
	boot_params_p = (struct boot_params *)__pa_nodebug(&boot_params);
	ramdisk_image = boot_params_p->hdr.ramdisk_image;
	ramdisk_image = boot_params_p->hdr.ramdisk_image;
	ramdisk_size  = boot_params_p->hdr.ramdisk_size;
	ramdisk_size  = boot_params_p->hdr.ramdisk_size;
	initrd_start_early = ramdisk_image;
	initrd_start_early = ramdisk_image;
	initrd_end_early = initrd_start_early + ramdisk_size;
	initrd_end_early = initrd_start_early + ramdisk_size;


	_load_ucode_intel_bsp(
	_load_ucode_intel_bsp(
		(struct mc_saved_data *)__pa_symbol(&mc_saved_data),
		(struct mc_saved_data *)__pa_nodebug(&mc_saved_data),
		(unsigned long *)__pa_symbol(&mc_saved_in_initrd),
		(unsigned long *)__pa_nodebug(&mc_saved_in_initrd),
		initrd_start_early, initrd_end_early, &uci);
		initrd_start_early, initrd_end_early, &uci);
#else
#else
	ramdisk_image = boot_params.hdr.ramdisk_image;
	ramdisk_image = boot_params.hdr.ramdisk_image;
@@ -772,10 +772,10 @@ void __cpuinit load_ucode_intel_ap(void)
	unsigned long *initrd_start_p;
	unsigned long *initrd_start_p;


	mc_saved_in_initrd_p =
	mc_saved_in_initrd_p =
		(unsigned long *)__pa_symbol(mc_saved_in_initrd);
		(unsigned long *)__pa_nodebug(mc_saved_in_initrd);
	mc_saved_data_p = (struct mc_saved_data *)__pa_symbol(&mc_saved_data);
	mc_saved_data_p = (struct mc_saved_data *)__pa_nodebug(&mc_saved_data);
	initrd_start_p = (unsigned long *)__pa_symbol(&initrd_start);
	initrd_start_p = (unsigned long *)__pa_nodebug(&initrd_start);
	initrd_start_addr = (unsigned long)__pa_symbol(*initrd_start_p);
	initrd_start_addr = (unsigned long)__pa_nodebug(*initrd_start_p);
#else
#else
	mc_saved_data_p = &mc_saved_data;
	mc_saved_data_p = &mc_saved_data;
	mc_saved_in_initrd_p = mc_saved_in_initrd;
	mc_saved_in_initrd_p = mc_saved_in_initrd;