]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] ia64: prevent "dd if=/dev/mem" crash
authorBjorn Helgaas <bjorn.helgaas@hp.com>
Thu, 23 Oct 2003 07:17:48 +0000 (00:17 -0700)
committerDavid Mosberger <davidm@tiger.hpl.hp.com>
Thu, 23 Oct 2003 07:17:48 +0000 (00:17 -0700)
The drivers/char/mem.c change was accepted, so here's the
ia64-specific part.

arch/ia64/kernel/efi.c
include/asm-ia64/io.h

index f9d37a739fe5ccd50d4fd14d70a48f6ad6f3e678..cd16781c5dda5f41143c574556d2099c0842c8eb 100644 (file)
@@ -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)
 {
index 297efb06c3478cadffb27a2875f14e60e5fc74fa..a4c79e29438c47f42f8d09c583959a4d915ef5f2 100644 (file)
@@ -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 <asm/pci.h> instead.