Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 24032
b: refs/heads/master
c: 136939a
h: refs/heads/master
v: v3
  • Loading branch information
Bjorn Helgaas authored and Linus Torvalds committed Mar 26, 2006
1 parent 5049efa commit c6c50ac
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3ed3bce846abc7ef460104b461cac793e41afe5e
refs/heads/master: 136939a2b5aa4302281215745ccd567e1df2e8d4
41 changes: 20 additions & 21 deletions trunk/arch/ia64/kernel/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,27 +677,34 @@ EXPORT_SYMBOL(efi_mem_attributes);
/*
* Determines whether the memory at phys_addr supports the desired
* attribute (WB, UC, etc). If this returns 1, the caller can safely
* access *size bytes at phys_addr with the specified attribute.
* access size bytes at phys_addr with the specified attribute.
*/
static int
efi_mem_attribute_range (unsigned long phys_addr, unsigned long *size, u64 attr)
int
efi_mem_attribute_range (unsigned long phys_addr, unsigned long size, u64 attr)
{
unsigned long end = phys_addr + size;
efi_memory_desc_t *md = efi_memory_descriptor(phys_addr);
unsigned long md_end;

if (!md || (md->attribute & attr) != attr)
/*
* Some firmware doesn't report MMIO regions in the EFI memory
* map. The Intel BigSur (a.k.a. HP i2000) has this problem.
* On those platforms, we have to assume UC is valid everywhere.
*/
if (!md || (md->attribute & attr) != attr) {
if (attr == EFI_MEMORY_UC && !efi_memmap_has_mmio())
return 1;
return 0;
}

do {
md_end = efi_md_end(md);
if (phys_addr + *size <= md_end)
unsigned long md_end = efi_md_end(md);

if (end <= md_end)
return 1;

md = efi_memory_descriptor(md_end);
if (!md || (md->attribute & attr) != attr) {
*size = md_end - phys_addr;
return 1;
}
if (!md || (md->attribute & attr) != attr)
return 0;
} while (md);
return 0;
}
Expand All @@ -708,7 +715,7 @@ efi_mem_attribute_range (unsigned long phys_addr, unsigned long *size, u64 attr)
* control access size.
*/
int
valid_phys_addr_range (unsigned long phys_addr, unsigned long *size)
valid_phys_addr_range (unsigned long phys_addr, unsigned long size)
{
return efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_WB);
}
Expand All @@ -723,22 +730,14 @@ valid_phys_addr_range (unsigned long phys_addr, unsigned long *size)
* because that doesn't appear in the boot-time EFI memory map.
*/
int
valid_mmap_phys_addr_range (unsigned long phys_addr, unsigned long *size)
valid_mmap_phys_addr_range (unsigned long phys_addr, unsigned long size)
{
if (efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_WB))
return 1;

if (efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_UC))
return 1;

/*
* Some firmware doesn't report MMIO regions in the EFI memory map.
* The Intel BigSur (a.k.a. HP i2000) has this problem. In this
* case, we can't use the EFI memory map to validate mmap requests.
*/
if (!efi_memmap_has_mmio())
return 1;

return 0;
}

Expand Down
18 changes: 6 additions & 12 deletions trunk/drivers/char/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,21 +88,15 @@ static inline int uncached_access(struct file *file, unsigned long addr)
}

#ifndef ARCH_HAS_VALID_PHYS_ADDR_RANGE
static inline int valid_phys_addr_range(unsigned long addr, size_t *count)
static inline int valid_phys_addr_range(unsigned long addr, size_t count)
{
unsigned long end_mem;

end_mem = __pa(high_memory);
if (addr >= end_mem)
if (addr + count > __pa(high_memory))
return 0;

if (*count > end_mem - addr)
*count = end_mem - addr;

return 1;
}

static inline int valid_mmap_phys_addr_range(unsigned long addr, size_t *size)
static inline int valid_mmap_phys_addr_range(unsigned long addr, size_t size)
{
return 1;
}
Expand All @@ -119,7 +113,7 @@ static ssize_t read_mem(struct file * file, char __user * buf,
ssize_t read, sz;
char *ptr;

if (!valid_phys_addr_range(p, &count))
if (!valid_phys_addr_range(p, count))
return -EFAULT;
read = 0;
#ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED
Expand Down Expand Up @@ -177,7 +171,7 @@ static ssize_t write_mem(struct file * file, const char __user * buf,
unsigned long copied;
void *ptr;

if (!valid_phys_addr_range(p, &count))
if (!valid_phys_addr_range(p, count))
return -EFAULT;

written = 0;
Expand Down Expand Up @@ -249,7 +243,7 @@ static int mmap_mem(struct file * file, struct vm_area_struct * vma)
{
size_t size = vma->vm_end - vma->vm_start;

if (!valid_mmap_phys_addr_range(vma->vm_pgoff << PAGE_SHIFT, &size))
if (!valid_mmap_phys_addr_range(vma->vm_pgoff << PAGE_SHIFT, size))
return -EINVAL;

vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff,
Expand Down
4 changes: 2 additions & 2 deletions trunk/include/asm-ia64/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ phys_to_virt (unsigned long address)
}

#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
extern int valid_phys_addr_range (unsigned long addr, size_t *count); /* efi.c */
extern int valid_mmap_phys_addr_range (unsigned long addr, size_t *count);
extern int valid_phys_addr_range (unsigned long addr, size_t count); /* efi.c */
extern int valid_mmap_phys_addr_range (unsigned long addr, size_t count);

/*
* The following two macros are deprecated and scheduled for removal.
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,8 @@ extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if pos
extern u64 efi_get_iobase (void);
extern u32 efi_mem_type (unsigned long phys_addr);
extern u64 efi_mem_attributes (unsigned long phys_addr);
extern int efi_mem_attribute_range (unsigned long phys_addr, unsigned long size,
u64 attr);
extern int __init efi_uart_console_only (void);
extern void efi_initialize_iomem_resources(struct resource *code_resource,
struct resource *data_resource);
Expand Down

0 comments on commit c6c50ac

Please sign in to comment.