{
        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;