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

setup.c (4572B)


      1/*
      2 * Nios2-specific parts of system setup
      3 *
      4 * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch>
      5 * Copyright (C) 2004 Microtronix Datacom Ltd.
      6 * Copyright (C) 2001 Vic Phillips <vic@microtronix.com>
      7 *
      8 * This file is subject to the terms and conditions of the GNU General Public
      9 * License. See the file "COPYING" in the main directory of this archive
     10 * for more details.
     11 */
     12
     13#include <linux/export.h>
     14#include <linux/kernel.h>
     15#include <linux/mm.h>
     16#include <linux/sched.h>
     17#include <linux/sched/task.h>
     18#include <linux/console.h>
     19#include <linux/memblock.h>
     20#include <linux/initrd.h>
     21#include <linux/of_fdt.h>
     22#include <linux/screen_info.h>
     23
     24#include <asm/mmu_context.h>
     25#include <asm/sections.h>
     26#include <asm/setup.h>
     27#include <asm/cpuinfo.h>
     28
     29unsigned long memory_start;
     30EXPORT_SYMBOL(memory_start);
     31
     32unsigned long memory_end;
     33EXPORT_SYMBOL(memory_end);
     34
     35static struct pt_regs fake_regs = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     36					0, 0, 0, 0, 0, 0,
     37					0};
     38
     39#ifdef CONFIG_VT
     40struct screen_info screen_info;
     41#endif
     42
     43/* Copy a short hook instruction sequence to the exception address */
     44static inline void copy_exception_handler(unsigned int addr)
     45{
     46	unsigned int start = (unsigned int) exception_handler_hook;
     47	volatile unsigned int tmp = 0;
     48
     49	if (start == addr) {
     50		/* The CPU exception address already points to the handler. */
     51		return;
     52	}
     53
     54	__asm__ __volatile__ (
     55		"ldw	%2,0(%0)\n"
     56		"stw	%2,0(%1)\n"
     57		"ldw	%2,4(%0)\n"
     58		"stw	%2,4(%1)\n"
     59		"ldw	%2,8(%0)\n"
     60		"stw	%2,8(%1)\n"
     61		"flushd	0(%1)\n"
     62		"flushd	4(%1)\n"
     63		"flushd	8(%1)\n"
     64		"flushi %1\n"
     65		"addi	%1,%1,4\n"
     66		"flushi %1\n"
     67		"addi	%1,%1,4\n"
     68		"flushi %1\n"
     69		"flushp\n"
     70		: /* no output registers */
     71		: "r" (start), "r" (addr), "r" (tmp)
     72		: "memory"
     73	);
     74}
     75
     76/* Copy the fast TLB miss handler */
     77static inline void copy_fast_tlb_miss_handler(unsigned int addr)
     78{
     79	unsigned int start = (unsigned int) fast_handler;
     80	unsigned int end = (unsigned int) fast_handler_end;
     81	volatile unsigned int tmp = 0;
     82
     83	__asm__ __volatile__ (
     84		"1:\n"
     85		"	ldw	%3,0(%0)\n"
     86		"	stw	%3,0(%1)\n"
     87		"	flushd	0(%1)\n"
     88		"	flushi	%1\n"
     89		"	flushp\n"
     90		"	addi	%0,%0,4\n"
     91		"	addi	%1,%1,4\n"
     92		"	bne	%0,%2,1b\n"
     93		: /* no output registers */
     94		: "r" (start), "r" (addr), "r" (end), "r" (tmp)
     95		: "memory"
     96	);
     97}
     98
     99/*
    100 * save args passed from u-boot, called from head.S
    101 *
    102 * @r4: NIOS magic
    103 * @r5: initrd start
    104 * @r6: initrd end or fdt
    105 * @r7: kernel command line
    106 */
    107asmlinkage void __init nios2_boot_init(unsigned r4, unsigned r5, unsigned r6,
    108				       unsigned r7)
    109{
    110	unsigned dtb_passed = 0;
    111	char cmdline_passed[COMMAND_LINE_SIZE] __maybe_unused = { 0, };
    112
    113#if defined(CONFIG_NIOS2_PASS_CMDLINE)
    114	if (r4 == 0x534f494e) { /* r4 is magic NIOS */
    115#if defined(CONFIG_BLK_DEV_INITRD)
    116		if (r5) { /* initramfs */
    117			initrd_start = r5;
    118			initrd_end = r6;
    119		}
    120#endif /* CONFIG_BLK_DEV_INITRD */
    121		dtb_passed = r6;
    122
    123		if (r7)
    124			strlcpy(cmdline_passed, (char *)r7, COMMAND_LINE_SIZE);
    125	}
    126#endif
    127
    128	early_init_devtree((void *)dtb_passed);
    129
    130#ifndef CONFIG_CMDLINE_FORCE
    131	if (cmdline_passed[0])
    132		strlcpy(boot_command_line, cmdline_passed, COMMAND_LINE_SIZE);
    133#ifdef CONFIG_NIOS2_CMDLINE_IGNORE_DTB
    134	else
    135		strlcpy(boot_command_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
    136#endif
    137#endif
    138
    139	parse_early_param();
    140}
    141
    142static void __init find_limits(unsigned long *min, unsigned long *max_low,
    143			       unsigned long *max_high)
    144{
    145	*max_low = PFN_DOWN(memblock_get_current_limit());
    146	*min = PFN_UP(memblock_start_of_DRAM());
    147	*max_high = PFN_DOWN(memblock_end_of_DRAM());
    148}
    149
    150void __init setup_arch(char **cmdline_p)
    151{
    152	console_verbose();
    153
    154	memory_start = memblock_start_of_DRAM();
    155	memory_end = memblock_end_of_DRAM();
    156
    157	setup_initial_init_mm(_stext, _etext, _edata, _end);
    158	init_task.thread.kregs = &fake_regs;
    159
    160	/* Keep a copy of command line */
    161	*cmdline_p = boot_command_line;
    162
    163	find_limits(&min_low_pfn, &max_low_pfn, &max_pfn);
    164	max_mapnr = max_low_pfn;
    165
    166	memblock_reserve(__pa_symbol(_stext), _end - _stext);
    167#ifdef CONFIG_BLK_DEV_INITRD
    168	if (initrd_start) {
    169		memblock_reserve(virt_to_phys((void *)initrd_start),
    170				initrd_end - initrd_start);
    171	}
    172#endif /* CONFIG_BLK_DEV_INITRD */
    173
    174	early_init_fdt_reserve_self();
    175	early_init_fdt_scan_reserved_mem();
    176
    177	unflatten_and_copy_device_tree();
    178
    179	setup_cpuinfo();
    180
    181	copy_exception_handler(cpuinfo.exception_addr);
    182
    183	mmu_init();
    184
    185	copy_fast_tlb_miss_handler(cpuinfo.fast_tlb_miss_exc_addr);
    186
    187	/*
    188	 * Initialize MMU context handling here because data from cpuinfo is
    189	 * needed for this.
    190	 */
    191	mmu_context_init();
    192
    193	/*
    194	 * get kmalloc into gear
    195	 */
    196	paging_init();
    197}