On Thu, Sep 21, 2006 at 09:02:37PM +1000, Michael Ellerman wrote:
> On Thu, 2006-09-21 at 10:07 +0530, Sachin P. Sant wrote:
> > Hi
> > 
> > While using dd command to retrive the dump from /dev/oldmem, there comes
> > a rare case where pfn value is zero. In this case the __ioremap() call 
> > returns
> > NULL and hence copying fails.
> > 
> > # dd if=/dev/oldmem of=/dev/null
> > dd: reading `/dev/oldmem': Bad address
> > 0+0 records in
> > 0+0 records out
> > 0 bytes (0 B) copied, 0.000121 seconds, 0.0 kB/s
> > 
> > Attached is a patch to fix this problem. During such rare cases don't call
> > __ioremap() to do the address translation, instead use __va() .
> 
> It's not really rare, it's just when we're reading /dev/oldmem directly.
> 
> We can actually use the __va() trick for the whole linear mapping rather
> than just pfn 0, which saves the ioremap. We also shouldn't really be
> trying to iounmap(__va(0)).
> 

Makes sense. We can take advantage of linear mappings mapped till max_pfn
and avoid ioremap().

> +
> +static size_t copy_oldmem_vaddr(void *vaddr, char *buf, size_t csize,
> +                             unsigned long offset, int userbuf)
> +{
> +     if (userbuf) {
> +             if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) {
> +                     return -EFAULT;
> +             }

Probably you can get rid of above pair of braces as there is only single
statement under if.

>  
> -     if (userbuf) {
> -             if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) {
> -                     iounmap(vaddr);
> -                     return -EFAULT;
> -             }
> -     } else
> -             memcpy(buf, (vaddr + offset), csize);
> +     if (pfn < max_pfn) {

Should this be (pfn <= max_pfn) ?

-Vivek
_______________________________________________
fastboot mailing list
[email protected]
https://lists.osdl.org/mailman/listinfo/fastboot

Reply via email to