diff options
Diffstat (limited to 'arch/x86/mm/init.c')
-rw-r--r-- | arch/x86/mm/init.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 22af912d66d2..889e7619a091 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
@@ -643,21 +643,40 @@ void __init init_mem_mapping(void) | |||
643 | * devmem_is_allowed() checks to see if /dev/mem access to a certain address | 643 | * devmem_is_allowed() checks to see if /dev/mem access to a certain address |
644 | * is valid. The argument is a physical page number. | 644 | * is valid. The argument is a physical page number. |
645 | * | 645 | * |
646 | * | 646 | * On x86, access has to be given to the first megabyte of RAM because that |
647 | * On x86, access has to be given to the first megabyte of ram because that area | 647 | * area traditionally contains BIOS code and data regions used by X, dosemu, |
648 | * contains BIOS code and data regions used by X and dosemu and similar apps. | 648 | * and similar apps. Since they map the entire memory range, the whole range |
649 | * Access has to be given to non-kernel-ram areas as well, these contain the PCI | 649 | * must be allowed (for mapping), but any areas that would otherwise be |
650 | * mmio resources as well as potential bios/acpi data regions. | 650 | * disallowed are flagged as being "zero filled" instead of rejected. |
651 | * Access has to be given to non-kernel-ram areas as well, these contain the | ||
652 | * PCI mmio resources as well as potential bios/acpi data regions. | ||
651 | */ | 653 | */ |
652 | int devmem_is_allowed(unsigned long pagenr) | 654 | int devmem_is_allowed(unsigned long pagenr) |
653 | { | 655 | { |
654 | if (pagenr < 256) | 656 | if (page_is_ram(pagenr)) { |
655 | return 1; | 657 | /* |
656 | if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) | 658 | * For disallowed memory regions in the low 1MB range, |
659 | * request that the page be shown as all zeros. | ||
660 | */ | ||
661 | if (pagenr < 256) | ||
662 | return 2; | ||
663 | |||
664 | return 0; | ||
665 | } | ||
666 | |||
667 | /* | ||
668 | * This must follow RAM test, since System RAM is considered a | ||
669 | * restricted resource under CONFIG_STRICT_IOMEM. | ||
670 | */ | ||
671 | if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) { | ||
672 | /* Low 1MB bypasses iomem restrictions. */ | ||
673 | if (pagenr < 256) | ||
674 | return 1; | ||
675 | |||
657 | return 0; | 676 | return 0; |
658 | if (!page_is_ram(pagenr)) | 677 | } |
659 | return 1; | 678 | |
660 | return 0; | 679 | return 1; |
661 | } | 680 | } |
662 | 681 | ||
663 | void free_init_pages(char *what, unsigned long begin, unsigned long end) | 682 | void free_init_pages(char *what, unsigned long begin, unsigned long end) |