Reorganise TLBCAM allocation so that when STRICT_KERNEL_RWX is
enabled, TLBCAMs are allocated such that readonly memory uses
different TLBCAMs.

This results in an allocation looking like:

Memory CAM mapping: 4/4/4/1/1/1/1/16/16/16/64/64/64/256/256 Mb, residual: 256Mb

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
v3: No change
v2: No change
---
 arch/powerpc/mm/nohash/fsl_book3e.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/mm/nohash/fsl_book3e.c 
b/arch/powerpc/mm/nohash/fsl_book3e.c
index 8ae1ba7985df..88132cab3442 100644
--- a/arch/powerpc/mm/nohash/fsl_book3e.c
+++ b/arch/powerpc/mm/nohash/fsl_book3e.c
@@ -172,15 +172,34 @@ static unsigned long map_mem_in_cams_addr(phys_addr_t 
phys, unsigned long virt,
 {
        int i;
        unsigned long amount_mapped = 0;
+       unsigned long boundary;
+
+       if (strict_kernel_rwx_enabled())
+               boundary = (unsigned long)(_sinittext - _stext);
+       else
+               boundary = ram;
 
        /* Calculate CAM values */
-       for (i = 0; ram && i < max_cam_idx; i++) {
+       for (i = 0; boundary && i < max_cam_idx; i++) {
+               unsigned long cam_sz;
+               pgprot_t prot = PAGE_KERNEL_X;
+
+               cam_sz = calc_cam_sz(boundary, virt, phys);
+               if (!dryrun)
+                       settlbcam(i, virt, phys, cam_sz, pgprot_val(prot), 0);
+
+               boundary -= cam_sz;
+               amount_mapped += cam_sz;
+               virt += cam_sz;
+               phys += cam_sz;
+       }
+       for (ram -= amount_mapped; ram && i < max_cam_idx; i++) {
                unsigned long cam_sz;
+               pgprot_t prot = PAGE_KERNEL_X;
 
                cam_sz = calc_cam_sz(ram, virt, phys);
                if (!dryrun)
-                       settlbcam(i, virt, phys, cam_sz,
-                                 pgprot_val(PAGE_KERNEL_X), 0);
+                       settlbcam(i, virt, phys, cam_sz, pgprot_val(prot), 0);
 
                ram -= cam_sz;
                amount_mapped += cam_sz;
-- 
2.31.1

Reply via email to