From: Bjorn Helgaas Date: Thu, 23 Oct 2003 07:17:48 +0000 (-0700) Subject: [PATCH] ia64: prevent "dd if=/dev/mem" crash X-Git-Tag: v2.6.0-test9~1^2~4 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=973a46c942331336408705516dc0b7b4d1f398df;p=history.git [PATCH] ia64: prevent "dd if=/dev/mem" crash The drivers/char/mem.c change was accepted, so here's the ia64-specific part. --- diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index f9d37a739fe5..cd16781c5dda 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c @@ -711,6 +711,32 @@ efi_mem_attributes (unsigned long phys_addr) return 0; } +int +valid_phys_addr_range (unsigned long phys_addr, unsigned long *size) +{ + void *efi_map_start, *efi_map_end, *p; + efi_memory_desc_t *md; + u64 efi_desc_size; + + efi_map_start = __va(ia64_boot_param->efi_memmap); + efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size; + efi_desc_size = ia64_boot_param->efi_memdesc_size; + + for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) { + md = p; + + if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT)) { + if (!(md->attribute & EFI_MEMORY_WB)) + return 0; + + if (*size > md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - phys_addr) + *size = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - phys_addr; + return 1; + } + } + return 0; +} + static void __exit efivars_exit (void) { diff --git a/include/asm-ia64/io.h b/include/asm-ia64/io.h index 297efb06c347..a4c79e29438c 100644 --- a/include/asm-ia64/io.h +++ b/include/asm-ia64/io.h @@ -72,6 +72,9 @@ phys_to_virt (unsigned long address) return (void *) (address + PAGE_OFFSET); } +#define ARCH_HAS_VALID_PHYS_ADDR_RANGE +extern int valid_phys_addr_range (unsigned long addr, size_t *count); /* efi.c */ + /* * The following two macros are deprecated and scheduled for removal. * Please use the PCI-DMA interface defined in instead.