mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 17:25:35 +03:00
tegra_bootloader_debug: fix crash in absence of bootloader parameters
In absence of bl_debug_data parameter passed from Bootloader, value of tegra_bl_debug_data_start will be 0. This triggers a kernel panic on systems where parameter is not specified and the module is loaded. Fix this by first checking tegra_bl_debug_data_start and tegra_bl_debug_data_size before accessing them. Also add a check upfront to check if mandatory bootloader parameter tegra_bl_prof_start is passed or not. If this parameter is not passed, bail out the driver initialization. Bug 3996651 Change-Id: Ibb78d6cefdae1f79ecb09836b833899deacb03ce Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2900710 Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
6496e807ed
commit
cec42e4059
@@ -325,7 +325,15 @@ static int __init tegra_bootloader_debuginit(void)
|
|||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
void __iomem *ptr_bl_debug_data_start = NULL;
|
void __iomem *ptr_bl_debug_data_start = NULL;
|
||||||
void __iomem *ptr_bl_boot_cfg_start = NULL;
|
void __iomem *ptr_bl_boot_cfg_start = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!tegra_bl_prof_start || !tegra_bl_prof_size) {
|
||||||
|
pr_err("%s: command line parameter bl_prof_dataptr not initialized\n",
|
||||||
|
module_name);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_FS
|
||||||
if (debugfs_initialized()) {
|
if (debugfs_initialized()) {
|
||||||
bl_debug_node = debugfs_create_dir(dir_name, NULL);
|
bl_debug_node = debugfs_create_dir(dir_name, NULL);
|
||||||
|
|
||||||
@@ -364,26 +372,28 @@ static int __init tegra_bootloader_debuginit(void)
|
|||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
tegra_bl_mapped_debug_data_start =
|
if (tegra_bl_debug_data_start && tegra_bl_debug_data_size) {
|
||||||
phys_to_virt(tegra_bl_debug_data_start);
|
tegra_bl_mapped_debug_data_start =
|
||||||
if (tegra_bl_debug_data_start != 0
|
phys_to_virt(tegra_bl_debug_data_start);
|
||||||
&& !pfn_valid(__phys_to_pfn(tegra_bl_debug_data_start))) {
|
if (!pfn_valid(__phys_to_pfn(tegra_bl_debug_data_start))) {
|
||||||
ptr_bl_debug_data_start = ioremap(tegra_bl_debug_data_start,
|
ptr_bl_debug_data_start = ioremap(tegra_bl_debug_data_start,
|
||||||
tegra_bl_debug_data_size);
|
tegra_bl_debug_data_size);
|
||||||
|
|
||||||
WARN_ON(!ptr_bl_debug_data_start);
|
WARN_ON(!ptr_bl_debug_data_start);
|
||||||
if (!ptr_bl_debug_data_start) {
|
if (!ptr_bl_debug_data_start) {
|
||||||
pr_err("%s: Failed to map tegra_bl_debug_data_start%08x\n",
|
pr_err("%s: Failed to map tegra_bl_debug_data_start%08x\n",
|
||||||
__func__, (unsigned int)tegra_bl_debug_data_start);
|
__func__, (unsigned int)tegra_bl_debug_data_start);
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
pr_info("Remapped tegra_bl_debug_data_start(0x%llx)"
|
||||||
|
" to address(0x%llx), size(0x%llx)\n",
|
||||||
|
(u64)tegra_bl_debug_data_start,
|
||||||
|
(__force u64)ptr_bl_debug_data_start,
|
||||||
|
(u64)tegra_bl_debug_data_size);
|
||||||
|
tegra_bl_mapped_debug_data_start =
|
||||||
|
(__force void *)ptr_bl_debug_data_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_info("Remapped tegra_bl_debug_data_start(0x%llx)"
|
|
||||||
" to address(0x%llx), size(0x%llx)\n",
|
|
||||||
(u64)tegra_bl_debug_data_start,
|
|
||||||
(__force u64)ptr_bl_debug_data_start,
|
|
||||||
(u64)tegra_bl_debug_data_size);
|
|
||||||
tegra_bl_mapped_debug_data_start = (__force void *)ptr_bl_debug_data_start;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -440,8 +450,7 @@ static int __init tegra_bootloader_debuginit(void)
|
|||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tegra_bl_prof_start != 0 && tegra_bl_prof_size != 0 &&
|
if (!pfn_valid(__phys_to_pfn(tegra_bl_prof_start))) {
|
||||||
!pfn_valid(__phys_to_pfn(tegra_bl_prof_start))) {
|
|
||||||
ptr_bl_prof_carveout = ioremap(tegra_bl_prof_start, tegra_bl_prof_size);
|
ptr_bl_prof_carveout = ioremap(tegra_bl_prof_start, tegra_bl_prof_size);
|
||||||
if (!ptr_bl_prof_carveout) {
|
if (!ptr_bl_prof_carveout) {
|
||||||
pr_err("%s: failed to map tegra_bl_prof_start\n", __func__);
|
pr_err("%s: failed to map tegra_bl_prof_start\n", __func__);
|
||||||
|
|||||||
Reference in New Issue
Block a user