powerpc/fsl_booke: Allocate separate TLBCAMs for readonly memory
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.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/8ca169bc288261a0e0558712f979023c3a960ebb.1634292136.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
52bda69ae8
commit
0b2859a743
|
@ -171,15 +171,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;
|
||||
|
|
Loading…
Reference in New Issue