1. 02 8月, 2016 2 次提交
    • P
      MIPS: Use CPHYSADDR to implement mips32 __pa · 0d8d83d0
      Paul Burton 提交于
      Use CPHYSADDR to implement the __pa macro converting from a virtual to a
      physical address for MIPS32, much as is already done for MIPS64 (though
      without the complication of having both compatibility & XKPHYS
      segments).
      
      This allows for __pa to work regardless of whether the address being
      translated is in kseg0 or kseg1, unlike the previous subtraction based
      approach which only worked for addresses in kseg0. Working for kseg1
      addresses is important if __pa is used on addresses allocated by
      dma_alloc_coherent, where on systems with non-coherent I/O we provide
      addresses in kseg1. If this address is then used with
      dma_map_single_attrs then it is provided to virt_to_page, which in turn
      calls virt_to_phys which is a wrapper around __pa. The result is that we
      end up with a physical address 0x20000000 bytes (ie. the size of kseg0)
      too high.
      
      In addition to providing consistency with MIPS64 & fixing the kseg1 case
      above this has the added bonus of generating smaller code for systems
      implementing MIPS32r2 & beyond, where a single ext instruction can
      extract the physical address rather than needing to load an immediate
      into a temp register & subtract it. This results in ~1.3KB savings for a
      boston_defconfig kernel adjusted to set CONFIG_32BIT=y.
      
      This patch does not change the EVA case, which may or may not have
      similar issues around handling both cached & uncached addresses but is
      beyond the scope of this patch.
      Signed-off-by: NPaul Burton <paul.burton@imgtec.com>
      Cc: Dan Williams <dan.j.williams@intel.com>
      Cc: linux-mips@linux-mips.org
      Cc: linux-kernel@vger.kernel.org
      Patchwork: https://patchwork.linux-mips.org/patch/13836/Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      0d8d83d0
    • P
      MIPS: non-exec stack & heap when non-exec PT_GNU_STACK is present · 1a770b85
      Paul Burton 提交于
      The stack and heap have both been executable by default on MIPS until
      now. This patch changes the default to be non-executable, but only for
      ELF binaries with a non-executable PT_GNU_STACK header present. This
      does apply to both the heap & the stack, despite the name PT_GNU_STACK,
      and this matches the behaviour of other architectures like ARM & x86.
      
      Current MIPS toolchains do not produce the PT_GNU_STACK header, which
      means that we can rely upon this patch not changing the behaviour of
      existing binaries. The new default will only take effect for newly
      compiled binaries once toolchains are updated to support PT_GNU_STACK,
      and since those binaries are newly compiled they can be compiled
      expecting the change in default behaviour. Again this matches the way in
      which the ARM & x86 architectures handled their implementations of
      non-executable memory.
      Signed-off-by: NPaul Burton <paul.burton@imgtec.com>
      Cc: Leonid Yegoshin <leonid.yegoshin@imgtec.com>
      Cc: Maciej Rozycki <maciej.rozycki@imgtec.com>
      Cc: Faraz Shahbazker <faraz.shahbazker@imgtec.com>
      Cc: Raghu Gandham <raghu.gandham@imgtec.com>
      Cc: Matthew Fortune <matthew.fortune@imgtec.com>
      Cc: linux-mips@linux-mips.org
      Patchwork: https://patchwork.linux-mips.org/patch/13765/Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      1a770b85
  2. 23 1月, 2016 1 次提交
  3. 16 11月, 2015 1 次提交
  4. 12 11月, 2015 1 次提交
    • D
      MIPS: Fix PAGE_MASK definition · 22b14523
      Dan Williams 提交于
      Make PAGE_MASK an unsigned long, like it is on x86, to avoid:
      
      In file included from arch/mips/kernel/asm-offsets.c:14:0:
      include/linux/mm.h: In function '__pfn_to_pfn_t':
      include/linux/mm.h:1050:2: warning: left shift count >= width of type
        pfn_t pfn_t = { .val = pfn | (flags & PFN_FLAGS_MASK), };
      
      ...where PFN_FLAGS_MASK is:
      
      #define PFN_FLAGS_MASK (~PAGE_MASK << (BITS_PER_LONG - PAGE_SHIFT))
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Cc: ross.zwisler@linux.intel.com
      Cc: hch@lst.de
      Cc: linux-mips@linux-mips.org
      Cc: linux-nvdimm@lists.01.org
      Cc: linux-kernel@vger.kernel.org
      Cc: linux-mm@kvack.org
      Patchwork: https://patchwork.linux-mips.org/patch/11280/Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      22b14523
  5. 02 4月, 2015 1 次提交
  6. 25 11月, 2014 1 次提交
  7. 26 8月, 2014 3 次提交
  8. 27 3月, 2014 1 次提交
  9. 23 1月, 2014 1 次提交
  10. 01 7月, 2013 1 次提交
  11. 19 5月, 2013 1 次提交
    • R
      MIPS: Rewrite pfn_valid to work in modules, too. · 8b923214
      Ralf Baechle 提交于
      This fixes:
      
        MODPOST 393 modules
      ERROR: "min_low_pfn" [arch/mips/kvm/kvm.ko] undefined!
      make[3]: *** [__modpost] Error 1
      
      It would have been possible to just export min_low_pfn but in the end
      pfn_valid should return 1 for any pfn argument for which a struct page
      exists so using min_low_pfn was wrong anyway.
      Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      8b923214
  12. 18 5月, 2013 1 次提交
    • D
      MIPS: Make virt_to_phys() work for all unmapped addresses. · 49c426ba
      David Daney 提交于
      As reported:
        This problem was discovered when doing BGP traffic with the TCP MD5 option
        activated, where the following call chain caused a crash:
      
         * tcp_v4_rcv
         *  tcp_v4_timewait_ack
         *   tcp_v4_send_ack -> follow stack variable rep.th
         *    tcp_v4_md5_hash_hdr
         *     tcp_md5_hash_header
         *      sg_init_one
         *       sg_set_buf
         *        virt_to_page
      
        I noticed that tcp_v4_send_reset uses a similar stack variable and
        also calls tcp_v4_md5_hash_hdr, so it has the same problem.
      
      The networking core can indirectly call virt_to_phys() on stack
      addresses, if this is done from PID 0, the stack will usually be in
      CKSEG0, so virt_to_phys() needs to work there as well
      Signed-off-by: NDavid Daney <david.daney@cavium.com>
      Cc: linux-mips@linux-mips.org
      Cc: Jiang Liu <liuj97@gmail.com>
      Cc: eunb.song@samsung.com
      Cc: linux-kernel@vger.kernel.org
      Patchwork: https://patchwork.linux-mips.org/patch/5220/Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      49c426ba
  13. 23 4月, 2013 1 次提交
    • R
      Revert "MIPS: page.h: Provide more readable definition for PAGE_MASK." · 3b5e50ed
      Ralf Baechle 提交于
      This reverts commit c17a6554.
      
      Manuel Lauss writes:
      
      lmo commit c17a6554 (MIPS: page.h: Provide more readable definition for
      PAGE_MASK) apparently breaks ioremap of 36-bit addresses on my Alchemy
      systems (PCI and PCMCIA) The reason is that in arch/mips/mm/ioremap.c
      line 157  (phys_addr &= PAGE_MASK) bits 32-35 are cut off.  Seems the
      new PAGE_MASK is explicitly 32bit, or one could make it signed instead
      of unsigned long.
      3b5e50ed
  14. 01 2月, 2013 1 次提交
  15. 29 12月, 2012 2 次提交
  16. 12 12月, 2012 2 次提交
  17. 21 2月, 2012 1 次提交
  18. 11 1月, 2012 1 次提交
  19. 05 10月, 2010 1 次提交
  20. 13 4月, 2010 1 次提交
    • F
      MIPS: make CAC_ADDR and UNCAC_ADDR account for PHYS_OFFSET · 86f7d75e
      Florian Fainelli 提交于
      On AR7, we already redefine PHYS_OFFSET to match the system specifities, it
      is however not sufficient when unsing dma_{map,unmap}_single, specifically
      in the ethernet driver, we must also adjust CAC_ADDR and UNCAC_ADDR for DMA
      to work correctly. This patch fixes the following issue, seen in cpmac_open:
      
      ops[#1]:
      Cpu 0
      $ 0   : 00000000 10008400 a0f5b120 00000000
      $ 4   : 94c59000 94270f64 00000020 00000010
      $ 8   : 00000010 94103ce0 0000000a 94c03400
      $12   : ffffffff 94c03408 94c03410 00000001
      $16   : a0f5ba20 00000041 94c592c0 94c59200
      $20   : 94c59000 000005ee 00002000 9438c8f0
      $24   : 00000010 00000000
      $28   : 94fac000 94fadd58 94390000 942724a8
      Hi    : 00000000
      Lo    : 00000001
      epc   : 94272518 cpmac_open+0x208/0x3f8
          Not tainted
      ra    : 942724a8 cpmac_open+0x198/0x3f8
      Status: 10008403    KERNEL EXL IE
      Cause : 3080000c
      BadVA : 00000000
      PrId  : 00018448 (MIPS 4KEc)
      Modules linked in:
      Process ifconfig (pid: 278, threadinfo=94fac000, task=94e79590, tls=00000000)
      Stack : 7f8da120 2ab05cb0 94c59000 943356f0 00000000 943d0000 94c59000 943356f0
              94c59030 943d0000 943c27c0 94fade10 00000000 94fade20 94c59000 9428e5a4
              00000000 94c59000 00000041 94289768 94c59000 00000041 00001002 00001043
              00000000 9428d810 00000000 94fade10 7f8da4e8 9428e6b8 00000000 7f8da4a8
              7f8da4e8 00008914 00000000 942f7f2c 00000000 00000008 00408000 00008913
              ...
      Call Trace:
      [<94272518>] cpmac_open+0x208/0x3f8
      [<9428e5a4>] dev_open+0x164/0x264
      [<9428d810>] dev_change_flags+0xd0/0x1bc
      [<942f7f2c>] devinet_ioctl+0x2d8/0x908
      [<942771f8>] sock_ioctl+0x29c/0x2fc
      [<941a0fb4>] vfs_ioctl+0x2c/0x7c
      [<941a16ec>] do_vfs_ioctl+0x5dc/0x630
      [<941a1790>] sys_ioctl+0x50/0x88
      [<94101e10>] stack_done+0x20/0x3c
      Signed-off-by: Npeter fuerst <post@pfrst.de>
      Signed-off-by: NFlorian Fainelli <florian@openwrt.org>
      To: linux-mips@linux-mips.org
      Patchwork: http://patchwork.linux-mips.org/patch/1050/Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      86f7d75e
  21. 27 2月, 2010 1 次提交
  22. 18 9月, 2009 1 次提交
  23. 18 8月, 2009 1 次提交
  24. 03 7月, 2009 1 次提交
  25. 17 6月, 2009 1 次提交
  26. 12 6月, 2009 1 次提交
  27. 14 5月, 2009 1 次提交
  28. 11 10月, 2008 1 次提交
  29. 25 7月, 2008 1 次提交
    • A
      PAGE_ALIGN(): correctly handle 64-bit values on 32-bit architectures · 27ac792c
      Andrea Righi 提交于
      On 32-bit architectures PAGE_ALIGN() truncates 64-bit values to the 32-bit
      boundary. For example:
      
      	u64 val = PAGE_ALIGN(size);
      
      always returns a value < 4GB even if size is greater than 4GB.
      
      The problem resides in PAGE_MASK definition (from include/asm-x86/page.h for
      example):
      
      #define PAGE_SHIFT      12
      #define PAGE_SIZE       (_AC(1,UL) << PAGE_SHIFT)
      #define PAGE_MASK       (~(PAGE_SIZE-1))
      ...
      #define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
      
      The "~" is performed on a 32-bit value, so everything in "and" with
      PAGE_MASK greater than 4GB will be truncated to the 32-bit boundary.
      Using the ALIGN() macro seems to be the right way, because it uses
      typeof(addr) for the mask.
      
      Also move the PAGE_ALIGN() definitions out of include/asm-*/page.h in
      include/linux/mm.h.
      
      See also lkml discussion: http://lkml.org/lkml/2008/6/11/237
      
      [akpm@linux-foundation.org: fix drivers/media/video/uvc/uvc_queue.c]
      [akpm@linux-foundation.org: fix v850]
      [akpm@linux-foundation.org: fix powerpc]
      [akpm@linux-foundation.org: fix arm]
      [akpm@linux-foundation.org: fix mips]
      [akpm@linux-foundation.org: fix drivers/media/video/pvrusb2/pvrusb2-dvb.c]
      [akpm@linux-foundation.org: fix drivers/mtd/maps/uclinux.c]
      [akpm@linux-foundation.org: fix powerpc]
      Signed-off-by: NAndrea Righi <righi.andrea@gmail.com>
      Cc: <linux-arch@vger.kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      27ac792c
  30. 20 7月, 2008 1 次提交
  31. 09 2月, 2008 1 次提交
    • M
      CONFIG_HIGHPTE vs. sub-page page tables. · 2f569afd
      Martin Schwidefsky 提交于
      Background: I've implemented 1K/2K page tables for s390.  These sub-page
      page tables are required to properly support the s390 virtualization
      instruction with KVM.  The SIE instruction requires that the page tables
      have 256 page table entries (pte) followed by 256 page status table entries
      (pgste).  The pgstes are only required if the process is using the SIE
      instruction.  The pgstes are updated by the hardware and by the hypervisor
      for a number of reasons, one of them is dirty and reference bit tracking.
      To avoid wasting memory the standard pte table allocation should return
      1K/2K (31/64 bit) and 2K/4K if the process is using SIE.
      
      Problem: Page size on s390 is 4K, page table size is 1K or 2K.  That means
      the s390 version for pte_alloc_one cannot return a pointer to a struct
      page.  Trouble is that with the CONFIG_HIGHPTE feature on x86 pte_alloc_one
      cannot return a pointer to a pte either, since that would require more than
      32 bit for the return value of pte_alloc_one (and the pte * would not be
      accessible since its not kmapped).
      
      Solution: The only solution I found to this dilemma is a new typedef: a
      pgtable_t.  For s390 pgtable_t will be a (pte *) - to be introduced with a
      later patch.  For everybody else it will be a (struct page *).  The
      additional problem with the initialization of the ptl lock and the
      NR_PAGETABLE accounting is solved with a constructor pgtable_page_ctor and
      a destructor pgtable_page_dtor.  The page table allocation and free
      functions need to call these two whenever a page table page is allocated or
      freed.  pmd_populate will get a pgtable_t instead of a struct page pointer.
       To get the pgtable_t back from a pmd entry that has been installed with
      pmd_populate a new function pmd_pgtable is added.  It replaces the pmd_page
      call in free_pte_range and apply_to_pte_range.
      Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
      Cc: <linux-arch@vger.kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      2f569afd
  32. 08 2月, 2008 1 次提交
  33. 12 10月, 2007 3 次提交