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

update

File:
1 edited

Legend:

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

    r31574 r31885  
    6161
    6262#ifdef CONFIG_STRICT_DEVMEM
     63static inline int page_is_allowed(unsigned long pfn)
     64{
     65        return devmem_is_allowed(pfn);
     66}
    6367static inline int range_is_allowed(unsigned long pfn, unsigned long size)
    6468{
     
    7680}
    7781#else
     82static inline int page_is_allowed(unsigned long pfn)
     83{
     84        return 1;
     85}
    7886static inline int range_is_allowed(unsigned long pfn, unsigned long size)
    7987{
     
    123131        while (count > 0) {
    124132                unsigned long remaining;
     133                int allowed;
    125134
    126135                sz = size_inside_page(p, count);
    127136
    128                 if (!range_is_allowed(p >> PAGE_SHIFT, count))
     137                allowed = page_is_allowed(p >> PAGE_SHIFT);
     138                if (!allowed)
    129139                        return -EPERM;
    130 
    131                 /*
    132                  * On ia64 if a page has been mapped somewhere as uncached, then
    133                  * it must also be accessed uncached by the kernel or data
    134                  * corruption may occur.
    135                  */
    136                 ptr = xlate_dev_mem_ptr(p);
    137                 if (!ptr)
    138                         return -EFAULT;
    139 
    140                 remaining = copy_to_user(buf, ptr, sz);
    141                 unxlate_dev_mem_ptr(p, ptr);
     140                if (allowed == 2) {
     141                        /* Show zeros for restricted memory. */
     142                        remaining = clear_user(buf, sz);
     143                } else {
     144                        /*
     145                         * On ia64 if a page has been mapped somewhere as
     146                         * uncached, then it must also be accessed uncached
     147                         * by the kernel or data corruption may occur.
     148                         */
     149                        ptr = xlate_dev_mem_ptr(p);
     150                        if (!ptr)
     151                                return -EFAULT;
     152
     153                        remaining = copy_to_user(buf, ptr, sz);
     154
     155                        unxlate_dev_mem_ptr(p, ptr);
     156                }
     157
    142158                if (remaining)
    143159                        return -EFAULT;
     
    182198
    183199        while (count > 0) {
     200                int allowed;
     201
    184202                sz = size_inside_page(p, count);
    185203
    186                 if (!range_is_allowed(p >> PAGE_SHIFT, sz))
     204                allowed = page_is_allowed(p >> PAGE_SHIFT);
     205                if (!allowed)
    187206                        return -EPERM;
    188207
    189                 /*
    190                  * On ia64 if a page has been mapped somewhere as uncached, then
    191                  * it must also be accessed uncached by the kernel or data
    192                  * corruption may occur.
    193                  */
    194                 ptr = xlate_dev_mem_ptr(p);
    195                 if (!ptr) {
    196                         if (written)
    197                                 break;
    198                         return -EFAULT;
    199                 }
    200 
    201                 copied = copy_from_user(ptr, buf, sz);
    202                 unxlate_dev_mem_ptr(p, ptr);
    203                 if (copied) {
    204                         written += sz - copied;
    205                         if (written)
    206                                 break;
    207                         return -EFAULT;
     208                /* Skip actual writing when a page is marked as restricted. */
     209                if (allowed == 1) {
     210                        /*
     211                         * On ia64 if a page has been mapped somewhere as
     212                         * uncached, then it must also be accessed uncached
     213                         * by the kernel or data corruption may occur.
     214                         */
     215                        ptr = xlate_dev_mem_ptr(p);
     216                        if (!ptr) {
     217                                if (written)
     218                                        break;
     219                                return -EFAULT;
     220                        }
     221
     222                        copied = copy_from_user(ptr, buf, sz);
     223                        unxlate_dev_mem_ptr(p, ptr);
     224                        if (copied) {
     225                                written += sz - copied;
     226                                if (written)
     227                                        break;
     228                                return -EFAULT;
     229                        }
    208230                }
    209231
Note: See TracChangeset for help on using the changeset viewer.