cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

init_32.c (4506B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  PowerPC version
      4 *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
      5 *
      6 *  Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au)
      7 *  and Cort Dougan (PReP) (cort@cs.nmt.edu)
      8 *    Copyright (C) 1996 Paul Mackerras
      9 *  PPC44x/36-bit changes by Matt Porter (mporter@mvista.com)
     10 *
     11 *  Derived from "arch/i386/mm/init.c"
     12 *    Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
     13 */
     14
     15#include <linux/module.h>
     16#include <linux/sched.h>
     17#include <linux/kernel.h>
     18#include <linux/errno.h>
     19#include <linux/string.h>
     20#include <linux/types.h>
     21#include <linux/mm.h>
     22#include <linux/stddef.h>
     23#include <linux/init.h>
     24#include <linux/highmem.h>
     25#include <linux/initrd.h>
     26#include <linux/pagemap.h>
     27#include <linux/memblock.h>
     28#include <linux/gfp.h>
     29#include <linux/slab.h>
     30#include <linux/hugetlb.h>
     31
     32#include <asm/io.h>
     33#include <asm/mmu.h>
     34#include <asm/smp.h>
     35#include <asm/machdep.h>
     36#include <asm/btext.h>
     37#include <asm/tlb.h>
     38#include <asm/sections.h>
     39#include <asm/hugetlb.h>
     40#include <asm/kup.h>
     41#include <asm/kasan.h>
     42
     43#include <mm/mmu_decl.h>
     44
     45#if defined(CONFIG_KERNEL_START_BOOL) || defined(CONFIG_LOWMEM_SIZE_BOOL)
     46/* The amount of lowmem must be within 0xF0000000 - KERNELBASE. */
     47#if (CONFIG_LOWMEM_SIZE > (0xF0000000 - PAGE_OFFSET))
     48#error "You must adjust CONFIG_LOWMEM_SIZE or CONFIG_KERNEL_START"
     49#endif
     50#endif
     51#define MAX_LOW_MEM	CONFIG_LOWMEM_SIZE
     52
     53phys_addr_t total_memory;
     54phys_addr_t total_lowmem;
     55
     56#ifdef CONFIG_RELOCATABLE
     57/* Used in __va()/__pa() */
     58long long virt_phys_offset;
     59EXPORT_SYMBOL(virt_phys_offset);
     60#endif
     61
     62phys_addr_t lowmem_end_addr;
     63
     64int boot_mapsize;
     65#ifdef CONFIG_PPC_PMAC
     66unsigned long agp_special_page;
     67EXPORT_SYMBOL(agp_special_page);
     68#endif
     69
     70void MMU_init(void);
     71
     72/*
     73 * this tells the system to map all of ram with the segregs
     74 * (i.e. page tables) instead of the bats.
     75 * -- Cort
     76 */
     77int __map_without_bats;
     78int __map_without_ltlbs;
     79
     80/* max amount of low RAM to map in */
     81unsigned long __max_low_memory = MAX_LOW_MEM;
     82
     83/*
     84 * Check for command-line options that affect what MMU_init will do.
     85 */
     86static void __init MMU_setup(void)
     87{
     88	/* Check for nobats option (used in mapin_ram). */
     89	if (strstr(boot_command_line, "nobats")) {
     90		__map_without_bats = 1;
     91	}
     92
     93	if (strstr(boot_command_line, "noltlbs")) {
     94		__map_without_ltlbs = 1;
     95	}
     96	if (IS_ENABLED(CONFIG_PPC_8xx))
     97		return;
     98
     99	if (IS_ENABLED(CONFIG_KFENCE))
    100		__map_without_ltlbs = 1;
    101
    102	if (debug_pagealloc_enabled())
    103		__map_without_ltlbs = 1;
    104
    105	if (strict_kernel_rwx_enabled())
    106		__map_without_ltlbs = 1;
    107}
    108
    109/*
    110 * MMU_init sets up the basic memory mappings for the kernel,
    111 * including both RAM and possibly some I/O regions,
    112 * and sets up the page tables and the MMU hardware ready to go.
    113 */
    114void __init MMU_init(void)
    115{
    116	if (ppc_md.progress)
    117		ppc_md.progress("MMU:enter", 0x111);
    118
    119	/* parse args from command line */
    120	MMU_setup();
    121
    122	/*
    123	 * Reserve gigantic pages for hugetlb.  This MUST occur before
    124	 * lowmem_end_addr is initialized below.
    125	 */
    126	if (memblock.memory.cnt > 1) {
    127#ifndef CONFIG_WII
    128		memblock_enforce_memory_limit(memblock.memory.regions[0].size);
    129		pr_warn("Only using first contiguous memory region\n");
    130#else
    131		wii_memory_fixups();
    132#endif
    133	}
    134
    135	total_lowmem = total_memory = memblock_end_of_DRAM() - memstart_addr;
    136	lowmem_end_addr = memstart_addr + total_lowmem;
    137
    138#ifdef CONFIG_FSL_BOOKE
    139	/* Freescale Book-E parts expect lowmem to be mapped by fixed TLB
    140	 * entries, so we need to adjust lowmem to match the amount we can map
    141	 * in the fixed entries */
    142	adjust_total_lowmem();
    143#endif /* CONFIG_FSL_BOOKE */
    144
    145	if (total_lowmem > __max_low_memory) {
    146		total_lowmem = __max_low_memory;
    147		lowmem_end_addr = memstart_addr + total_lowmem;
    148#ifndef CONFIG_HIGHMEM
    149		total_memory = total_lowmem;
    150		memblock_enforce_memory_limit(total_lowmem);
    151#endif /* CONFIG_HIGHMEM */
    152	}
    153
    154	/* Initialize the MMU hardware */
    155	if (ppc_md.progress)
    156		ppc_md.progress("MMU:hw init", 0x300);
    157	MMU_init_hw();
    158
    159	/* Map in all of RAM starting at KERNELBASE */
    160	if (ppc_md.progress)
    161		ppc_md.progress("MMU:mapin", 0x301);
    162	mapin_ram();
    163
    164	/* Initialize early top-down ioremap allocator */
    165	ioremap_bot = IOREMAP_TOP;
    166
    167	if (ppc_md.progress)
    168		ppc_md.progress("MMU:exit", 0x211);
    169
    170	/* From now on, btext is no longer BAT mapped if it was at all */
    171#ifdef CONFIG_BOOTX_TEXT
    172	btext_unmap();
    173#endif
    174
    175	kasan_mmu_init();
    176
    177	setup_kup();
    178
    179	/* Shortly after that, the entire linear mapping will be available */
    180	memblock_set_current_limit(lowmem_end_addr);
    181}