Ignore:
Timestamp:
Apr 21, 2017, 4:28:29 AM (2 months ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.4/drivers/char/mem.c

    r28606 r31885  
    6060
    6161#ifdef CONFIG_STRICT_DEVMEM
     62static inline int page_is_allowed(unsigned long pfn)
     63{
     64        return devmem_is_allowed(pfn);
     65}
    6266static inline int range_is_allowed(unsigned long pfn, unsigned long size)
    6367{
     
    7983}
    8084#else
     85static inline int page_is_allowed(unsigned long pfn)
     86{
     87        return 1;
     88}
    8189static inline int range_is_allowed(unsigned long pfn, unsigned long size)
    8290{
     
    126134        while (count > 0) {
    127135                unsigned long remaining;
     136                int allowed;
    128137
    129138                sz = size_inside_page(p, count);
    130139
    131                 if (!range_is_allowed(p >> PAGE_SHIFT, count))
     140                allowed = page_is_allowed(p >> PAGE_SHIFT);
     141                if (!allowed)
    132142                        return -EPERM;
    133 
    134                 /*
    135                  * On ia64 if a page has been mapped somewhere as uncached, then
    136                  * it must also be accessed uncached by the kernel or data
    137                  * corruption may occur.
    138                  */
    139                 ptr = xlate_dev_mem_ptr(p);
    140                 if (!ptr)
    141                         return -EFAULT;
    142 
    143                 remaining = copy_to_user(buf, ptr, sz);
    144                 unxlate_dev_mem_ptr(p, ptr);
     143                if (allowed == 2) {
     144                        /* Show zeros for restricted memory. */
     145                        remaining = clear_user(buf, sz);
     146                } else {
     147                        /*
     148                         * On ia64 if a page has been mapped somewhere as
     149                         * uncached, then it must also be accessed uncached
     150                         * by the kernel or data corruption may occur.
     151                         */
     152                        ptr = xlate_dev_mem_ptr(p);
     153                        if (!ptr)
     154                                return -EFAULT;
     155
     156                        remaining = copy_to_user(buf, ptr, sz);
     157
     158                        unxlate_dev_mem_ptr(p, ptr);
     159                }
     160
    145161                if (remaining)
    146162                        return -EFAULT;
     
    185201
    186202        while (count > 0) {
     203                int allowed;
     204
    187205                sz = size_inside_page(p, count);
    188206
    189                 if (!range_is_allowed(p >> PAGE_SHIFT, sz))
     207                allowed = page_is_allowed(p >> PAGE_SHIFT);
     208                if (!allowed)
    190209                        return -EPERM;
    191210
    192                 /*
    193                  * On ia64 if a page has been mapped somewhere as uncached, then
    194                  * it must also be accessed uncached by the kernel or data
    195                  * corruption may occur.
    196                  */
    197                 ptr = xlate_dev_mem_ptr(p);
    198                 if (!ptr) {
    199                         if (written)
    200                                 break;
    201                         return -EFAULT;
    202                 }
    203 
    204                 copied = copy_from_user(ptr, buf, sz);
    205                 unxlate_dev_mem_ptr(p, ptr);
    206                 if (copied) {
    207                         written += sz - copied;
    208                         if (written)
    209                                 break;
    210                         return -EFAULT;
     211                /* Skip actual writing when a page is marked as restricted. */
     212                if (allowed == 1) {
     213                        /*
     214                         * On ia64 if a page has been mapped somewhere as
     215                         * uncached, then it must also be accessed uncached
     216                         * by the kernel or data corruption may occur.
     217                         */
     218                        ptr = xlate_dev_mem_ptr(p);
     219                        if (!ptr) {
     220                                if (written)
     221                                        break;
     222                                return -EFAULT;
     223                        }
     224
     225                        copied = copy_from_user(ptr, buf, sz);
     226                        unxlate_dev_mem_ptr(p, ptr);
     227                        if (copied) {
     228                                written += sz - copied;
     229                                if (written)
     230                                        break;
     231                                return -EFAULT;
     232                        }
    211233                }
    212234
Note: See TracChangeset for help on using the changeset viewer.