Commit 0b2859a7 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

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: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/8ca169bc288261a0e0558712f979023c3a960ebb.1634292136.git.christophe.leroy@csgroup.eu
parent 52bda69a
Loading
Loading
Loading
Loading
+22 −3
Original line number Diff line number Diff line
@@ -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;