From 973a46c942331336408705516dc0b7b4d1f398df Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Thu, 23 Oct 2003 00:17:48 -0700 Subject: [PATCH] [PATCH] ia64: prevent "dd if=/dev/mem" crash The drivers/char/mem.c change was accepted, so here's the ia64-specific part. --- arch/ia64/kernel/efi.c | 26 ++++++++++++++++++++++++++ include/asm-ia64/io.h | 3 +++ 2 files changed, 29 insertions(+) diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index f9d37a739fe5c..cd16781c5dda5 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 297efb06c3478..a4c79e29438c4 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. -- 2.53.0