|
@@ -328,43 +328,12 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos)
|
|
|
return -EFAULT;
|
|
|
} else if (is_vmalloc_addr((void *)start)) {
|
|
|
char * elf_buf;
|
|
|
- struct vm_struct *m;
|
|
|
- unsigned long curstart = start;
|
|
|
- unsigned long cursize = tsz;
|
|
|
|
|
|
elf_buf = kzalloc(tsz, GFP_KERNEL);
|
|
|
if (!elf_buf)
|
|
|
return -ENOMEM;
|
|
|
-
|
|
|
- read_lock(&vmlist_lock);
|
|
|
- for (m=vmlist; m && cursize; m=m->next) {
|
|
|
- unsigned long vmstart;
|
|
|
- unsigned long vmsize;
|
|
|
- unsigned long msize = m->size - PAGE_SIZE;
|
|
|
-
|
|
|
- if (((unsigned long)m->addr + msize) <
|
|
|
- curstart)
|
|
|
- continue;
|
|
|
- if ((unsigned long)m->addr > (curstart +
|
|
|
- cursize))
|
|
|
- break;
|
|
|
- vmstart = (curstart < (unsigned long)m->addr ?
|
|
|
- (unsigned long)m->addr : curstart);
|
|
|
- if (((unsigned long)m->addr + msize) >
|
|
|
- (curstart + cursize))
|
|
|
- vmsize = curstart + cursize - vmstart;
|
|
|
- else
|
|
|
- vmsize = (unsigned long)m->addr +
|
|
|
- msize - vmstart;
|
|
|
- curstart = vmstart + vmsize;
|
|
|
- cursize -= vmsize;
|
|
|
- /* don't dump ioremap'd stuff! (TA) */
|
|
|
- if (m->flags & VM_IOREMAP)
|
|
|
- continue;
|
|
|
- memcpy(elf_buf + (vmstart - start),
|
|
|
- (char *)vmstart, vmsize);
|
|
|
- }
|
|
|
- read_unlock(&vmlist_lock);
|
|
|
+ vread(elf_buf, (char *)start, tsz);
|
|
|
+ /* we have to zero-fill user buffer even if no read */
|
|
|
if (copy_to_user(buffer, elf_buf, tsz)) {
|
|
|
kfree(elf_buf);
|
|
|
return -EFAULT;
|