Commit 965194c1 authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar

x86: max_low_pfn_mapped fix, #2

tighten the boundary checks around max_low_pfn_mapped - dont overmap
nor undermap into holes.

also print out tseg for AMD cpus, for diagnostic purposes.
(this is an SMM area, and we split up any big mappings around that area)
Signed-off-by: default avatarYinghai Lu <yhlu.kernel@gmail.com>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 7ab073b6
...@@ -200,6 +200,7 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) ...@@ -200,6 +200,7 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
* benefit in doing so. * benefit in doing so.
*/ */
if (!rdmsrl_safe(MSR_K8_TSEG_ADDR, &tseg)) { if (!rdmsrl_safe(MSR_K8_TSEG_ADDR, &tseg)) {
printk(KERN_DEBUG "tseg: %010llx\n", tseg);
if ((tseg>>PMD_SHIFT) < if ((tseg>>PMD_SHIFT) <
(max_low_pfn_mapped>>(PMD_SHIFT-PAGE_SHIFT)) || (max_low_pfn_mapped>>(PMD_SHIFT-PAGE_SHIFT)) ||
((tseg>>PMD_SHIFT) < ((tseg>>PMD_SHIFT) <
......
...@@ -658,11 +658,11 @@ static int cpa_process_alias(struct cpa_data *cpa) ...@@ -658,11 +658,11 @@ static int cpa_process_alias(struct cpa_data *cpa)
struct cpa_data alias_cpa; struct cpa_data alias_cpa;
int ret = 0; int ret = 0;
if (cpa->pfn > max_pfn_mapped) if (cpa->pfn >= max_pfn_mapped)
return 0; return 0;
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
if (cpa->pfn > max_low_pfn_mapped && cpa->pfn < (1UL<<(32-PAGE_SHIFT))) if (cpa->pfn >= max_low_pfn_mapped && cpa->pfn < (1UL<<(32-PAGE_SHIFT)))
return 0; return 0;
#endif #endif
/* /*
......
...@@ -449,8 +449,8 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, ...@@ -449,8 +449,8 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
if (retval < 0) if (retval < 0)
return 0; return 0;
if (((pfn <= max_low_pfn_mapped) || if (((pfn < max_low_pfn_mapped) ||
(pfn >= (1UL<<(32 - PAGE_SHIFT)) && pfn <= max_pfn_mapped)) && (pfn >= (1UL<<(32 - PAGE_SHIFT)) && pfn < max_pfn_mapped)) &&
ioremap_change_attr((unsigned long)__va(offset), size, flags) < 0) { ioremap_change_attr((unsigned long)__va(offset), size, flags) < 0) {
free_memtype(offset, offset + size); free_memtype(offset, offset + size);
printk(KERN_INFO printk(KERN_INFO
......
...@@ -334,9 +334,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, ...@@ -334,9 +334,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
flags = new_flags; flags = new_flags;
} }
if (((vma->vm_pgoff <= max_low_pfn_mapped) || if (((vma->vm_pgoff < max_low_pfn_mapped) ||
(vma->vm_pgoff >= (1UL<<(32 - PAGE_SHIFT)) && (vma->vm_pgoff >= (1UL<<(32 - PAGE_SHIFT)) &&
vma->vm_pgoff <= max_pfn_mapped)) && vma->vm_pgoff < max_pfn_mapped)) &&
ioremap_change_attr((unsigned long)__va(addr), len, flags)) { ioremap_change_attr((unsigned long)__va(addr), len, flags)) {
free_memtype(addr, addr + len); free_memtype(addr, addr + len);
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment